C++ 定义main.cpp内的信号和插槽

C++ 定义main.cpp内的信号和插槽,c++,qt,moc,C++,Qt,Moc,我在main.cpp中用自己的类编写了一个小程序。代码如下: #include <QApplication> #include <QPushButton> #include <QLabel> class MyWidget : public QWidget { //Q_OBJECT public: MyWidget(QWidget* parent = 0); QLabel* label; QString string; sig

我在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();
}

我能应付吗?问题出在哪里?

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

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


编辑:正如海德所指出的,另一种方法是在cpp中包含moc生成的文件:

只需在cpp源文件中添加一行
#include“main.moc”

更多信息:


你能解释一下“我的插槽坏了”是什么意思吗?在上面的示例中,实际上没有使用
MyWidget::setTextLabel
插槽。还要注意,您的
MyWidget
构造函数不会初始化
标签
成员,这将导致未定义的行为。请参阅:不需要,您不需要.h文件。请参阅问题下的链接(并随时更新您的答案)。
undefined reference to `vtable for MyWidget'
........................................
collect2: error: ld returned 1 exit status
make: *** [mywidget] Error 1