QT:在qApp属性更改上做点什么

时间:2015-07-17 10:40:55

标签: c++ qt properties onchange notify

我使用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
}

但这也不起作用。

任何帮助将不胜感激,谢谢。 :)

2 个答案:

答案 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内的signalMyClass