QT:做一些qApp属性改变

QT: do something on qApp property change

本文关键字:qApp 属性 改变 QT      更新时间:2023-10-16

我正在使用QT属性系统,我想在属性被修改后立即运行特定的函数。我遵循Qt文档来设置我的属性及其不同的"插槽"(READ, WRITE, NOTIFY):

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
}

但是这个也不行

任何帮助都会很感激,谢谢。:)

您不应该实现信号。信号由Qt在独立的moc生成的文件中自动实现。你只需要在头文件中声明signal:

signals:
void priorityChanged(Priority);

并在需要时发出信号(您已经正确地这样做了)。

本文档页可能会有所帮助:槽。

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实现中建立连接。

您还需要从MyClass中的某个地方emit signal