使用 Q_Property 显示属性

Posted

技术标签:

【中文标题】使用 Q_Property 显示属性【英文标题】:Using Q_Property to display properties 【发布时间】:2017-05-18 05:12:44 【问题描述】:

我有一个显示树结构的 GUI,如下所示。

这些节点中的每一个都是从它们上面的节点派生的独立类。它们都继承了QObject 的实现。 现在我需要在Implicit 的右键菜单下添加一些当用户选择Properties 时要显示的属性。选择它会打开一个带有属性的窗口。 我在Implicit 的头文件中添加了这些属性,如下所示:

#ifndef FCIMPLICIT_H
#define FCIMPLICIT_H
#include <QObject>
#include "Interface.h"
#include "ResourceItem.h"
#include "MonWindow.h"
#include "FCTab.h"
#include "ResourceItem.h"
#include "FCAbstract.h"
#include "FCInterface.h"
#include "FCConnections.h"
class CFCImplicit: public CResourceItem


    Q_OBJECT
    Q_PROPERTY(int FCPortID READ getPortID )
    Q_PROPERTY(QString Type READ getType )
    Q_PROPERTY(QString Status READ getStat )    
    Q_PROPERTY(int WWNodeNumber READ getNodeNo )
    Q_PROPERTY(int WWPortNumber READ getPortNo )
    Q_PROPERTY(bool AutoActive READ getAuto )
public:
    CFCImplicit(QObject*);
    ~CFCImplicit();

    QString                 getType();
    QString                 getStat();
    int                     getPortID();
    int                     getPortNo();
    int                     getNodeNo();
    bool                    getAuto();


;

FCinterface.hFCASM 节点的标头。

问题是只显示第一个属性,如第二张图片所示。发生这种情况有原因吗?我应该在构造函数或新函数中添加一些东西吗?

Implicit 类的构造函数是

CFCImplicit::CFCImplicit(QObject* parent) : CResourceItem(parent)


    fnSetProperty("objectName", QString("Implicit"));   
    ((CResourceItem*)parent)->fnAddResources(this);


编辑:

这是所有READ 函数的代码

QString CFCImplicit::getType()

QString a;
a="Implicit";
return a;


QString CFCImplicit::getStat()
QString a;
a="Idle";
return a;

int CFCImplicit::getPortID()
int a;
a=1;
return a;

int CFCImplicit::getPortNo()
int a;
a=2;
return a;

int CFCImplicit::getNodeNo()
int a;
a=2;
return a;

bool CFCImplicit::getAuto()
bool a;
a=true;
return a;

【问题讨论】:

你能告诉我们你提取所选对象的属性以将它们添加到属性表中的代码吗? @BenjaminT 我已经添加了代码,但他们什么也没做。我定义它们只是为了演示属性的添加。这些函数只返回预定义的值。 我不是指 getter 的代码。我的意思是您检索对象属性列表的代码。它应该包含对QMetaObject::propertyCount()QMetaObject::property(int) 的调用。 我没有为此添加任何代码。这些线路有什么用途?我将(错误地,也许)假设他们只返回带有属性数量的int,如果是这样,它们如何影响正在显示的属性? 是的,您确实为此添加了代码。通过直接编写或使用库来编写。要了解为什么属性不显示在属性表中,您需要了解属性表的工作原理。如果您不提供有关属性表的任何详细信息,则没有人可以帮助您。 (附带说明,不要假设函数的作用,而是阅读文档!) 【参考方案1】:

我发现我做错了什么。我假设由于属性是只读的,我只需要一个 READ 访问器函数。通过添加WRITE 访问器并添加所需的WRITE 函数,可以显示属性。我不完全理解为什么需要这种条件(也许只有READ 只是使这些属性可用于自省),但它确实有效!就这样吧。

祝大家编码愉快!

【讨论】:

【参考方案2】:

无需添加READ和函数,可以使用MEMBER直接访问变量。

【讨论】:

我正在使用 Qt 4.7.0 ,直到以后的版本才添加 MEMBER。非常抱歉,我应该提到这一点。 不能更新Qt吗?我的意思是,4.7 的维护时间很长 我意识到,当我不得不在 Qt 档案中查找文档时!但这是一个公司项目,他们是在 4.7 中开发的。它会在 Qt 的更高版本中工作吗?新版本只是对旧版本的补充,还是改变了不同的工作方式? 一些事情应该改变,但是如果你使用 Qt Widgets 没有太多改变 - 很多项目仍然使用 Qt4 Qt5 一起编译,相同的代码库。跨度>

以上是关于使用 Q_Property 显示属性的主要内容,如果未能解决你的问题,请参考以下文章

Q_PROPERTY 未显示

为啥我不能拥有带有此签名的 Q_PROPERTY?

如何使用 Q_PROPERTY 公开自定义对象列表

在没有 Q_PROPERTY 定义的情况下从 C++ 访问 QML 对象的属性

Qt之Q_PROPERTY宏理解

我们可以将 Q_PROPERTY 与 template<typename T> 一起使用吗?