liudianwu |
2021-08-20 09:33 |
Qt开发经验小技巧161-165
161. 经常有人说Qt垃圾,说用Qt在1毫秒绘制几千个数据点卡成屎。其实显示器最高刷新频率一般才60帧,1毫秒就绘制一次有意义吗?不仅显示器没刷新过来,人肉眼也看不过来(有人可能又要抬杠说这是老板要求的,显示归显示,至于人看不看那是另外一回事,我想说的是显示不就是给人看的吗?给程序看可以直接后台绘制图片让程序识别啊没必要显示的),程序中要做的应该是尽量降低程序的绘制刷新频率到显示器的频率(其实一秒钟30帧都足够),一次搞多一点的数据一次性绘制(数据量很大还可以考虑重采样,比如平均值法等,毕竟要考虑显示器的分辨率就那么大,搞个几十万的数据点挤一块没啥意思,可以将一整块区域内的数据点换成一个点),而不是绘制多次,尽管两种办法都可以将收到的数据绘制完成,但是效率相差的不是一点点,信号也是如此,不建议太频繁的发送信号,Qt内部1秒钟处理信号的个数也是有限制的,太频繁高并发的信号,很可能会丢失或者合并一部分,比如网络请求接收到的学生信息表,应该是在该应答数据内的所有学生信息解析完一次性发送,而不是解析一条发送一条。
162. Qt提供了N种窗体属性比如无边框属性FramelessWindowHint、不在任务栏显示属性Tool等,有时候我们需要对窗口的属性进行动态设置,比如增加一个属性或者移除一个属性,Qt5.9以前需要拿到原有的窗体属性做运算,后面可以用新的方法。 ```cpp //增加一个无边框属性 setWindowFlags(windowFlags() | Qt::FramelessWindowHint); //移除无边框属性 setWindowFlags(windowFlags() & ~Qt::FramelessWindowHint);
//下面是5.9以后新增的方法 //增加一个无边框属性到窗体属性链表 setWindowFlag(Qt::FramelessWindowHint, true); //从窗体属性链表中移除无边框属性 setWindowFlag(Qt::FramelessWindowHint, false); ```
163. 如果对窗体设置了固定尺寸,窗体会变得大小不可拉伸,如果需要重新还原可拉伸,必须重新设置最小尺寸和最大尺寸。 ```cpp setMinimumSize(0, 0); setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); ```
164. Qt内置了很多全局的对象参数可以直接获取,这样在使用的时候方便的不要不要的,比如判断当前鼠标左键还是右键可以直接用qApp->mouseButtons(),全局的鼠标坐标可以用QCursor::pos()。 ```cpp //在鼠标右键的地方弹出菜单,如果菜单是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 头文件,你会发现新大陆。 ```
165. Qt对区分不同的编译器也做了非常细致的处理。 ```cpp #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](https://gitee.com/feiyangqingyun/qtkaifajingyan) 2. [https://github.com/feiyangqingyun/qtkaifajingyan](https://github.com/feiyangqingyun/qtkaifajingyan) |
|