代码之家  ›  专栏  ›  技术社区  ›  WhiteWater

qml如何从c调用静态方法++

  •  9
  • WhiteWater  · 技术社区  · 7 年前

    我所做的:

    验证器。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:object[object-object]的属性“validateMobile”不是一个函数

    有人能帮我吗?谢谢。

    2 回复  |  直到 7 年前
        1
  •  7
  •   dtech    7 年前

    qmlRegisterUncreatableType() 完全是关于其他事情。

    你实际上需要做的是暴露一个 Validator implement the validator as a singleton .

    qmlRegisterSingletonType<Validator>("CT.Utils", 1, 0, "ValidatorKit", fooThatReturnsValidatorPtr);
    
        2
  •  4
  •   Kao    4 年前

    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);