Seite 1 von 1

[gelöst] prüfen, ob widget existiert

Verfasst: 26. November 2007 22:38
von Linuxguru
hallo,

kann ich rausfinden, ob ein widget existiert?

ich brauch das für ein textedit. ich darf erst auf die signale zugreifen können, wenn das objekt existiert.

etwa so

Code: Alles auswählen

	if( edit->exists() )
	{
             connect( edit->document(), SIGNAL(contentsChange(int,int,int)), this, SLOT(textChanged(int,int,int)) );
	     connect( edit, SIGNAL(cursorPositionChanged()), this, SLOT(sliderPosition1()) );
	     connect( edit->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(sliderPosition(int)) );
        }
Danke

Verfasst: 26. November 2007 22:42
von Burgpflanze
Eventuell

Code: Alles auswählen

if (edit)
{
   ...
}

Verfasst: 26. November 2007 22:52
von Linuxguru
danke für deine antwort.

leider kann ich edit nicht abfragen, wenn es nicht existiert. da bekomm ich ein speicherzugriffsfehler. gibt es noch eine andere möglichkeit?

danke

Verfasst: 26. November 2007 23:05
von dhcase
dann hat du edit nicht mit 0 initialisiert...

Verfasst: 26. November 2007 23:44
von Linuxguru
hallo,

mein kopf der main loop sieht so aus

Code: Alles auswählen

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent), edit(0), ftp(0)
{
	if( edit !=0 )
	{
		connect( edit->document(), SIGNAL(contentsChange(int,int,int)), this, SLOT(textChanged(int,int,int)) );
		connect( edit, SIGNAL(cursorPositionChanged()), this, SLOT(sliderPosition1()) );
		connect( edit->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(sliderPosition(int)) );
	}
}
in meiner fileNew() funktion weiter unten wird dann mein qtextedit mit

Code: Alles auswählen

    edit= new QTextEdit;
erstellt und in ein layout hinzugefügt, was ein tabwidget enthält.

kann mir jemand weiterhelfen?

Verfasst: 27. November 2007 08:05
von Korgen
Linuxguru hat geschrieben: mein kopf der main loop sieht so aus
Was meinst du mit main loop, das ist doch eher ein Konstruktor der Klasse MyWidget?

Code: Alles auswählen

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent), edit(0), ftp(0)
{
	if( edit !=0 )
	{
		connect( edit->document(), SIGNAL(contentsChange(int,int,int)), this, SLOT(textChanged(int,int,int)) );
		connect( edit, SIGNAL(cursorPositionChanged()), this, SLOT(sliderPosition1()) );
		connect( edit->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(sliderPosition(int)) );
	}
}
Nach dem Aufruf des Konstruktors, wird edit immer 0 sein, da du es ja in der Initialisierungsliste auf 0 setzt.

in meiner fileNew() funktion weiter unten wird dann mein qtextedit mit

Code: Alles auswählen

    edit= new QTextEdit;
Wenn du edit hier neu anlegst, bringt das für deine Signals und Slots nichts, da der Konstruktor(s.o.) ja schon längst durchlaufen ist und somit auch das connect nicht mehr ausgeführt wird.


Vorschlag:

eine Methode void connectSignalsAndSlots(), die folgerdermaßen aussieht:

Code: Alles auswählen

void MyWidget::connectSignalsAndSlots()
{
if ( edit )
     {
      //CONNECTS
     }
}
diese Methode dann einfach nach der Erzeugung von edit aufrufen.

Grüße

Verfasst: 29. November 2007 22:47
von Linuxguru
hallo korgen,

deine lösungsansatz konnte ich leider nicht verwenden, das ja dann die slots nur aufgerufen werden, wenn die funktion ausgeführt wird.

hab aber jetzt im forum eine qtextedit klasse gefunden, was die zeilennummern per painterevent zeichnet.

danke allen für die hilfe