在 main.cpp 中定义信号和槽

Posted

技术标签:

【中文标题】在 main.cpp 中定义信号和槽【英文标题】:Define signals and slots inside main.cpp 【发布时间】:2016-07-21 16:50:22 【问题描述】:

我在 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

我能做到吗?问题出在哪里?

【问题讨论】:

您能解释一下“我的插槽不起作用”是什么意思吗?在上面的示例中,MyWidget::setTextLabel 插槽实际上并未被使用。另请注意,您的 MyWidget 构造函数不会初始化 label 成员,这将导致未定义的行为。 看这个:***.com/questions/34928933/… 【参考方案1】:

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

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

More about the moc

编辑:正如 hyde 所指出的,另一种方法是在您的 cpp 中包含 moc 生成的文件:Why is important to include “.moc” file at end of a Qt Source code file?

【讨论】:

没必要,你不需要 .h 文件。请参阅问题下方的链接(并随时更新您的答案)。【参考方案2】:

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

更多信息:

Why is important to include ".moc" file at end of a Qt Source code file?

【讨论】:

以上是关于在 main.cpp 中定义信号和槽的主要内容,如果未能解决你的问题,请参考以下文章

qt5.7 中的信号和槽 - QWebEnginePage

QT学习之信号和槽

4自定义信号和槽函数

Qt信号和槽的问题

QT-自定义信号和槽

QT自定义信号和槽