c++ - Qt 信号/插槽示例的链接器错误

标签 c++ visual-studio-2010 qt linker-errors

我有一个包含多个使用信号和槽的类的 Qt 应用程序,它编译得很好。但是,当我在主 CPP (main.cpp) 文件中创建自定义类时,出现链接器错误。

这是我使用的代码:

class Counter : public QObject
{
    Q_OBJECT

public:
    Counter() { m_value = 0; }

    int value() const { return m_value; }

public slots:
    void setValue(int value)
    {
     if(value!=m_value)
     {
         m_value = value;
         qDebug() << "Value " << value;
         emit valueChanged(value);
     }
    }

signals:
    void valueChanged(int newValue);

private:
    int m_value;
};

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    Counter a, b;
    QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));

    a.setValue(12);     // a.value() == 12, b.value() == 12
    b.setValue(48);     // a.value() == 12, b.value() == 48

    QTimer::singleShot(0, &app, SLOT(quit()));

    return app.exec();
}

错误如下:

Error   4   error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Counter::metaObject(void)const " (?metaObject@Counter@@UBEPBUQMetaObject@@XZ)  
Error   5   error LNK2001: unresolved external symbol "public: virtual void * __thiscall Counter::qt_metacast(char const *)" (?qt_metacast@Counter@@UAEPAXPBD@Z)
Error   6   error LNK2001: unresolved external symbol "public: virtual int __thiscall Counter::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Counter@@UAEHW4Call@QMetaObject@@HPAPAX@Z)   
Error   7   error LNK2019: unresolved external symbol "protected: void __thiscall Counter::valueChanged(int)" (?valueChanged@Counter@@IAEXH@Z) referenced in function "public: void __thiscall Counter::setValue(int)" (?setValue@Counter@@QAEXH@Z)

当我将计数器放在单独的头文件中时,不会发生此链接器错误。这种行为的原因是什么?

最佳答案

我假设您正在使用 qmake

默认情况下,moc 会自动在头文件上运行,因为通常是在头文件中声明类。请注意,此规则是在 makefile 中定义的,您可以在源文件上手动运行 moc

您必须通知qmake 该文件包含一个类。为此,将 #include "filename.moc" 放在 Counter 的声明之后。可以查看更多详情here (QtCentre)here (doc) .

如果您正在使用 qmake 以外的其他工具,比如 CMake,您必须指定一个规则来强制 moc 解析 .cpp 文件(最简单的就是处理它们)。对于不包含 Qt 对象类的文件,moc 将生成一个空文件。

但是,即使这个类是“私有(private)的”,我还是建议您在 header 中声明它(例如 counter_private.h)。比如Qt源码就是在用这个技巧。

关于c++ - Qt 信号/插槽示例的链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13614593/

相关文章:

c++ - 清理映射中所有共享指针的正确方法是什么?

c# - 该进程无法访问该 exe 文件,因为它正被另一个进程使用

c++ - 从多个 QThreads 更新 QProgressBar

c++ - 无法使用 AT 命令发送短信

c++ - 通过引用传递 std::optional<T> 是否实际上节省了复制?

c++ - OpenMP 最小值缩减和 std::min

c++ - 在 C++ 中从 Mat 中提取 Y、Cb、Cr 并创建仅包含 Y 值的 Mat

c++ - llvm clang 2.6 : "not using the clang compiler for C++ inputs "

c# - 如何将三个 Windows 窗体应用程序转换为一个?

c++ - 在 64 位机器上构建 32 位 Qt 应用程序