RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 697410
Accepted
asianirish
asianirish
Asked:2020-07-25 15:41:13 +0000 UTC2020-07-25 15:41:13 +0000 UTC 2020-07-25 15:41:13 +0000 UTC

如何使用 Q_GADGET 访问类中定义的属性?

  • 772

也就是说,我们有一个不继承QObject的类:

class Apply
{
    Q_GADGET
    Q_PROPERTY(QVariant func READ func WRITE setFunc)
public:
    Apply();

    QVariant func() const;
    void setFunc(const QVariant &func);

    ArgContainer args() const;
    void setArgs(const ArgContainer &value);

//    void substitute(ArgContainer actualArgs);

private:
    QVariant _func; //func, name of func, name of a registered action
    ArgContainer _args;
};

Q_DECLARE_METATYPE(Apply)

您可以在类中定义属性,如Q_GADGET. 现在如何访问它(不是在 QML 中!)?我这样尝试:

Apply a;
a.property("func");

不property()

我正在尝试访问metaObject:

Apply a;
a.metaObject();

没有这样的东西。

staticMetaObject他们写道:

“staticMetaObject 是 QMetaObject 类型,并提供对使用 Q_ENUMS 声明的枚举的访问。”

它可以用来访问道具吗?如果不是,如何读/写 Q_GADGET 的类属性?

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    yrHeTateJlb
    2020-07-25T17:47:31Z2020-07-25T17:47:31Z

    假设我们有一个Gadget带有属性的类name:

    class Gadget{
        Q_GADGET
        Q_PROPERTY(QString name READ name WRITE setName)
        QString _name;
    public:
        QString name() const{
            qDebug() << "name " << _name;
            return _name;
        }
        void setName(const QString &name){
            qDebug() << "setName " << name;
            _name = name;
        }
    };
    

    如果您使用的是 Qt 5.5+,那么您可以像这样操作此属性:

    Gadget gadget;
    Gadget::staticMetaObject.property(0).readOnGadget(&gadget); //name  ""
    Gadget::staticMetaObject.property(0).writeOnGadget(&gadget, "newName"); //setName  "newName"
    

    说实话,不是很方便。我会编写自己的方法,类似于以下方法QObject:

    class Gadget{
        Q_GADGET
        Q_PROPERTY(QString name READ name WRITE setName)
        QString _name;
    public:
        QString name() const{
            qDebug() << "name " << _name;
            return _name;
        }
        void setName(const QString &name){
            qDebug() << "setName " << name;
            _name = name;
        }
        QVariant property(const char *name) const{
            int index = staticMetaObject.indexOfProperty(name);
            if(index == -1){
                return QVariant();
            }
    
            return staticMetaObject.property(index).readOnGadget(this);
        }
        bool setProperty(const char *name, const QVariant &value){
            int index = staticMetaObject.indexOfProperty(name);
            if(index == -1){
                return false;
            }
    
            return staticMetaObject.property(index).writeOnGadget(this, value);
        }
    };
    

    如果你只有一门这样的课,那么你可以停在那里。但是如果有很多这样的类,那么你需要以某种方式概括所有这些。
    第一个选项。添加宏Q_GADGET:

    #define MY_GADGET     Q_GADGET \
                      public: \
                          QVariant property(const char *name) const{ \
                              int index = staticMetaObject.indexOfProperty(name); \
                              if(index == -1){ \
                                  return QVariant(); \
                              }\
                              return staticMetaObject.property(index).readOnGadget(this); \
                          }\
                          bool setProperty(const char *name, const QVariant &value){\
                              int index = staticMetaObject.indexOfProperty(name);\
                              if(index == -1){\
                                  return false;\
                              }\
                              return staticMetaObject.property(index).writeOnGadget(this, value);\
                          }\
                       private:
    

    现在,如果您Q_GADGET使用instead MY_GADGET,那么方法property和setProperty将始终在手边。

    第二个选项。使模板函数与属性一起使用:

    template<class Gadget>
    QVariant property(const char *name, const Gadget &gadget){
        int index = Gadget::staticMetaObject.indexOfProperty(name);
        if(index == -1){
            return QVariant();
        }
        return Gadget::staticMetaObject.property(index).readOnGadget(&gadget);
    }
    
    template<class Gadget>
    bool setProperty(const char *name, Gadget &gadget, const QVariant &value){
        int index = Gadget::staticMetaObject.indexOfProperty(name);
        if(index == -1){
            return false;
        }
        return Gadget::staticMetaObject.property(index).writeOnGadget(&gadget, value);
    }
    
    • 5

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5