【问题标题】:How qml call static method from c++qml如何从c ++调用静态方法
【发布时间】:2018-01-06 11:55:10
【问题描述】:

我做了什么:

验证器.h:

class UTILSSHARED_EXPORT Validator: public QObject {
    Q_OBJECT
public:
    Validator(QObject *parent = 0);
    ~Validator();
    Q_INVOKABLE static bool validateMobile(const QString target);

};

main.cpp:

qmlRegisterUncreatableType<Validator>("CT.Utils", 1, 0, "ValidatorKit", "It just a kit");

qml:

import CT.Utils 1.0
ValidatorKit.validateMobile("112344")

但不幸的是,我收到一条错误消息:TypeError: Property 'validateMobile' of object [object Object] is not a function

那么,我怎样才能正确地将静态方法暴露给 qml?

有人可以帮我吗?非常感谢。

【问题讨论】:

    标签: c++11 qml qt5.6


    【解决方案1】:

    qmlRegisterUncreatableType() 完全是另外一回事。

    您真正需要做的是将Validator 实例作为上下文属性公开给QML,或者更好的是implement the validator as a singleton

    qmlRegisterSingletonType<Validator>("CT.Utils", 1, 0, "ValidatorKit", fooThatReturnsValidatorPtr);
    

    【讨论】:

    • 没有别的办法。
    • 非常感谢您的帮助。
    • 遗憾的是,这仅适用于 QObjects。 Q_GADGET 的任何解决方案?
    • 我通过在我的应用程序类中使用成员解决了我的问题。我有另一个想法是使用一个模板类来继承我的 Q_GADGET 和 QObject,但没有通过。
    【解决方案2】:

    除了单例类型之外,还可以创建一个只包含静态函数的私有单例附加属性对象。举个例子就更清楚了:

    class StaticValidator;
    
    class Validator : public QObject {
        Q_OBJECT
    
    public:
        Validator(QObject *parent = 0);
        ~Validator();
        
        // Put implementation in a source file to prevent compile errors.
        static StaticValidator* qmlAttachedProperties(QObject *object) {
            Q_UNUSED(object);
            static StaticValidator instance;
            return &instance;
        }
    
        static bool validateMobile(const QString& target);
    };
    
    //Q_OBJECT does not work in inner classes.
    class StaticValidator : public QObject {
        Q_OBJECT
    
    public:
        Q_INVOKABLE inline bool validateMobile(const QString& target) const {
            return Validator::validateMobile(target);
        }
    
    private:
        StaticValidator(QObject* parent = nullptr) : QObject(parent) {}
    
    friend class Validator;
    };
    
    QML_DECLARE_TYPE(Validator)
    QML_DECLARE_TYPEINFO(Validator, QML_HAS_ATTACHED_PROPERTIES)
    

    在 main 或某处注册类型:

    qmlRegisterType<Validator>("Validator", 1, 0, "Validator");
    

    QML 中的调用函数:

    import Validator 1.0
    ...
    var result = Validator.validateMobile(target);
    

    在Qt4中应该也可以,但是我没有测试过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多