Qt - Q_PROPERTY 未发出有关成员更改的通知信号
Qt - Q_PROPERTY's NOTIFY signal not emited about MEMBER change
我有一个私有 class 成员变量 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
I 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 发出信号,但当您更改支持 属性 的 class 成员时,它不会发出信号。当您更改 属性.
的值时,它不会导致发出信号
你需要自己实现,例如:
void setStatus(QString value)
{
if (value != status)
{
status = value;
emit statusChanged;
}
}
或者,如果您调用 setProperty
,这将导致信号自动发射:
void setStatus(QString value)
{
setProperty("status", value);
}
请注意,这可能比实施以前的方法慢,因为它涉及将值包装在 QVariant
中,然后通过对象元信息进行查找。
我有一个私有 class 成员变量 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
I 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 发出信号,但当您更改支持 属性 的 class 成员时,它不会发出信号。当您更改 属性.
你需要自己实现,例如:
void setStatus(QString value)
{
if (value != status)
{
status = value;
emit statusChanged;
}
}
或者,如果您调用 setProperty
,这将导致信号自动发射:
void setStatus(QString value)
{
setProperty("status", value);
}
请注意,这可能比实施以前的方法慢,因为它涉及将值包装在 QVariant
中,然后通过对象元信息进行查找。