我正在努力学习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();
}
答案 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 ++代码)