在 main.cpp 中定义信号和槽

2023-12-14

我在 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(使用前将#替换为@)

在 main.cpp 中定义信号和槽 的相关文章

随机推荐