1. 在Qt编程中经常会遇到编码的问题,由于跨平台的考虑兼容各种系统,而windows系统默认是gbk或者gb2312编码,当然后期可能msvc编译器都支持utf8编码,所以在部分程序中传入中文目录文件名称的时候会发现失败,因为可能对应的接口用了早期的fopen函数而不是fopen_s函数,比如fmod中也是这个情况。这个时候就需要转码处理。
QString fileName = "c:/测试目录/1.txt";
//如果应用程序main函数中没有设置编码则默认采用系统的编码,可以直接通过toLocal8Bit转成正确的数据
const char *name = fileName.toLocal8Bit().constData(); //如果设置过了下面两句则需要主动转码
QTextCodec *codec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForLocale(codec); QTextCodec *code = QTextCodec::codecForName("gbk");
const char *name = code->fromUnicode(fileName).constData(); //推荐方式2以防万一保证绝对的正确,哪怕是设置过主程序的编码
//切记一旦设置过QTextCodec::setCodecForLocale会影响toLocal8Bit //有时候可能还有下面这种情况
#ifdef Q_OS_WIN
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
QTextCodec *code = QTextCodec::codecForName("utf-8");
#else
QTextCodec *code = QTextCodec::codecForName("gbk");
#endif
const char *name = code->fromUnicode(fileName).constData();
#else
const char *name = fileName.toUtf8().constData();
#endif
  1. 在查阅和学习Qt源码的过程中,发现了一些趋势和改变。
  • 数据类型这块尽量用Qt内部的数据类型,哪怕是重定义过的比如quint8其实unsigned char,qreal就是double,以前翻看源码的时候可能还有些是double,现在慢慢改成了qreal。
  • 循环结构用 for(; 替代 while(1),因为转成汇编指令后 for(; 只有一条指令而 while(1) 确有4条,指令少不占用寄存器而且不用跳转,理论上速度要更快。
  • 其实Qt中就重定义了 forever 关键字表示 for(; ,我的乖乖,想的真周到。
  • 自动c++11以及后续的标准都支持auto万能数据类型,发现Qt的源码中也慢慢的改成了auto,这样加快了编写代码的效率,不用自己去指定数据类型而是让编译器自己推导数据类型。而且其实也不影响编译器编译的速度,因为无论指定和没有指定数据类型,编译器都要推导右侧的数据类型进行判断。不过有个缺点就是影响了阅读代码的成本,很多时候需要自己去理解推导。
  1. Qt中设置或者打开加载本地文件需要用到QUrl类,本地文件建议加上 file:/// 前缀。
QString url = "file:///c:/1.html";
//浏览器控件打开本地网页文件
webView->setUrl(QUrl(url));
//打开本地网页文件,下面两种方法都可以
QDesktopServices::openUrl(QUrl::fromLocalFile(url));
QDesktopServices::openUrl(QUrl(url, QUrl::TolerantMode));
  1. 在网络请求中经常涉及到超时时间的问题,因为默认是30秒钟,一旦遇到网络故障的时候要等好久才能反应过来,所以需要主动设置下超时时间,超过了就直接中断结束请求。从Qt5.15开始内置了setTransferTimeout来设置超时时间,非常好用。
//局部的事件循环,不卡主界面
QEventLoop eventLoop; //设置超时 5.15开始自带了超时时间函数 默认30秒
#if (QT_VERSION >= QT_VERSION_CHECK(5,15,0))
manager->setTransferTimeout(timeout);
#else
QTimer timer;
connect(&timer, SIGNAL(timeout()), &eventLoop, SLOT(quit()));
timer.setSingleShot(true);
timer.start(timeout);
#endif QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url)));
connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
eventLoop.exec(); if (reply->bytesAvailable() > 0 && reply->error() == QNetworkReply::NoError) {
//读取所有数据保存成文件
QByteArray data = reply->readAll();
QFile file(dirName + fileName);
if (file.open(QFile::WriteOnly | QFile::Truncate)) {
file.write(data);
file.close();
}
}
  1. Qt中基本上有三大类型的项目,控制台项目对应QCoreApplication、传统QWidget界面程序对应QApplication、quick/qml项目程序对应QGuiApplication。有很多属性的开启需要在main函数的最前面执行才有效果,比如开启高分屏支持、设置opengl模式等。不同类型的项目需要对应的QApplication。
//如果是控制台程序则下面的QApplication换成QCoreApplication
//如果是quick/qml程序则下面的QApplication换成QGuiApplication
int main(int argc, char *argv[])
{
//可以用下面这行测试Qt自带的输入法 qtvirtualkeyboard
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); //设置不应用操作系统设置比如字体
QApplication::setDesktopSettingsAware(false); #if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
//设置高分屏缩放舍入策略
QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Floor);
#endif
#if (QT_VERSION > QT_VERSION_CHECK(5,6,0))
//设置启用高分屏缩放支持
//要注意开启后计算到的控件或界面宽度高度可能都不对,全部需要用缩放比例运算下
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
//设置启用高分屏图片支持
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
#endif
#if (QT_VERSION > QT_VERSION_CHECK(5,4,0))
//设置opengl模式 AA_UseDesktopOpenGL(默认) AA_UseSoftwareOpenGL AA_UseOpenGLES
//QApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
//设置opengl共享上下文
QApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
#endif QApplication a(argc, argv);
QWidget w;
w.show();
return a.exec();
}

Qt开发经验小技巧171-175的更多相关文章

  1. Qt开发经验小技巧81-90

    Qt中的QColor对颜色封装的很完美,支持各种转换,比如rgb.hsb.cmy.hsl,对应的是toRgb.toHsv.toCmyk.toHsl,还支持透明度设置,颜色值还能转成16进制格式显示. ...

  2. Qt开发经验小技巧61-70

    很多人问Qt嵌入式平台用哪个好,这里统一回答(当前时间节点2018年):imx6+335x比较稳定,性能高就用RK3288 RK3399,便宜的话就用全志H3,玩一玩可以用树莓派香橙派. 对于大段的注 ...

  3. Qt开发经验小技巧41-50

    如果使用sqlite数据库不想产生数据库文件,可以创建内存数据库. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); ...

  4. Qt开发经验小技巧71-80

    在我们使用QList.QStringList.QByteArray等链表或者数组的过程中,如果只需要取值,而不是赋值,强烈建议使用 at() 取值而不是 [] 操作符,在官方书籍<C++ GUI ...

  5. Qt开发经验小技巧51-60

    在某些http post数据的时候,如果采用的是&字符串连接的数据发送,中文解析乱码的话,需要将中文进行URL转码. QString content = "测试中文"; Q ...

  6. Qt开发经验小技巧31-40

    代码判断MSVC编译器版本. if (_MSC_VER == 1800) MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015) MSVC++ 12.0 _ ...

  7. Qt开发经验小技巧21-30

    如果出现Z-order assignment: is not a valid widget.错误提示,用记事本打开对应的ui文件,找到为空的地方,删除即可. 善于利用QComboBox的addItem ...

  8. Qt开发经验小技巧11-20

    获取类的属性 const QMetaObject *metaobject = object->metaObject(); int count = metaobject->propertyC ...

  9. Qt开发经验小技巧1-10

    当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它,有时候用QTime ...

  10. Qt开发经验小技巧合集

    一.开发经验总结 当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它, ...

