我在 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:元对象编译器进行管理的。基本上,moc 为每个包含 Q_OBJECT 宏的类生成额外的 C++ 代码,以便有效地实现信号和槽机制。然后附加代码链接到原始类声明。
这里的问题是你的类是在 main.cpp 中声明的:这与 moc 处理你的代码的方式相冲突。您应该在单独的标头中声明您的类。
关于 moc 的更多信息
Edit:正如 hyde 指出的,另一种方法是将 moc 生成的文件包含在您的 cpp 中:为什么在 Qt 源代码文件末尾包含“.moc”文件很重要?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)