【问题标题】:Setting QRegExp to QML TextField validator disables Textfield将 QRegExp 设置为 QML TextField 验证器会禁用 Textfield
【发布时间】:2019-07-28 09:46:02
【问题描述】:

我想创建一个正则表达式列表以在我的应用程序中作为单例使用,所以我不必到处写它,我尝试创建 qml QtObject 但它在 qml 中不起作用,因为 qml 和 @ 中没有 RegExp 对象987654321@ 不能作为正则表达式工作,它是一个字符串。 我创建了一个 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

对于 cpp :

#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{
            validator:RegExpValidator{ 
              regExp:U.Validators.time
            }
        }

一切都很好应用程序运行但文本字段不会让我写任何东西。 有没有办法在 qml 或 cpp 中创建正则表达式列表?

【问题讨论】:

    标签: qt qml


    【解决方案1】:

    如果您的正则表达式保持在 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
        }
    }
    

    【讨论】:

    • 你测试了吗?我会尽快尝试,但问题在于 qml 中没有正则表达式类型的变量,所以它以前对我不起作用,但我没有测试外部 js 文件。
    • 我没有测试这个特定的代码,但我在多个项目中使用了这个方法,所以我保证这是一个非常简单的工作解决方案:-) 但你也应该能够将它存储在 QML财产,我不确定你的问题是什么。 property var time = /^([0-1][0-9]|[2][0-3]):([0-5][0-9])$/ 应该可以工作(timeRegExp 对象,可直接在 RegExpValidator.regExp 属性中使用)。请注意,您还可以存储字符串property string time = "^...$" 并将其与regExp: new RegExp(time) 一起使用。
    • @MahdiKhalili “问题在 qml 中没有正则表达式类型的变量”是什么意思? QML 支持QRegExpQRegularExpression,您可以为其分配一个js 正则表达式文字或使用RegExp 构造函数。
    • @GrecKo property var time = /^([0-1][0-9]|[2][0-3]):([0-5][0-9])$/ 在 qml 中不起作用,它不是 QRegExp,它是 QString,或者至少 QtCreator 说它是 QString
    • @augre 使用外部 js 文件但内部 qml 不工作
    【解决方案2】:

    问题在于正则表达式/^([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])$");
    

    【讨论】:

      猜你喜欢
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2016-03-24
      • 2020-03-10
      • 2011-03-30
      相关资源
      最近更新 更多