Qt-关于成员更改,未发出Q_PROPERTY的NOTIFY信号

时间:2018-08-06 12:46:26

标签: c++ qt qt-signals qt5.9 qproperty

我有一个私有类成员变量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以及statusChangedoutputStatus的调用都完全按照此问题实现。

由于Q_PROPERTY的名称与我认为是问题的成员的名称相同,因此将Q_PROPERTY更改为以下内容,没有任何区别:

Q_PROPERTY(QString qstatus MEMBER status NOTIFY statusChanged)

有人知道问题出在哪里吗?

1 个答案:

答案 0 :(得分:3)

NOTIFY告诉Qt,当您更改属性时,您将发出statusChanged信号。如果修改了属性,它也会导致Qt发出信号,但是当您更改支持该属性的类成员时,它不会发出信号。更改属性值时,不会导致信号发出。

您需要自己实施此操作,例如:

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

或者,如果您呼叫setProperty,则会导致信号自动发射:

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

请注意,这可能比实现以前的方法要慢,因为它涉及将值包装在QVariant中,然后通过对象元信息进行查找。