zoukankan      html  css  js  c++  java
  • Qt开发经验小技巧121-130

    1. QLineEdit除了单纯的文本框以外,还可以做很多特殊的处理用途。
    • 限制输入只能输入IP地址。
    • 限制输入范围,强烈推荐使用 QRegExpValidator 正则表达式来处理。
    //正在表达式限制输入
    QString str = "\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b";
    ui->lineEdit->setValidator(new QRegExpValidator(QRegExp(str)));
    //用于占位
    ui->lineEdit->setInputMask("000.000.000.000");
    
    #if 0
    //下面代码设置浮点数范围限制失败
    ui->lineEdit->setValidator(new QDoubleValidator(20, 50, 1));
    #else
    //下面代码设置浮点数范围限制成功
    QDoubleValidator *validator = new QDoubleValidator(20, 50, 1);
    validator->setNotation(QDoubleValidator::StandardNotation);
    ui->lineEdit->setValidator(validator);
    #endif
    //下面代码设置整数范围限制成功
    ui->lineEdit->setValidator(new QIntValidator(10, 120));
    
    //其实上面的代码缺陷很多,只能限制只输入小数,无法设定数值范围,很操蛋
    //需要来个万能的牛逼的 QRegExpValidator
    
    //限制浮点数输入范围为[-180,180]
    QRegExp regexp("^-?(180|1?[0-7]?\d(\.\d+)?)$");
    //限制浮点数输入范围为[-90,90]并限定为小数位后4位
    QRegExp regexp("^-?(90|[1-8]?\d(\.\d{1,4})?)$");
    QRegExpValidator *validator = new QRegExpValidator(regexp, this);
    ui->lineEdit->setValidator(validator);
    
    1. 在继承自QAbstractItemView的控件中,比如QTableView、QTableWidget,如果文本超过对应item的宽度,则会自动省略号显示,想要快速显示完整的文本,可以在该列和下一列分割线中间双击即可,会自动自适应显示最大宽度,如果是Qt5.14或者更高版本,你会发现显示省略号的计算规则变了,如果是rtsp、http之类的开头的英文字符串,同样的列宽下,会提前就显示省略号,比如字符串 rtmp://58.200.131.2:1935/livetv/cctv1,会显示成 rtmp://... ,而在旧版本的Qt中会显示成 rtmp://58.200.131... ,很多时候我们并不想看到烦人的省略号,可以设置取消。
    //取消自动换行
    tableView->setWordWrap(false);
    //超出文本不显示省略号
    tableView->setTextElideMode(Qt::ElideNone);
    
    1. QVideoWidget播放视频,可能会遇到画面闪烁的情况,播放视频的窗体需要设置个属性。
    QVideoWidget *videoWidget = new QVideoWidget;
    videoWidget->setAttribute(Qt::WA_OpaquePaintEvent);
    
    1. Qt bug成千上万,这个不用大惊小怪,也基本上遇不到,大部分都是特殊极端情况特定应用场景出现,甚至你会遇到有些是debug可以release报错,有些release可以debug却报错的情况,最神奇的还有先是debug报错,然后release正常,再返回去用debug又正常,需要用release激活一下!学习编程的路本来就是一条坑坑洼洼的路,不断填坑,尽量规避坑!很多时候很多看起来的坑其实是自己没有注意细节导致的。

    2. Qt试图中默认排序是按照字符串的ASCII排序的,如果是IP地址的话会出现192.168.1.117排在192.168.1.2前面的情况,如果要规避这种情况,一种做法是取末尾的地址转成整型再比较大小,缺点是跨网段就歇菜了,又会出现192.168.2.65出现在192.168.1.70前面,终极大法是将IP地址转成整型再比较大小。

    QString QUIHelper::ipv4IntToString(quint32 ip)
    {
        QString result = QString("%1.%2.%3.%4").arg((ip >> 24) & 0xFF).arg((ip >> 16) & 0xFF).arg((ip >> 8) & 0xFF).arg(ip & 0xFF);
        return result;
    }
    
    quint32 QUIHelper::ipv4StringToInt(const QString &ip)
    {
        int result = 0;
        if (isIP(ip)) {
            QStringList list = ip.split(".");
            int ip0 = list.at(0).toInt();
            int ip1 = list.at(1).toInt();
            int ip2 = list.at(2).toInt();
            int ip3 = list.at(3).toInt();
            result = ip3 | ip2 << 8 | ip1 << 16 | ip0 << 24;
        }
        return result;
    }
    
    1. 在主QWidget窗体如果直接qss设置背景图片的话,预览是可见的,运行并没有效果,你需要在这个主widget上再放个widget,在新的widget上设置qss图片就行,而如果是Dialog或者QMainWindow窗体是支持直接设置qss背景图的,预览和运行效果一致。

    2. Qt提供了qDebug机制直接输出打印信息,这个弥补了QtCreator调试很鸡肋的缺点,而且无缝对接日志钩子,使得现场运行期间按照预定的打印信息输出到日志文件,有时候在开发阶段,又不想要看到一堆堆的打印信息,最笨的做法是一行行注释掉qdebug的地方,其实还可以直接pro中加上一行来禁用整个项目的qdebug输出。

    #禁用qdebug打印输出
    DEFINES += QT_NO_DEBUG_OUTPUT
    
    1. 在使用QT_NO_DEBUG_OUTPUT关键字禁用了所有打印信息以后,可以节约不少的开销,有时候又想在禁用打印信息后,极少地方还需要看到打印信息,怎么办呢?其实QT_NO_DEBUG_OUTPUT禁用的qdebug的输出,Qt还有其他几种打印信息比如 qInfo、qWarning、qCritical,这些是不受影响的,也就是说在极少部分需要打印的地方用qInfo来输出信息就好。特别注意:qFatal打印完信息程序会自动结束。
    qDebug() << "qDebug";
    qInfo() << "qInfo";
    qWarning() << "qWarning";
    qCritical() << "qCritical";
    
    qDebug("qDebug");
    qWarning("qWarning");
    qCritical("qCritical");
    
    1. Qt的pro文件可以添加各种处理来使得配置更方便,比如指定输出文件路径等,这样就不会全部在一堆编译生成的临时文件中找来找去。
    #禁用qdebug打印输出
    DEFINES     += QT_NO_DEBUG_OUTPUT
    
    #自定义define变量 可以在整个项目中使用
    #pro文件可以这样判断 contains(DEFINES, videovlc) {}
    #代码文件可以这样判断 #ifdef videovlc
    DEFINES     += videovlc1 videoffmpeg
    
    #关闭编译警告提示 眼不见为净
    CONFIG      += warn_off
    
    #指定编译生成的文件到temp目录 分门别类存储
    MOC_DIR     = temp/moc
    RCC_DIR     = temp/rcc
    UI_DIR      = temp/ui
    OBJECTS_DIR = temp/obj
    
    #指定编译生成的可执行文件到bin目录
    DESTDIR     = bin
    
    1. Qt对操作系统层的消息也做了很多的封装,可以直接拿到进行处理(如果需要拦截处理要用对应操作系统的API才行比如鼠标键盘钩子),比如系统休眠和唤醒做一些处理。
    //主窗体头文件
    protected:
        bool nativeEvent(const QByteArray &eventType, void *message, long *result);
    #ifdef Q_OS_WIN
        bool winEvent(MSG *message, long *result);
    #endif
    
    //主窗体实现函数
    #ifdef Q_OS_WIN
    #include "Windows.h"
    #endif
    
    bool frmMain::nativeEvent(const QByteArray &eventType, void *message, long *result)
    {
        if (eventType == "windows_generic_MSG") {
    #ifdef Q_OS_WIN
            MSG *msg = static_cast<MSG *>(message);
            //qDebug() << TIMEMS << msg->message;
            if (msg->wParam == PBT_APMSUSPEND && msg->message == WM_POWERBROADCAST) {
                //系统休眠的时候自动最小化可以规避程序可能出现的问题
                this->showMinimized();
            } else if (msg->wParam == PBT_APMRESUMEAUTOMATIC) {
                //休眠唤醒后自动打开
                this->showNormal();
            }
    #endif
        } else if (eventType == "NSEvent") {
    #ifdef Q_OS_MACOS
    #endif
        }
        return false;
    }
    
    #ifdef Q_OS_WIN
    bool frmMain::winEvent(MSG *message, long *result)
    {
        return nativeEvent("windows_generic_MSG", message, result);
    }
    #endif
    
    1. Qt的pro项目管理配置文件中也可添加各种编译前后的操作及配置,主要通过 QMAKE_POST_LINK和QMAKE_PRE_LINK,他们支持的函数以及写法,可以在QtCreator的帮助中搜索 qmake Function Reference 查看详情说明。
    • QMAKE_PRE_LINK 表示编译前执行内容
    • QMAKE_POST_LINK 表示编译后执行内容
    srcFile1 = $$PWD/1.txt
    srcFile2 = $$PWD/2.txt
    dstDir = $$PWD/../bin
    #windows上需要转换路径斜杠 其他系统不需要
    srcFile1 = $$replace(srcFile1, /, \);
    srcFile2 = $$replace(srcFile2, /, \);
    dstDir = $$replace(dstDir, /, \);
    
    #编译前执行拷贝 多个拷贝可以通过 && 符号隔开
    QMAKE_PRE_LINK += copy /Y $$srcFile1 $$dstDir && copy /Y $$srcFile2 $$dstDir
    #编译后执行拷贝 多个拷贝可以通过 && 符号隔开
    QMAKE_POST_LINK += copy /Y $$srcFile1 $$dstDir && copy /Y $$srcFile2 $$dstDir
    

    Qt开发经验开源主页(持续更新):

    1. https://gitee.com/feiyangqingyun/qtkaifajingyan
    2. https://github.com/feiyangqingyun/qtkaifajingyan
  • 相关阅读:
    Kibana6.8.6简单操作手册
    自学思科SD-WAN Zero Touch Provisioning(ZTP)零接触配置
    自学思科SD-WAN Zone Based Firewall(ZBF)区域防火墙
    自学思科SD-WAN Application Aware Routing(AAR)应用感知路由
    自学思科SD-WAN策略框架-本地策略(控制策略+数据策略)
    自学思科SD-WAN策略框架-集中式数据策略
    自学思科SD-WAN策略框架-集中式控制策略
    国密算法说明SM2、SM3、SM4
    Docker Desktop 通过本地命令运行.net core程序
    关于windows使用docker的总结
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/14679600.html
Copyright © 2011-2022 走看看