2010-09-05 5 views
7

У меня возникают трудности с моей программой Qt с подключением кнопок к моим слотам. Мой код:C++ Сигнал Qt и слот не срабатывают

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(); 
} 

Программа выводит следующее:

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 

Код кажется правильным, никаких предупреждений компилятора. Только этот вывод во время выполнения. Но похоже, что я правильно подключил сигналы и слоты.

ответ

13

Добавить Q_OBJECT в класс, как это:

class MainWidget : public QWidget 
{ 
    Q_OBJECT 

Вы также должны запустить MOC, чтобы сгенерировать вспомогательный код. qmake делает это автоматически для вашего, но если вы его скомпилируете самостоятельно, вам нужно запустить moc.

+0

Спасибо за быстрый ответ. Но не могли бы вы быть более конкретными, поскольку я очень новичок в этом. Я изменил свой код, чтобы добавить Q_OBJECT сразу после открытых фигурных скобок. Все тот же результат. Я использую Qt Creator IDE. – c0d3L0g1c

+0

Что происходит после добавления Q_OBJECT? Как вы компилируете свой код? –

+0

Я изменил свой код, чтобы добавить Q_OBJECT сразу после открытых фигурных скобок. Все тот же результат. Я использую Qt Creator IDE. – c0d3L0g1c

2

Отредактировано:

Составитель код и все слоты были правильно называются. Это был просто макрос Q_OBJECT, который отсутствовал.

+0

Я назначил очки Ули Шлахтеру, так как он указал мне в правильном направлении. Спасибо всем за вклад! – c0d3L0g1c

3

Когда я начал с Qt, у меня была эта проблема. Как я вижу, ваши слоты определены неправильно. Если вы посмотрите на подпись для сигнала (Qt Clicked Signal Docs), вы увидите, что список аргументов (bool clicked = false).

То, как сигнал & слотов Qt соединяют работу во время выполнения, является то, что он будет подключаться только сигнал и слот если они имеют ту же подпись. Если они не совпадают точно, никакой связи.

так в MainWidget.h

public slots: 
     void bAdvice_clicked(bool); 

в MainWidget.cpp

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

Вещи начнут работать для вас.

+0

, но я понимаю, что работает для ** QPushButton ** без параметра типа bool – Tracy

Смежные вопросы