質問
スロットにボタン信号を接続することで、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
コードは正しいようで、コンパイラ警告はありません。実行時にこの出力だけです。しかし、私は信号とスロットを正しく接続したようです。
解決
追加 Q_OBJECT
このようにあなたのクラスに:
class MainWidget : public QWidget { Q_OBJECT
また、ヘルパーコードを生成するにはMOCも実行する必要があります。 Qmakeはあなたのために自動的にそれを行いますが、これを自分でコンパイルする場合は、MOCを実行する必要があります。
他のヒント
QTを始めたとき、私はこの問題をたくさん抱えていました。私が見ると、あなたのスロットは間違って定義されています。信号の署名を見ると(QTは信号ドキュメントをクリックしました)、あなたは引数リストがbool clicked = false)
.
QTの信号とスロットが実行時に動作する方法は、まったく同じ署名がある場合にのみ信号とスロットを接続することです。それらが正確に一致しない場合、接続はありません。
したがって、mainwidget.hで
public slots:
void bAdvice_clicked(bool);
mainwidget.cppで
connect(bAdvice, SIGNAL(clicked(bool)), this, SLOT(bAdvice_clicked(bool)));
物事はあなたのために働き始めます。
編集:
コードをコンパイルし、すべてのスロットが正しく呼び出されました。欠落していたのはQ_Objectマクロだけでした。
所属していません StackOverflow