您当前的位置: 首页 > 

龚建波

暂无认证

  • 3浏览

    0关注

    313博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

《QDebug 2022年1月》

龚建波 发布时间:2022-01-09 22:24:04 ,浏览量:3

一、Qt Widgets 问题交流 1.输入框 QLineEdit 设置 Validator 过滤后,对于异常的输入进行提示

QWidget 或者 QML 的输入框可以设置 Validator 过滤器,设置后不符合条件的输入会被过滤掉,当前文本不变。有时要在异常输入时进行提示,这就需要获取到过滤器的状态。 Qt 虽然没有提供相关的接口,但 QValidator 类提供了 validate 虚函数供自定义过滤规则,我们可以重写该接口,拿到父类返回的状态值。状态为枚举类型,其中 Invalid 表示是不符合条件的输入,不会显示到编辑框中。

 

#pragma once
#include 

class MyRegExpValidator : public QRegExpValidator
{
    Q_OBJECT
public:
    explicit MyRegExpValidator(QObject *parent = nullptr)
        : QRegExpValidator(parent){ }

    QValidator::State validate(QString &input, int& pos) const override
    {
        //QValidator::Invalid\QValidator::Intermediate\QValidator::Acceptable
        //其中invalid表示输入不匹配
        QValidator::State ret = QRegExpValidator::validate(input, pos);
        emit stateChanged();
        return ret;
    }

signals:
    void stateChanged() const;
};
二、Qt Quick 问题交流 1.View的delegate如果也是个View,那么就不能用model.roleName方式访问role值

一般情况下,在View中可以用roleName或者model.roleName的形式来访问对应行列的role值

参照文档:https://doc.qt.io/qt-5/qtquick-modelviewsdata-modelview.html#qml-data-models

    ListView {
        anchors.fill: parent
        spacing: 2
        model: ListModel {
            ListElement { color: "red" }
            ListElement { color: "green" }
            ListElement { color: "blue" }
        }
        delegate: Rectangle {
            width: ListView.view.width
            height: 30
            color: model.color
        }
    }

如果delegate又是一个View,那么就不能用model.roleName的形式访问值了,因为View自身有个model属性,只能使用roleName的形式,不然会报错

    ListView {
        anchors.fill: parent
        spacing: 2
        model: ListModel {
            ListElement { color: "red" }
            ListElement { color: "green" }
            ListElement { color: "blue" }
        }
        delegate: ListView {
            width: ListView.view.width
            height: 30
            //不能再写model.color
            property color subColor: color
            Rectangle {
                anchors.fill: parent
                color: subColor
            }
        }
    }
三、其他 1.使用 std::this_thread::sleep_for / sleep_until 延时,系统时间往前设置后延时无法结束

出现问题的环境 MSVC2017/2019

可以替换为 QThread::sleep 或者平台相关的延时函数,也可以用 std::condition_variable 来达到类似效果。下面这段代码,修改系统时间后,wait_for 会返回,判断状态不是 timeout 后再次等待。

    connect(ui->pushButton,&QPushButton::clicked,[this]{
        std::thread th([=](){
            std::this_thread::sleep_for/sleep_until
            for(int i=0;i            
关注
打赏
1655829268
查看更多评论
0.0391s