Seite 1 von 1

[gelöst] Slot-Problem

Verfasst: 23. November 2007 15:54
von kleineSchildy
Hallo,

ich komm einfach nicht dahinter, warum der Slot nicht ausgeführt wird :?

Ich habe mein MainWindow in welche ich ein Child erzeuge

Code: Alles auswählen

void MyMainWindow::openChild()
{
    //Session erstellen 
    session = new MyChild("Simulation Modules");
    session->createSessionWidget();
    
    //Session anzeigen
    mdiArea->addSubWindow(session);
 	
   //Connections
   connect(session->rbProcess, SIGNAL(triggered()), session, SLOT(openModul()));
    
   session->show();	
}
Das Child sieht folgermaßen aus:

Code: Alles auswählen

MyChild::MyChild(QString sTitle)
{
    setAttribute(Qt::WA_DeleteOnClose);
    setWindowTitle(sTitle);
}

void MyChild::createSessionWidget()
{
    //GroupBox festlegen
    QGroupBox *gbSource = new QGroupBox(tr("Source"));
    QRadioButton *rbTophat = new QRadioButton(tr("Tophat"));
    QRadioButton *rbProcess = new QRadioButton(tr("Processed Measured"));
    QRadioButton *rbSynthes = new QRadioButton(tr("Synthesized Physical"));
    
	QVBoxLayout *blSource = new QVBoxLayout;
    blSource->addWidget(rbTophat);
    blSource->addWidget(rbProcess);
    blSource->addWidget(rbSynthes);
    gbSource->setLayout(blSource);
    
    QGridLayout *grid = new QGridLayout;
    grid->addWidget(gbSource,0,0);
    grid->setSizeConstraint(QLayout::SetMinimumSize);
    
    this->setLayout(grid);
}

void MyChild::openModul()
{
 	 QMessageBox::information(this, "Test", "Test");    	 
}
Wobei die Buttons und auch der Slot "public" sind.

Die Frage ist jetzt, wo liegt der Fehler, dass meine MessageBox nicht angezeigt wird :( Es ist bestimmt ein dummer Fehler, aber ich weiß nicht, was ich ändern sollte.

Vielen Dank für eure Hilfe.

Viele Grüße
Jana

Verfasst: 23. November 2007 19:12
von upsala
Auf der Konsole gibt es auch keine Fehlermeldung?

Verfasst: 25. November 2007 17:05
von Christian81
upsala hat geschrieben:Auf der Konsole gibt es auch keine Fehlermeldung?
Doch, hundertprzentig. QPushButton hat kein SIGNAL triggered() ...

Verfasst: 25. November 2007 18:17
von upsala
Das war eine rein rhetorische Frage...

Verfasst: 25. November 2007 18:22
von rage
Hast du qmake ausgeführt, nachdem du den Slot hinzugefügt hattest?

Verfasst: 30. November 2007 10:10
von kleineSchildy
Hallo alle zusammen,

@Christian
Das habe ich auch schon gefunden, in "clicked() geändert. Am Ergebnis ändert es leider nix.

Ich arbeite mit Dev-C++ und da wird mir leider kein Fehler ausgegeben. Auf der Konsole erscheint bloß der Hinweis:
Der Befehl "mingw32-make" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Ich weiß nicht, was das Problem ist. Der Slot vom Child ist public. Also sollte er vom MainWindow doch ausführbar sein.

@rage
Wie meinst du das? Die moc-Dateien werden erstellt, also wird wohl qmake ausgeführt worden sein. Mit anderen Connections, wie zum Beispiel in einer Action, habe ich ja auch keine Probleme.

Viele Grüße
Jana

Verfasst: 30. November 2007 10:17
von Christian81
Ggf. Header-Dateien nicht im pro-File. Oder Q_OBJECT vergessen oder mal die console anschauen (CONFIG += console) und während der Laufzeit schauen was passiert.

Wenn er mingw32-make nicht findet wird es wohl nicht im PATH sein... :roll:

Im Grunde alles Problemlösungen die hier schon hunderte Male angeraten wurden, aber die Suche bedienen ist wohl zu schwer... :(

Verfasst: 30. November 2007 10:32
von kleineSchildy
Hallo Christian,

sorry, aber ich habe schon die Hilfe bemüht und leider nix gefunden.

Q_OBJECT wurde nicht vergessen und das pro-File habe ich mir auch schon angeschaut und da ist alles drin.

Das einzige was die Konsole ausspuckt ist
QObject::connect: Cannot connect (null)::clicked() to MyChild::openModul()
Er scheint das Objekt nicht zu kennen, aber die RadioButtons im Child sind auch public.

Viele Grüße
Jana

Verfasst: 30. November 2007 11:15
von gerome69
kleineSchildy hat geschrieben: Das einzige was die Konsole ausspuckt ist
QObject::connect: Cannot connect (null)::clicked() to MyChild::openModul()
Da steht doch eine ganze Menge Konkretes.

Schau mal hier:

Code: Alles auswählen

   connect(session->rbProcess, SIGNAL(triggered()), session, SLOT(openModul()));
   
[...]

void MyChild::createSessionWidget()
{
[...]
    QRadioButton *rbProcess = new QRadioButton(tr("Processed Measured")); 

Das connect schlägt fehl, weil es der Sender nicht existiert.
Warum?
Du definierst ihn als QRadioButton innerhalb von createSessionWidget als lokale Variable, die nach verlassen dieser Methode wieder freigegeben wird.
Hast du im Header MyChild.h rbProcess auch definiert als public? Scheinbar ja.
Dann muß es in createSessionWidget aber heißen:

rbProcess = new QRadioButton(tr("Processed Measured"));

Gruß, Géôme


Hast du ihn

Verfasst: 30. November 2007 12:12
von kleineSchildy
Hallo Gerome,

vielen Dank, das wars. So ein dummer Fehler :oops:

Viele Grüße
Jana