2010-09-05 19 views
7

Tengo dificultades en mi programa de Qt con las señales de los botones de conexión en mis ranuras. Mi código es:C++ Señal de Qt y ranura que no se activa

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 muestra la siguiente información:

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, sin advertencias del compilador. Solo esta salida en tiempo de ejecución. Pero parece que enganché las señales y las ranuras correctamente.

Respuesta

13

Añadir Q_OBJECT a su clase, así:

class MainWidget : public QWidget 
{ 
    Q_OBJECT 

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

+0

Gracias por la respuesta rápida. Pero puede ser más específico ya que soy muy nuevo en esto. He cambiado mi código para agregar Q_OBJECT inmediatamente después de abrir llaves. Aún el mismo resultado. Estoy usando Qt Creator IDE. – c0d3L0g1c

+0

¿Qué sucede después de agregar Q_OBJECT? ¿Cómo estás compilando tu código? –

+0

He cambiado mi código para agregar Q_OBJECT inmediatamente después de abrir llaves. Aún el mismo resultado. Estoy usando Qt Creator IDE. – c0d3L0g1c

2

Editado:

compilado su código y todas las ranuras fueron llamados correctamente. Solo faltaba la macro Q_OBJECT.

+0

Le he otorgado puntos a Uli Schlachter, ya que me indicó la dirección correcta. ¡Gracias a todos por contribuir! – c0d3L0g1c

3

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

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

por lo que 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 usted.

+0

pero obtengo que funciona para ** QPushButton ** sin el parámetro de tipo bool – Tracy

Cuestiones relacionadas