【问题标题】:Not able to find quit slot, and use Q_OBJECT macro无法找到退出槽,并使用 Q_OBJECT 宏
【发布时间】:2011-09-06 04:19:54
【问题描述】:

我正在使用带有 QT 4.7.1 和插件的 VS2008。我是这个环境的新手。
我设法进行必要的设置并运行简单的“hello world”。但是当我尝试使用简单的 quit() 插槽点击按钮,我失败了。尝试使用 Q_OBJECT 时也会导致构建失败。
注释Q_OBJECT 后,代码已构建和调试。现在它显示了

QObject::connect : 在 .\main.cpp 中找不到这样的插槽 QWidget::quit()。

下面是我的代码

#include <QtGui>
#include "QtGui\QApplication"
#include "QObject"


class Notepad : public QWidget
{
    //Q_OBJECT 
public:
    Notepad();
    private slots:
        void quit();

private:
    QTextEdit *textEdit;
    QPushButton *quitButton;
}; 

Notepad::Notepad()
{
    textEdit = new QTextEdit;
    quitButton = new QPushButton(tr("Quit"));
    connect(quitButton, SIGNAL(clicked()), this, SLOT(quit() ));
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(textEdit);
    layout->addWidget(quitButton);

    setLayout(layout);

    setWindowTitle(tr("Notepad"));
}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Notepad nt;// = new Notepad();
    nt.show();

    return a.exec();
}

我已经通过网络搜索但未能得到合理的解决方案。大多数解决方案都是用于在命令行上使用 qmake。 我还可以找到该项目的 .pro 文件。

感谢任何帮助。

【问题讨论】:

  • 我在你的代码中没有看到你的 void Notepad::quit(){} 方法在任何地方都是正常的。
  • 我希望如此,因为这不会导致任何错误。删除它也不会影响代码!!
  • @KaZ 这就是问题所在。退出没有定义。这不是导致直接错误,而是定义 Q_OBJECT 宏是因为它找不到 quit() 槽的定义。

标签: visual-studio-2008 qt signals-slots qobject


【解决方案1】:

Nitesh:您需要 Q_OBJECT 宏才能使插槽正常​​工作,MOC 会将包含 Q_OBJECT 的每个标头编译成 moc_*.cpp 文件。将该 moc*.cpp 添加到您的项目中,一切正常。未解析的外部意味着您缺少函数的定义,您是否在任何地方定义了它?

【讨论】:

  • 我得到了已发布问题的答案。错误是由于缺少 Notepad::quit() 方法的定义。当我们包含 Q_OBJECT 宏时,MOC 检查所有槽或信号的定义。但是如果评论它,则不会寻找退出槽的定义,因此在这种情况下不会出现错误。为 quit() 槽添加定义解决了这个问题。谢谢@blueskin
【解决方案2】:

将记事本的声明移动到标题(例如,notepad.h),重新启用 Q_OBJECT,然后添加到您的 .pro 文件中:

HEADERS += notepad.h

重新运行 qmake,然后它应该可以工作了。

【讨论】:

  • 我正在通过 VS2008 构建代码,而不是使用 qmake。我也无法在我的 projecy 目录中创建 .pro 文件。
  • 我创建了一个单独的头文件。然后在启用 Q_OBJECT 后重新编译。这是我得到的错误。错误 LNK2019:未解析的外部符号“private: void __thiscall Notepad::quit(void)” (?quit@Notepad@@AAEXXZ) 在函数“public: virtual int __thiscall Notepad::qt_metacall(enum QMetaObject::Call,int, void * *)" (?qt_metacall@Notepad@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
  • 从你的项目中删除头文件(不要删除它)并重新添加它。这应该会触发 QT 的 MOC 插件并创建包含该缺失符号的缺失 moc_notepad.h 文件
  • 尝试了 Tim 的解决方案。产生的错误是:moc_notepad.obj : error LNK2019: unresolved external symbol "private: void __thiscall Notepad::quit(void)" (?quit@Notepad@@AAEXXZ) referenced in function "public: virtual int __thiscall Notepad::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Notepad@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
  • 如果我评论 Q_OBJECT,代码工作正常。我应该尝试使用 Q_OBJECT 的设置吗?
猜你喜欢
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
相关资源
最近更新 更多