10

Qt プログラムでボタン信号をスロットに接続するのに問題があります。私のコードは次のとおりです。

メイン.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

コードは正しいようで、コンパイラの警告はありません。実行時にこの出力のみ。しかし、信号とスロットを正しく接続したようです。

4

3 に答える 3

16

次のようにクラスに追加Q_OBJECTします。

クラス MainWidget : public QWidget
{
    Q_OBJECT

また、いくつかのヘルパー コードを生成するために moc を実行する必要があります。qmake は自動的にそれを行いますが、これを自分でコンパイルする場合は、moc を実行する必要があります。

于 2010-09-05T11:33:50.100 に答える
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)));

物事はあなたのために働き始めます。

于 2010-09-05T21:57:26.993 に答える
2

編集:

コードをコンパイルすると、すべてのスロットが正しく呼び出されました。欠けていたのは Q_OBJECT マクロだけでした。

于 2010-09-05T12:27:39.603 に答える