Я использую систему свойств 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. Вам нужно только объявить сигнал в шапке:
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)));
Вы также можете установить соединение в реализации NewClass, используя this
вместо конкретного экземпляра класса.
Вам также нужно emit
signal
откуда-то внутри MyClass
,