这个问题非常肯定会重复,但在进行研究并查看相同的问题后,我发现需要使用宏Q_OBJECT
进行SLOT
使用,但是当我使用它时得到了编译错误。这是我的代码片段。
的main.cpp
#include <QApplication>
#include "window_general.h"
int main(int argc, char **argv)
{
QApplication app (argc, argv);
Window_General window_general;
window_general.show();
return app.exec();
}
windows_general.h
#ifndef WINDOW_GENERAL_H
#define WINDOW_GENERAL_H
#include <QWidget>
#include <QApplication>
class QPushButton;
class Window_General : public QWidget
{
public:
explicit Window_General(QWidget *parent = 0);
private slots:
void MyhandleButton();
private:
QPushButton *m_button;
};
#endif // WINDOW_GENERAL_H
windows_general.cpp
#include "window_general.h"
#include <QPushButton>
Window_General::Window_General(QWidget *parent) :
QWidget(parent)
{
// Set size of the window
setFixedSize(800, 500);
// Create and position the button
m_button = new QPushButton("Hello World", this);
m_button->setGeometry(10, 10, 80, 30);
connect(m_button, SIGNAL (released()), this, SLOT (MyhandleButton()));
}
void Window_General::MyhandleButton()
{
m_button->setText("Example");
m_button->resize(100,100);
}
在这段代码中,我遇到了运行时错误:
QObject::connect
:没有这样的广告位QWidget::MyhandleButton()
../ PRJ / window_general.cpp:14
如果我在此处放置Q_OBJECT
宏,
class Window_General : public QWidget
{
Q_OBJECT
public:
explicit Window_General(QWidget *parent = 0);
private slots:
void MyhandleButton();
private:
QPushButton *m_button;
};
然后我有这个错误:
D:\ work \ my_qt \ prj \ window_general.h:8:错误:未定义引用
的vtable
Window_General
我的问题是,如何在此代码集中使用按钮事件?
答案 0 :(得分:3)
您似乎需要调用qmake utility来重新生成moc。 Q_OBJECT
将一些QObject的重写成员函数声明放到您的类中,qmake将它们的定义生成到yourclass.moc.cpp。每次发布新Q_OBJECT
时,都需要调用qmake。
答案 1 :(得分:2)
通过使用指向成员函数的指针语法而不是Q_OBJECT
和SIGNAL
宏,可以完全避免使用SLOT
宏。例如:
connect(m_button, &QPushButton::released, this, &Window_General::MyhandleButton);