为什么不能在main.cpp中编写QWidget类?

时间:2018-04-11 09:01:35

标签: c++ qt

更新

如果我删除了Q_OBJECT,并且我没有使用SLOT SINGAL,请使用connect(),如下所示:

connect(this, &QWidget::destroyed, this, &QWidget::myslot)

我的代码运行良好,没有任何警告和错误。

我想编写一些代码来指导某些类,所以我尝试简化代码。但我遇到了一些奇怪的事情。我不能在 main.cpp 中写一个简单的widget。如果我在mywidget.cppmywidget.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();
}

错误信息是:
error information

3 个答案:

答案 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上测试它