tutorial signal custom and c++ qt qt-signals

c++ - custom - qt signals and slots tutorial



SeƱal C++ Qt y ranura no disparando (3)

Agrega Q_OBJECT a tu clase, así:

class MainWidget : public QWidget { Q_OBJECT

También debe ejecutar moc para generar algún código auxiliar. qmake hace eso automáticamente para ti, pero si compilas esto tú mismo, necesitas ejecutar moc.

Estoy teniendo dificultades en mi programa Qt con la conexión de señales de botón a mis ranuras. Mi código es:

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

El programa da como resultado lo siguiente:

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

El código parece correcto, no hay advertencias del compilador. Solo esta salida en tiempo de ejecución. Pero parece que enganché las señales y las ranuras correctamente.


Cuando comencé con Qt, tuve este problema mucho. Como yo lo veo, tus máquinas tragamonedas están mal definidas. Si observa la firma de la señal ( Qt Clicked Signal Docs ), verá que la lista de argumentos es ( bool clicked = false) .

La forma en que las señales y ranuras de Qt se conectan en el tiempo de ejecución es que solo conectará la señal y la ranura si tienen exactamente las mismas firmas. Si no coinciden exactamente, no hay conexión.

entonces en MainWidget.h

public slots: void bAdvice_clicked(bool);

En MainWidget.cpp

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

Las cosas comenzarán a funcionar para ti.


Editado:

Compiló su código y todas las ranuras fueron llamadas correctamente. Era solo la macro Q_OBJECT que faltaba.