1. Qt天生就是linux的,从linux开始发展起来的,所以不少Qt程序员经常的开发环境是linux,比如常用的ubuntu等系统,整理了一点常用的linux命令。
命令 功能
sudo -s 切换到管理员,如果是 sudo -i 切换后会改变当前目录。
apt install g++ 安装软件包(要管理员权限),另一个派系的是 yum install
cd /home 进入home目录
ls 罗列当前所在目录所有目录和文件
ifconfig 查看网卡信息包括IP地址,windows上是 ipconfig。
tar -zxvf bin.tar.gz 解压文件到当前目录
tar -jxvf bin.tar.xz 解压文件到当前目录
tar -zxvf bin.tar.gz -C /home 解压文件到/home目录,记住是大写的C。
tar -zcvf bin.tar.gz bin 将bin目录压缩成tar.gz格式文件(压缩比一般)
tar -jcvf bin.tar.xz bin 将bin目录压缩成tar.xz格式文件(压缩比高,推荐)
tar -... j z 表示不同的压缩方法,x表示解压,c表示压缩。
gedit 1.txt 用记事本打开文本文件
vim 1.txt 用vim打开文件,很多时候可以缩写用vi。
./configure make -j4 make install 通用编译源码命令, 第一步./configure执行配置脚本,第二步make -j4启用多线程编译,第三步make install安装编译好的文件。
./configure -prefix /home/liu/Qt-5.9.3-static -static -sql-sqlite -qt-zlib -qt-xcb -qt-libpng -qt-libjpeg -fontconfig -system-freetype -iconv -nomake tests -nomake examples -skip qt3d -skip qtdoc Qt通用编译命令
./configure -prefix /home/liu/Qt-5.9.3-static -static -release -nomake examples -nomake tests -skip qt3d 精简编译命令
./configure --prefix=host --enable-static --disable-shared --disable-doc ffmpeg编译命令
  1. Qt自带的日志重定向机制非常简单好用,自从用了以后再也不用什么断点调试啥的了,在需要的地方支持qdebug输出对应的信息,而且发布程序以后也可以开启调试日志将其输出查看等。
//Qt5开始提供了日志上下文信息输出,比如输出当前打印消息所在的代码文件、行号、函数名等。
//如果是release还需要在pro中加上 DEFINES += QT_MESSAGELOGCONTEXT 才能输出上下文,默认release关闭的。
//切记不要在日志钩子函数中再写qdebug之类的,那样就死循环了。
//日志重定向一般就三种处理
//1: 输出到日志文件比如txt文本文件。
//2: 存储到数据库,可以分类存储,以便相关人员查询分析。
//3: 重定向到网络,对方用小工具连接程序后,所有打印信息通过tcp发过去。 //日志重定向
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
void Log(QtMsgType type, const QMessageLogContext &context, const QString &msg)
#else
void Log(QtMsgType type, const char *msg)
#endif
{
//加锁,防止多线程中qdebug太频繁导致崩溃
static QMutex mutex;
QMutexLocker locker(&mutex);
QString content; //这里可以根据不同的类型加上不同的头部用于区分
switch (type) {
case QtDebugMsg:
content = QString("%1").arg(msg);
break; case QtWarningMsg:
content = QString("%1").arg(msg);
break; case QtCriticalMsg:
content = QString("%1").arg(msg);
break; case QtFatalMsg:
content = QString("%1").arg(msg);
break;
} //加上打印代码所在代码文件、行号、函数名
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
if (SaveLog::Instance()->getUseContext()) {
int line = context.line;
QString file = context.file;
QString function = context.function;
if (line > 0) {
content = QString("行号: %1 文件: %2 函数: %3\n%4").arg(line).arg(file).arg(function).arg(content);
}
}
#endif //将内容传给函数进行处理
SaveLog::Instance()->save(content);
} //安装日志钩子,输出调试信息到文件,便于调试
void SaveLog::start()
{
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
qInstallMessageHandler(Log);
#else
qInstallMsgHandler(Log);
#endif
} //卸载日志钩子
void SaveLog::stop()
{
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
qInstallMessageHandler(0);
#else
qInstallMsgHandler(0);
#endif
}
  1. 自从c++11标准以后,各种语法糖层出不穷,其中lambda表达式用的最广,基本上从Qt5以后就支持lambda表达式。对于习惯了c99的老一辈的程序员来说,这玩意是个新鲜事物,这里特意做个小理解笔记。
  • 代码格式:capture mutable ->return-type
  • [capture]:捕捉列表,捕捉列表总是出现在Lambda函数的开始处,实际上,[]是Lambda引出符,编译器根据该引出符判断接下来的代码是否是Lambda函数,捕捉列表能够捕捉上下文中的变量以供Lambda函数使用。
  • (parameters):参数列表,与普通函数的参数列表一致,如果不需要参数传递,则可以连同括号 () 一起省略。
  • mutable:mutable修饰符,默认情况下,Lambda函数总是一个const函数,mutable可以取消其常量性。在使用该修饰符时,参数列表不可省略(即使参数为空)。
  • ->return-type:返回类型,用追踪返回类型形式声明函数的返回类型,我们可以在不需要返回值的时候也可以连同符号 -> 一起省略。此外,在返回类型明确的情况下,也可以省略该部分,让编译器对返回类型进行推导。
  • {statement}:函数体,内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。

