QT: сделать что-нибудь с изменением свойства qApp

Я использую систему свойств 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
}

но это тоже не работает.

Любая помощь будет оценена, спасибо. 🙂

0

Решение

Вы не должны реализовывать сигналы. Сигналы автоматически внедряются Qt в отдельные файлы, сгенерированные MOC. Вам нужно только объявить сигнал в шапке:

signals:
void priorityChanged(Priority);

и излучать сигнал, когда это необходимо (что вы уже делаете правильно).

Эта страница документации может быть полезна: сигналы & игровые автоматы.

1

Другие решения

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)));

Вы также можете установить соединение в реализации NewClass, используя this вместо конкретного экземпляра класса.

Вам также нужно emit signal откуда-то внутри MyClass,

0

По вопросам рекламы [email protected]