随机推荐

  1. sqlplus登录脚本glogin.sql的配置

    DEFINE sqlprompt=SQL COLUMN sqlprompt NEW_VALUE sqlprompt SET TERMOUT OFF SELECT USER || '@' || NVL( ...

  2. Redhat 7安装Oracle 11.2.0.4 RAC 数据库软件中报错:Error in invoking target 'agent nmhs' of makefile

    环境:Redhat Linux 7.6 + Oracle 11.2.0.4 RAC 现象:图像化安装数据库软件过程中的86%时,报错. 1. 具体现象 2. 定位问题 3. 解决问题 1. 具体现象 ...

  3. freeswitch的话单处理

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 如果对cdr话单要求不高,可以直接使用fs的原始话单文件,使用脚本做一些简单的统计. 环境 CentOS 7.9 freeswitc ...

  4. 2个月搞定计算机二级C语言——真题(7)解析

    1. 前言 本篇我们讲解2个月搞定计算机二级C语言--真题7 2. 程序填空题 2.1 题目要求 2.2 提供的代码 #include <stdio.h> int fun(char* s, ...

  5. P9119 [春季测试 2023] 圣诞树

    参考博客: 春季测试 2023] 圣诞树 题解 - 洛谷专栏 (luogu.com.cn) 题意:给定二维平面上一个凸多边形的 \(n\) 个顶点, 求一种方案,使得从最高点开始,不重复地经过所有点后 ...

  6. Nuxt.js 应用中的 schema:extend事件钩子详解

    title: Nuxt.js 应用中的 schema:extend事件钩子详解 date: 2024/11/10 updated: 2024/11/10 author: cmdragon excerp ...

  7. 根据不同的dpi 媒体查询

    /* 默认样式 */ .element { width: 100px; height: 100px; background-color: blue; } /* 当设备像素比为1.5时,调整.eleme ...

  8. K8S1.16.4+kubeflow1.0安装

    K8S1.16.4+kubeflow1.0安装文档 一.简介 本文档编写原因:之前kubeflow1.0安装手册出现较多不可控问题,计划重新安排一个能够完全离线安装的K8S和kubeflow环境. 备 ...

  9. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-4-启动浏览器-基于Maven(详细教程)

    1.简介 上一篇文章,宏哥已经在搭建的java项目环境中添加jar包实践了如何启动浏览器,今天就在基于maven项目的环境中给小伙伴们或者童鞋们演示一下如何启动浏览器. 2.eclipse中新建mav ...

  10. youtube视频下载,youtube-dl

    []为选填,用的时候去掉[] 用pip装youtube-dl pip install -U youtube-dl [--proxy=127.0.0.1:7890] youtube-dl下载youtub ...