У меня есть закрытая переменная-член класса status
и я хочу испускать сигнал с его значением каждый раз, когда он меняется. Поэтому я использую Q_PROPERTY
и указать сигнал с NOTIFY
:
#ifndef CAMERACONTROL_H
#define CAMERACONTROL_H
#include <QObject>
#include <iostream>
class CameraControl : public QObject
{
Q_OBJECT
Q_PROPERTY(QString status MEMBER status NOTIFY statusChanged)
private:
QString status;
public:
explicit CameraControl(QObject *parent = nullptr);
~CameraControl();
void changeStatus()
{
std::cout << "changeStatus called" << std::endl; // The function definitely gets called!
this->status = "Change status again!";
}
public slots:
void outputStatus(const QString &status) {
std::cout << status.toStdString() << std::endl;
}
signals:
void statusChanged(const QString &status);
};
#endif // CAMERACONTROL_H
я connect
statusChanged
сигнал с outputStatus
слот внутри конструктора:
#include "CameraControl.h"
CameraControl::CameraControl(QObject *parent) :
QObject(parent)
{
this->cameraHandle = nullptr;
this->connect(this, &CameraControl::statusChanged, this, &CameraControl::outputStatus);
this->status = "Change status text";
}
При запуске приложения и изменении статуса через другой объект я не получаю никакого вывода, а также не получаю сообщения от qt относительно этой проблемы.
Пожалуйста, имейте в виду, что это не фактическая реализация. status
меняются через различные функции-члены довольно много без какого-либо вывода. Тем не менее connect
называть так же, как statusChanged
и outputStatus
точно реализованы как в этом вопросе.
Поскольку Q_PROPERTY
имеет то же имя, то член я думал об этом, что является проблемой и изменил Q_PROPERTY
без разницы:
Q_PROPERTY(QString qstatus MEMBER status NOTIFY statusChanged)
У кого-нибудь есть подсказка, в чем проблема?
NOTIFY
говорит Qt, что вы испустите statusChanged
сигнал при изменении свойства. Это также заставит Qt испустить сигнал, если свойство будет изменено, но не издаст сигнал, когда вы измените член класса, который поддерживает свойство. Это не приводит к тому, что сигнал будет излучаться при изменении значения свойства.
Вы должны реализовать это самостоятельно, например:
void setStatus(QString value)
{
if (value != status)
{
status = value;
emit statusChanged;
}
}
В качестве альтернативы, если вы звоните setProperty
это приведет к тому, что сигнал будет излучаться автоматически:
void setStatus(QString value)
{
setProperty("status", value);
}
Обратите внимание, что это, вероятно, будет медленнее, чем реализация предыдущего метода, так как он включает перенос значения в QVariant
а затем выполнить поиск метаинформации объектов.
Других решений пока нет …