c++ - Qt - 未发出有关成员更改的 Q_PROPERTY NOTIFY 信号

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

我有一个私有(private)类成员变量 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

连接 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)

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

最佳答案

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

你需要自己实现,例如:

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

或者,如果您调用 setProperty,这将导致信号自动发出:

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

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

关于c++ - Qt - 未发出有关成员更改的 Q_PROPERTY NOTIFY 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51708003/

相关文章:

c++ - const void (* 函数)

c++ - 如何浏览嵌套的 for 循环

c++ - 如何获取 QT 主函数 argv 参数作为 unicode 编码格式

c++ - 使用QScriptEngine计算计算

c++ - 通过 id 访问 QML 槽中的嵌套对象(从 C++ 调用)

c++ - 生成一组检查消息内容的方法

c++ - 如何要求显式强制转换

android - NDK 级别的 Android 低级 USB API,可在 Qt Android 上使用

c++ - 删除信号发送的对象,信号中对象的所有权,Qt

c++ - Qt:向死线程/停止线程发送信号