我使用QT属性系统,我希望在修改属性后立即运行特定功能。我按照Qt documentation设置我的财产及其不同的"插槽" (阅读,写作,通知):
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)
Q_ENUMS(Priority)
public:
MyClass(QObject *parent = 0);
~MyClass();
enum Priority { High, Low, VeryHigh, VeryLow };
void setPriority(Priority priority)
{
m_priority = priority;
emit priorityChanged(priority);
}
Priority priority() const
{ return m_priority; }
signals:
void priorityChanged(Priority);
private:
Priority m_priority;
};
如果我理解得当,我应该使用priorityChanged()
函数来实现我想要的。但是如果我在mainwindow.cpp中定义函数:
void MainWindow::priorityChanged() {
//my code
}
我收到以下错误消息:
致命错误LNK1169:找到一个或多个多重定义的符号
所以我尝试在标题中编写代码,如下所示:
signals:
void priorityChanged(Priority) {
//my code
}
但这也不起作用。
任何帮助将不胜感激,谢谢。 :)
答案 0 :(得分:1)
你不应该实施信号。信号由Qt在单独的MOC生成的文件中自动实现。您只需要在标题中声明信号:
signals:
void priorityChanged(Priority);
并在需要时发出信号(你已经正确地做了)。
此文档页面可能会有所帮助:Signals & Slots。
答案 1 :(得分:0)
priorityChanged()
被定义为信号。这不是可以实现的功能。
在另一个类中使用MyClass
时,第二个类应定义一个连接priorityChanged()
信号的插槽。例如:
class NewClass
{
QOBJECT
public:
// Blah blah bla
public slots:
void WhatToDo(Priority);
// ...
};
在NewClass
的实施中,您可以定义方法WhatToDo()
:
NewClass::WhatToDo(Priority P)
{
// Your code here
}
然后,在代码的某处,您必须实例化两个类,并将信号与插槽连接:
NewClass Class;
MyClass Props;
connect(Props, SIGNAL(priorityChanged(Priority)),
Class, SLOT(WhatToDo(Priority)));
您还可以使用this
而不是特定的类实例化在NewClass实现中建立连接。
您还需要emit
内的signal
来MyClass
。