• Qt开发经验小技巧151-155


    1. 当Qt中编译资源文件太大时,效率很低,或者需要修改资源文件中的文件比如图片、样式表等,需要重新编译可执行文件,这样很不友好,当然Qt都给我们考虑好了策略,此时可以将资源文件转化为二进制的rcc文件,这样就将资源文件单独出来了,可在需要的时候动态加载。
    //Qt中使用二进制资源文件方法如下
    //将qrc编译为二进制文件rcc,在控制台执行下列命令 
    rcc -binary main.qrc -o main.rcc
    //在应用程序中注册资源,一般在main函数启动后就注册
    QResource::registerResource(qApp->applicationDirPath() + "/main.rcc");
    
    1. 关于设置字体,大概都会经历一个误区,本来是打算设置整个窗体包括子控件的字体大小的,结果发现只有主窗体自己应用了字体而子控件没有。
    //假设窗体中有子控件,默认字体12px,父类类型是QWidget,父类类名是Widget
    
    //下面几种方法只会设置主窗体的字体,子控件不会应用,需要按个调用setFont
    QFont font;
    font.setPixelSize(20);
    this->setFont(font);
    this->setStyleSheet("{font:26px;}");
    this->setStyleSheet("QWidget{font:26px;}");
    this->setStyleSheet("Widget{font:26px;}");
    
    //下面才是通过样式表设置整个控件+子控件的字体
    this->setStyleSheet("font:26px;");
    this->setStyleSheet("*{font:26px;}");
    this->setStyleSheet("QWidget>*{font:26px;}");
    this->setStyleSheet("Widget>*{font:26px;}");
    
    //下面设置全局字体
    qApp->setFont(font);
    
    1. Qt中封装的QImage异常的强大,提供了各种图片格式的转换,还可以对每个像素的颜色值进行替换,有时候我们需要将单色的图片换成另外一种颜色,要注意的是如果带有透明值的颜色需要进行格式转化,比如转成Format_ARGB32或者Format_RGBA8888。
    //pixel      函数获取像素点的颜色 setPixel      函数设置像素点的颜色 此函数任意Qt版本都有
    //pixelColor 函数获取像素点的颜色 setPixelColor 函数设置像素点的颜色 此函数Qt5.6以后才有
    //pixel函数取出来的是QRgb格式需要用 qRed qGreen qBlue qAlpha 进行转换
    QImage image("1.png");
    image = image.convertToFormat(QImage::Format_ARGB32);
    int width = image.width();
    int height = image.height();
    //遍历图像的每一个像素
    for (int x = 0; x < width; ++x) {
        for (int y = 0; y < height; ++y) {
            QString name = image.pixelColor(x, y).name();
            //将白色以外的颜色全部替换成红色
            if (name != "#ffffff") {
                image.setPixelColor(x, y, Qt::red);
            }
        }
    }
    
    //保存文件
    image.save("2.png");
    
    1. 在数据库相关的应用中,如果仅仅是单机版本,没有特别的需要(比如领导指定,或者需要远程存放数据),强烈建议使用sqlite数据库,这是本人经过无数次的对比测试和N个商业项目应用得出的结论。
    • Qt天生内置了sqlite数据库,只需要发布的时候带上插件就行(可以看到插件动态库文件比其他几种都要大,那是因为直接将数据库的源码都编译进去了,而其他只编译了中间通信交互的插件源码),其他数据库要么还要带上动态库,要么还需要创建数据源;
    • 速度上,绝对无与伦比的出类拔萃,同样的数据库结构(表结构、索引等完全一致),查询速度和批量更新速度、数据库事务等,速度都是其他几种的至少3倍以上,而且随着数据量的增大对比越发明显;
    • 几千万的数据量完全没问题,而且速度和性能都还可以,不要以讹传讹网上部分菜鸡说的不支持百万以上的数据量,本人亲测亿级别,数据量建议千万级别以下,着重注意数据库表和索引的设计;
    • 其他数据库还要注意版本的区别,ODBC数据源形式还容易出错和执行失败;
    • sqlite数据库也有几个重大缺点:不支持加密,不支持网络访问,不支持部分数据库高级特性,不支持海量数据(亿级别以上),但是对于绝大部分Qt项目还是足够;
    • 数据库支持友好度大致是 sqlite > postgresql > mysql > odbc ;
    • 以上都是在Qt环境中个人测试得出的结论,结果未必正确,作为参考即可,其他编程环境比如C#、JAVA请忽略,也许差别可能在中间通信的效率造成的;
    1. Qt5.10以后提供了新的类 QRandomGenerator QRandomGenerator64 管理随机数,使用更方便,尤其是取某个区间的随机数。
    //早期处理办法 先初始化随机数种子然后取随机数
    qsrand(QTime::currentTime().msec());
    //取 0-10 之间的随机数
    qrand()%10;
    //取 0-1 之间的浮点数
    qrand()/double(RAND_MAX);
    
    //新版处理办法 支持5.10以后的所有版本包括qt6
    QRandomGenerator::global()->bounded(10);      //生成一个0和10之间的整数
    QRandomGenerator::global()->bounded(10.123);  //生成一个0和10.123之间的浮点数
    QRandomGenerator::global()->bounded(10, 15);  //生成一个10和15之间的整数
    
    //兼容qt4-qt6及以后所有版本的方法 就是用标准c++的随机数函数
    srand(QTime::currentTime().msec());
    rand()%10;
    rand()/double(RAND_MAX);
    

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

    1. https://gitee.com/feiyangqingyun/qtkaifajingyan
    2. https://github.com/feiyangqingyun/qtkaifajingyan
  • 相关阅读:
    使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之二
    使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之一
    关于使用Iscroll.js异步加载数据后不能滑动到最底端的问题解决方案
    [系统集成] RT(Request Tracker)执行自定义脚本及发送微信、短信的实现方法
    [工具开发] 分享两个基于Heapster 和 Influxdb 的 Grafana 监控仪表盘模板
    [系统集成] 基于 elasticsearch 的企业监控方案
    BindWeb
    [系统集成] 基于Kubernetes 部署 jenkins 并动态分配资源
    [经验交流] Active-Active 方式设置 kubernetes master 多节点高可用
    [经验交流] Kubernetes Nginx Ingress 安装与使用
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/14801965.html
Copyright © 2020-2023  润新知