Pregunta

Tengo dificultades en mi programa de Qt con la conexión de señales de las teclas 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 el siguiente resultado:

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, no hay advertencias del compilador derecha. Sólo esta salida en tiempo de ejecución. Pero parece que me he enganchado correctamente las señales y las ranuras hacia arriba.

¿Fue útil?

Solución

Añadir Q_OBJECT a su clase, como esto:

class MainWidget : public QWidget
{
    Q_OBJECT

También tiene que ejecutar moc para generar un código auxiliar. qmake lo hacen automáticamente para su, pero si compila esto por sí mismo, lo que necesita para funcionar moc.

Otros consejos

Cuando empecé con Qt, que tenía este problema mucho. Tal como lo veo sus ranuras se definen mal. Si nos fijamos en la firma de la señal ( Qt Seguido de señal Docs ), se verá que la lista de argumentos es (bool clicked = false).

señal y ranuras La forma de Qt trabajos de conexión en tiempo de ejecución, es que sólo se conectará la señal y la ranura si tienen exactamente los mismos firmas. Si no coinciden exactamente, no hay conexión.

Así 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 trabajar para usted.

Editado:

Compilado su código y todas las ranuras se llama correctamente. Era sólo la macro Q_OBJECT que faltaba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top