更新
如果我删除了Q_OBJECT
,并且我没有使用SLOT
SINGAL
,请使用connect()
,如下所示:
connect(this, &QWidget::destroyed, this, &QWidget::myslot)
,
我的代码运行良好,没有任何警告和错误。
我想编写一些代码来指导某些类,所以我尝试简化代码。但我遇到了一些奇怪的事情。我不能在 main.cpp 中写一个简单的widget
。如果我在mywidget.cpp
和mywidget.h
中编写小部件,程序运行良好。如果我想在main.cpp
中编写小部件,我该怎么办?
这是我的代码。
#include <QApplication>
#include <QWidget>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
};
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
}
Widget::~Widget()
{
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
答案 0 :(得分:2)
将以下行添加到main.cpp的末尾并重新运行qmake
:
#include "main.moc"
这会为你的main.cpp调用moc
工具。它会为您的Widget
类生成元对象函数定义,以便在重建时解决链接器错误。
答案 1 :(得分:2)
如documentation中所述:
每当运行qmake时,它都会解析项目的头文件和 生成make规则以调用包含a的文件的moc Q_OBJECT宏。
因此,将类声明放在头文件(例如widget.h)中,将类定义放在具有相同名称的源文件中(例如widget.cpp)。
答案 2 :(得分:1)
如果您仍希望使用信号,则可以移除Q_OBJECT
宏并使用QObject::connect()
例如:
#include <QApplication>
#include <QWidget>
#include <iostream>
class Widget : public QWidget
{
//Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
};
Widget::Widget(QWidget *parent) : QWidget(parent)
{
// say bey
QObject::connect(this,&Widget::destroyed,
[](){std::cout<<"bye"<<std::endl;});
}
Widget::~Widget()
{
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
我在Qt5.9.4上测试它