在main.cpp中定义信号和槽

3

我在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 成员,这将导致未定义的行为。 - G.M.
1
请参考:https://dev59.com/bVsW5IYBdhLWcg3wfXNa - hyde
2个回答

6
在Qt中,信号和槽是通过moc:元对象编译器进行管理的。基本上,moc为每个包含Q_OBJECT宏的类生成额外的C++代码,以有效实现信号和槽机制。然后将附加代码链接到原始类声明中。
问题在于您的类在main.cpp中声明:这与moc如何处理您的代码存在冲突。您应该在单独的标头文件中声明类。
更多关于moc的内容请参阅:moc详解 编辑:正如hyde所指出的那样,另一种方法是在cpp文件中包含moc生成的文件:为什么在Qt源代码文件末尾包含“ .moc”文件很重要?

3
不必要,您不需要一个.h文件。请查看问题下方的链接(并随时更新您的答案)。 - hyde

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接