将QRegExp设置为QML TextField验证器将禁用Textfield

时间:2019-07-28 09:46:02

标签: qt qml

我想创建一个正则表达式列表,以便在我的应用程序中以单例形式使用,因此我不必到处都写它,我尝试创建qml QtObject,但它在qml中不起作用,因为在qml和{中没有RegExp对象{1}}不能作为正则表达式使用它的字符串。 我创建了一个cpp类,将正则表达式放入其中:

property var x = /regex/

对于cpp:

#ifndef UVALIDATORS_H
#define UVALIDATORS_H

#include <QObject>
#include <QRegExp>
#include <QQmlEngine>
#include <QJSEngine>
class UValidators : public QObject
{
    Q_OBJECT
    Q_DISABLE_COPY(UValidators)
    Q_PROPERTY(QRegExp time READ time )
public:
    static QObject* instance(QQmlEngine *engine,QJSEngine *scriptEngine){
        Q_UNUSED(engine);
        Q_UNUSED(scriptEngine);
        return new UValidators;
    };
    explicit UValidators(QObject *parent = nullptr);
    QRegExp time() const;

signals:

public slots:
};

#endif // UVALIDATORS_H

然后我使用:

注册它
#include "uvalidators.h"

UValidators::UValidators(QObject *parent) : QObject(parent)
{

}
QRegExp UValidators::time() const{
    QRegExp time;
    time.setPattern("/^([0-1][0-9]|[2][0-3]):([0-5][0-9])$/");
    return time;
}

我这样使用它:

qmlRegisterSingletonType<UValidators>("U",1,0,"Validators",&UValidators::instance);

一切都很好,应用程序可以运行,但是textfield不会让我写任何东西。 有什么方法可以在qml或cpp中创建正则表达式列表?

2 个答案:

答案 0 :(得分:2)

如果您的正则表达式表达式处于QML级别,则可以将它们存储在共享的js文件中:

// Regex.js
var time = /^([0-1][0-9]|[2][0-3]):([0-5][0-9])$/;

在任何QML文件中均可使用:

import "Regex.js" as Regex

TextField {
    validator: RegExpValidator { 
        regExp: Regex.time
    }
}

答案 1 :(得分:0)

问题在于正则表达式/^([0-1][0-9]|[2][0-3]):([0-5][0-9])$/,如果要将模式设置为QRegExp,则应从正则表达式的开始和结束处放下/。如果您知道在没有cpp的qml中解决此正则表达式问题的更好方法,请告诉我!

time.setPattern("^([0-1][0-9]|[2][0-3]):([0-5][0-9])$");