2010-09-05 3 views
7

Je rencontre des difficultés dans mon programme Qt en connectant des signaux de bouton à mes slots. Mon code est:Le signal Qt Q + et le slot ne s'allument pas

Main.cpp

#include <QtGui/QApplication> 
#include "MainWidget.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    MainWidget mainWidget; 
    mainWidget.show(); 

    return app.exec(); 
} 

MainWidget.h

#ifndef MAINWIDGET_H 
#define MAINWIDGET_H 

#include <QWidget> 

class MainWidget : public QWidget 
{ 
public: 
    MainWidget(); 

public slots: 
    void bAdvice_clicked(); 
    void bWeather_clicked(); 
    void bNextMeeting_clicked(); 
    void bQuit_clicked(); 
}; 

#endif // MAINWIDGET_H 

MainWidget.cpp

#include "MainWidget.h" 
#include <QMessageBox> 
#include <QPushButton> 
#include <QTextEdit> 
#include <QVBoxLayout> 

MainWidget::MainWidget() 
{ 
    QLayout *layout = new QVBoxLayout(); 
    this->setLayout(layout); 

    QTextEdit *message = new QTextEdit(); 
    layout->addWidget(message); 

    QPushButton *bAdvice = new QPushButton("Advice"); 
    connect(bAdvice, SIGNAL(clicked()), this, SLOT(bAdvice_clicked())); 
    layout->addWidget(bAdvice); 

    QPushButton *bWeather = new QPushButton("Weather"); 
    connect(bWeather, SIGNAL(clicked()), this, SLOT(bWeather_clicked())); 
    layout->addWidget(bWeather); 

    QPushButton *bNextMeeting = new QPushButton("Next Meeting"); 
    connect(bNextMeeting, SIGNAL(clicked()), this, SLOT(bNextMeeting_clicked())); 
    layout->addWidget(bNextMeeting); 

    QPushButton *bQuit = new QPushButton("Quit"); 
    connect(bQuit, SIGNAL(clicked()), this, SLOT(bQuit_clicked())); 
    layout->addWidget(bQuit); 
} 

void MainWidget::bAdvice_clicked() 
{ 
} 

void MainWidget::bWeather_clicked() 
{ 
} 

void MainWidget::bNextMeeting_clicked() 
{ 
    QMessageBox::information(this, "Next Meeting", "Today", QMessageBox::Ok); 
} 

void MainWidget::bQuit_clicked() 
{ 
    this->close(); 
} 

Le programme produit les éléments suivants:

Starting C:\Users\Sameer\Documents\PartAQuestion2\debug\PartAQuestion2.exe... 
Object::connect: No such slot QWidget::bAdvice_clicked() in MainWidget.cpp:16 
Object::connect: No such slot QWidget::bWeather_clicked() in MainWidget.cpp:20 
Object::connect: No such slot QWidget::bNextMeeting_clicked() in MainWidget.cpp:24 
Object::connect: No such slot QWidget::bQuit_clicked() in MainWidget.cpp:28 

C:\Users\Sameer\Documents\PartAQuestion2\debug\PartAQuestion2.exe exited with code 0 

Le code semble correct, pas d'avertissement du compilateur. Juste cette sortie à l'exécution. Mais il semble que j'ai accroché les signaux et les fentes correctement.

Répondre

13

Ajouter Q_OBJECT à votre classe, comme ceci:

class MainWidget : public QWidget 
{ 
    Q_OBJECT 

Vous devez également exécuter moc pour générer un code d'aide. qmake le fait automatiquement pour vous, mais si vous le compilez vous-même, vous devez lancer moc.

+0

Merci pour la réponse rapide. Mais pouvez-vous s'il vous plaît être plus précis que je suis très nouveau à cela. J'ai changé mon code pour ajouter Q_OBJECT immédiatement après les accolades ouvertes. Toujours le même résultat. J'utilise Qt Creator IDE. – c0d3L0g1c

+0

Que se passe-t-il après l'ajout de Q_OBJECT? Comment compilez-vous votre code? –

+0

J'ai changé mon code pour ajouter Q_OBJECT immédiatement après les accolades ouvertes. Toujours le même résultat. J'utilise Qt Creator IDE. – c0d3L0g1c

2

Modifié:

Compilé votre code et tous les emplacements ont été appelés correctement. C'était juste la macro Q_OBJECT qui manquait.

+0

J'ai accordé des points à Uli Schlachter, car il m'a dirigé dans la bonne direction. Merci à tous pour votre contribution! – c0d3L0g1c

3

Quand j'ai commencé avec Qt, j'ai eu beaucoup de problèmes. Comme je le vois vos fentes sont mal définies. Si vous regardez la signature du signal (Qt Clicked Signal Docs), vous verrez que la liste des arguments est (bool clicked = false).

La manière de signal & slots de Qt relient le travail à temps d'exécution, est qu'il se connectera uniquement le signal et la fente si elles ont les mêmes signatures exactes. Si elles ne correspondent pas exactement, pas de connexion.

donc dans MainWidget.h

public slots: 
     void bAdvice_clicked(bool); 

dans MainWidget.cpp

connect(bAdvice, SIGNAL(clicked(bool)), this, SLOT(bAdvice_clicked(bool))); 

Les choses vont commencer à travailler pour vous.

+0

mais je comprends que cela fonctionne pour ** QPushButton ** sans le paramètre de type bool – Tracy

Questions connexes