捕捉列表有以下几种形式:

  • [var]表示值传递方式捕捉变量var。
  • [=]表示值传递方式捕捉所有父作用域的变量(包括this)。
  • [&var]表示引用传递捕捉变量var。
  • [&]表示引用传递方式捕捉所有父作用域的变量(包括this)。
  • [this]表示值传递方式捕捉当前的this指针。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this); //按钮单击不带参数
connect(ui->pushButton, &QPushButton::clicked, [] {
qDebug() << "hello lambda";
}); //按钮单击带参数
connect(ui->pushButton, &QPushButton::clicked, [] (bool isCheck) {
qDebug() << "hello lambda" << isCheck;
}); //自定义信号带参数
connect(this, &MainWindow::sig_test, [] (int i, int j) {
qDebug() << "hello lambda" << i << j;
}); emit sig_test(5, 8);
}
  1. 由于Qt版本众多,有时候为了兼容多个版本甚至跨度Qt4/Qt5/Qt6的兼容,有些头文件或者类名等变了或者新增了,需要用到Qt版本的判断。需要注意的是如果在头文件中使用 QT_VERSION_CHECK 需要先引入#include "qglobal.h"不然编译失败,因为 QT_VERSION_CHECK 这个函数在 qglobal.h 头文件中。
//至少要包含 qglobal.h,理论上Qt所有的类都包含了这个头文件,所以你引入Qt的其他头文件也行比如 qobject.h
#include "qglobal.h"
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
#include "qscreen.h"
#else
#include "qdesktopwidget.h"
#endif
  1. 在使用QString转换到char *或者const char *的时候,务必记得分两步来完成,血的教训,在一个场景中,就因为没有分两步走,现象是msvc的debug异常release正常,mingw和gcc的debug和release都正常,这就很无语了,找问题找半天,对比法排除法按道理要么都有问题才对。
  • 转换前QString的内容无关中文还是英文,要出问题都一样。
  • 转换中QByteArray无关具体类型,toUtf8、toLatin1、toLocal8Bit等方法,要出问题都一样。
  • 转换后无关char *还是const char *,要出问题都一样。
  • 出问题的随机性的,概率出现,理论上debug的概率更大。
  • 根据酷码大佬分析可能的原因(不确定)是msvc为了方便调试,debug会在内存释放后做填充,release则不会。
QString text = "xxxxx";
//下面这样转换很可能会有问题
char *data = text.toUtf8().data();
//分两步转换肯定不会有问题
QByteArray buffer = text.toUtf8();
char *data = buffer.data();
const char *data = buffer.constData();

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

  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. KubeSphere 社区双周报 | OpenFunction 支持 Dapr 状态管理 | 2023.03.31-04.13

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  2. RAC环境中某数据文件(非system表空间)创建在本地,不停机迁移到ASM磁盘中

    Datafiles are mistakenly built into the local file system for processing in the RAC environment The ...

  3. 循环程序结构设计(python)

    文章目录 1.基本概念 2.for循环 2.1 for循环基本结构 2.2 实例介绍 2.2.1 循环输出字符 2.2.2循环输出2000以内的素数 3.whlie循环 3.1 while循环基本结构 ...

  4. Power BI 通过输入数据新建表后重新进入编辑状态

    在使用Power BI时,有时候我们会直接通过输入数据构建一些简单的表,但是构建好后我们可能还需要对表格进行增删改的操作,这时候我们需要怎么才会恢复到表格的编辑状态呢?其实很简单,我们回到PQ里面,双 ...

  5. TypeError: fs.existsSync is not a function | import { ipcRenderer } from 'electron'

    在electron的渲染进程中导包会发生TypeError: fs.existsSync is not a function node_modules/electron/index.js:6 var ...

  6. 19.使用kubeadm-ha脚本一键安装K8S

    使用kubeadm-ha脚本一键安装K8S 前情提示 以前安装k8s集群的时候使用的是k8s官网的教程 使用的镜像源都是国外的 速度慢就不说了 还有一些根本就下载不动 导致安装失败 ,使用一个开源的一 ...

  7. token、cookie、session的区别

    token是验证用户身份的令牌,通常是用于接口的身份验证,一般获取之后放在请求头中 cookie和session的区别: cookie是服务器发送到客户端然后存储在客户端的,可以用来保持用户的登录信息 ...

  8. OSG开发笔记(三十二):深入理解相机视口、制作支持与主视图同步变换旋转的相机HUD

    前言   深入理解相机视口,摸索相机视口旋转功能,背景透明或者不透明.  本篇,实现了一个左下角旋转HUD且背景透明的相机视口.   Demo                  HUD相机的坐标    ...

  9. 『玩转Streamlit』--交互类组件

    交互类组件在Web应用程序中至关重要,它们允许用户与应用进行实时互动,能够显著提升用户体验. 用户不再只是被动地接收信息,而是可以主动地输入数据.做出选择或触发事件,从而更加深入地参与到应用中来. 此 ...

  10. json编码格式化美化

    有时候你想存储一个json到文件中,然后让别人调用或者读取或者作为临时存储,诸如此类. 但是php json_encode后数据是压缩的没有格式化,导致读起来有点费劲. 所以你可以这样(php 5.4 ...