未定义引用`Counter :: valueChanged(int)'

时间:2014-11-07 06:45:57

标签: qt

我正在努力学习qt。这是我练习的第一个例子。但我有这个错误:C:\ Qt2 \ Qt5.2.1 \ Tools \ QtCreator \ bin \ recogn_signal_slot \ main.cpp:19 :error:未定义引用`Counter :: valueChanged(int)'

我不知道该怎么办。有人告诉我你应该把你的班级放在头文件中。但是我无法理解他说的话。任何人都可以一步一步地告诉我。非常感谢你。< / p>

这是我在main.cpp中的代码:

     #include <QCoreApplication>
#include <QObject>

class Counter : public QObject
{

    int m_value;
public:
    int value() const { return m_value; }
public slots:
    void setValue(int value);
signals:
    void valueChanged(int newValue);
};
void Counter::setValue(int value)
{
    if (value != m_value) 
    {
        m_value = value;
        emit valueChanged(value);
    }
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Counter d, b;
      QObject::connect(&d, SIGNAL(valueChanged(int)),
                       &b, SLOT(setValue(int)));

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

    return a.exec();
}

1 个答案:

答案 0 :(得分:4)

[什么错了?]

你发出信号&amp; Meta-Object-Compiler (MOC)调用的广告位。

建议阅读:Why Does Qt Use Moc for Signals and Slots?


[解决]

步骤1.将Q_OBJECT宏添加到使用信号&amp;的QObject衍生物中。插槽。

    class Counter : public QObject
    {
        Q_OBJECT     // <-----HERE

        int m_value;
    public:
        int value() const { return m_value; }
    public slots:
        void setValue(int value);
    signals:
        void valueChanged(int newValue);
    };

步骤2.将您的班级声明移至counter.h,并将实施移至counter.cpp。由于 MOC 搜索包含Q_OBJECT标题文件,因此即使对于小型测试项目,最好还是将QObject类和主要文件分开。

步骤3.清洁所有---&gt; 运行qmake ---&gt;重建( qmake 会自动调用 MOC 将信号和插槽语法转换为可编译的C ++代码)