在main.cpp中定义信号和插槽

Define signals and slots inside main.cpp

本文关键字:信号 插槽 定义 main cpp      更新时间:2023-10-16

我在main.cpp中用自己的类编写了一个小程序

#include <QApplication>
#include <QPushButton>
#include <QLabel>
class MyWidget : public QWidget {
    //Q_OBJECT
public:
    MyWidget(QWidget* parent = 0);
    QLabel* label;
    QString string;
signals:
public slots:
    void setTextLabel();
};
void MyWidget::setTextLabel() {
    label->setText("Test");
}

MyWidget::MyWidget(QWidget* parent) 
     : QWidget(parent) {
}
int main(int argc, char** argv) {
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}

这似乎有效,但并非"完全"。我的老虎机坏了。我想我必须把Q_OBJECT。但是,这样做,我得到了一个错误列表,如下所示:

undefined reference to `vtable for MyWidget'
........................................
collect2: error: ld returned 1 exit status
make: *** [mywidget] Error 1

我能搞定吗?问题出在哪里?

Qt中的信号和插槽通过moc:meta对象编译器进行管理。基本上,moc为包含Q_OBJECT宏的每个类生成额外的C++代码,以便有效地实现信号和时隙机制。然后将附加代码链接到原始类声明。

这里的问题是你的类是在main.cpp中声明的:这与moc如何处理你的代码相冲突。您应该在单独的头中声明您的类。

更多关于moc 的信息

编辑:正如hyde所指出的,另一种选择是在cpp中包含moc生成的文件:为什么在Qt源代码文件的末尾包含".moc"文件很重要?

只需将行#include"main.moc"附加到cpp源文件就足够了。

更多信息:

  • 为什么重要的是包括";。moc";Qt源代码文件末尾的文件