在 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 中定义信号和槽的主要内容,如果未能解决你的问题,请参考以下文章