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

    1. 经常有人说Qt垃圾,说用Qt在1毫秒绘制几千个数据点卡成屎。其实显示器最高刷新频率一般才60帧,1毫秒就绘制一次有意义吗?不仅显示器没刷新过来,人肉眼也看不过来(有人可能又要抬杠说这是老板要求的,显示归显示,至于人看不看那是另外一回事,我想说的是显示不就是给人看的吗?给程序看可以直接后台绘制图片让程序识别啊没必要显示的),程序中要做的应该是尽量降低程序的绘制刷新频率到显示器的频率(其实一秒钟30帧都足够),一次搞多一点的数据一次性绘制(数据量很大还可以考虑重采样,比如平均值法等,毕竟要考虑显示器的分辨率就那么大,搞个几十万的数据点挤一块没啥意思,可以将一整块区域内的数据点换成一个点),而不是绘制多次,尽管两种办法都可以将收到的数据绘制完成,但是效率相差的不是一点点,信号也是如此,不建议太频繁的发送信号,Qt内部1秒钟处理信号的个数也是有限制的,太频繁高并发的信号,很可能会丢失或者合并一部分,比如网络请求接收到的学生信息表,应该是在该应答数据内的所有学生信息解析完一次性发送,而不是解析一条发送一条。

    2. Qt提供了N种窗体属性比如无边框属性FramelessWindowHint、不在任务栏显示属性Tool等,有时候我们需要对窗口的属性进行动态设置,比如增加一个属性或者移除一个属性,Qt5.9以前需要拿到原有的窗体属性做运算,后面可以用新的方法。

    //增加一个无边框属性
    setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
    //移除无边框属性
    setWindowFlags(windowFlags() & ~Qt::FramelessWindowHint);
    
    //下面是5.9以后新增的方法
    //增加一个无边框属性到窗体属性链表
    setWindowFlag(Qt::FramelessWindowHint, true);
    //从窗体属性链表中移除无边框属性
    setWindowFlag(Qt::FramelessWindowHint, false);
    
    1. 如果对窗体设置了固定尺寸,窗体会变得大小不可拉伸,如果需要重新还原可拉伸,必须重新设置最小尺寸和最大尺寸。
    setMinimumSize(0, 0);
    setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
    
    1. Qt内置了很多全局的对象参数可以直接获取,这样在使用的时候方便的不要不要的,比如判断当前鼠标左键还是右键可以直接用qApp->mouseButtons(),全局的鼠标坐标可以用QCursor::pos()。
    //在鼠标右键的地方弹出菜单,如果菜单是QMenu而不是QAction则只能通过下面的方式弹出
    if (qApp->mouseButtons() == Qt::RightButton) {
        videoMenu->exec(QCursor::pos());
    }
    
    //全局剪切板
    qApp->clipboard();
    //顶层控件对象集合
    qApp->topLevelWidgets()
    //当前焦点所在控件
    qApp->focusWidget()
    //当前平台名称
    qApp->platformName()
    //调用系统蜂鸣器
    qApp->beep()
    //打印当前Qt版本信息
    qApp->aboutQt()
    //设置全局的鼠标样式
    qApp->setOverrideCursor()
    //不使用系统的标准颜色字体等
    QGuiApplication::setDesktopSettingsAware(bool on);
    QApplication app(argc, argv);
    
    //更多的全局对象属性等可以查阅 qguiapplication.h 头文件,你会发现新大陆。
    
    1. Qt对区分不同的编译器也做了非常细致的处理。
    #pro文件可以这样判断
    msvc{}
    
    //代码中可以这样判断
    #ifdef Q_CC_MINGW
    //mingw编译器
    #elif Q_CC_MSVC
    //msvc编译器
    #endif
    
    //判断编译器和编译器版本
    #if defined Q_CC_MSVC && _MSC_VER < 1300
    #if defined(Q_CC_GNU) && (__GNUC__ < 4)
    
    //代码中判断ARM平台
    #ifdef QT_ARCH_ARM
    //多个条件判断
    #if defined(QT_ARCH_ARM) || defined(QT_ARCH_WINDOWSCE)
    

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

    1. https://gitee.com/feiyangqingyun/qtkaifajingyan
    2. https://github.com/feiyangqingyun/qtkaifajingyan
  • 相关阅读:
    四十一.redis主从复制 RDB/AOF持久化 数据类型
    四十.创建Redis集群 管理集群
    三十九.NoSQL概述 部署Redis服务 、 部署LNMP+Redis
    三十八. 分库分表概述 配置mycat
    520D
    442C
    LA4788
    LA3276
    LA4122
    zoj3478
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/15165020.html
Copyright © 2011-2022 走看看