Qt — сигнал NOTIFY Q_PROPERTY не генерируется при изменении ЧЛЕНА

У меня есть закрытая переменная-член класса 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)

У кого-нибудь есть подсказка, в чем проблема?

1

Решение

NOTIFY говорит Qt, что вы испустите statusChanged сигнал при изменении свойства. Это также заставит Qt испустить сигнал, если свойство будет изменено, но не издаст сигнал, когда вы измените член класса, который поддерживает свойство. Это не приводит к тому, что сигнал будет излучаться при изменении значения свойства.

Вы должны реализовать это самостоятельно, например:

void setStatus(QString value)
{
if (value != status)
{
status = value;
emit statusChanged;
}
}

В качестве альтернативы, если вы звоните setProperty это приведет к тому, что сигнал будет излучаться автоматически:

void setStatus(QString value)
{
setProperty("status", value);
}

Обратите внимание, что это, вероятно, будет медленнее, чем реализация предыдущего метода, так как он включает перенос значения в QVariant а затем выполнить поиск метаинформации объектов.

3

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

Других решений пока нет …

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