Qt开发技巧(十三)QList插入操作,扩展类型的使用,关于QSS的坑,Qt的延时方法,Qt编译的三种版本,环境搭建多练练,指向Qt源码的报错

继续讲一些Qt开发中的技巧操作:
1.QList插入操作
关于QList队列的处理中,我们最常用的就是调用append函数添加item,往前插入item很多人第一印象就是调用insert(0,xxx)来插入,其实QList完全提供了往前追加item的函数prepend()、push_front()方法来插入。

QStringList list;
list << "aaa" << "bbb" << "ccc";
//往后追加 等价于 append
list.push_back("ddd");
//往前追加 等价于 prepend
list.push_front("xxx");
//往后追加
list.append("ddd");
//往前追加
list.prepend("xxx");
//指定第一个位置插入 等价于 prepend
list.insert(0, "xxx");
//输出 QList("xxx", "aaa", "bbb", "ccc", "ddd")
qDebug() << list;

2.扩展类型的使用
Qt内置了一些QList、QMap、QHash相关的类型,可以直接用,不用自己写个长长的类型,比如QStringList,不用你写个QList<QString>

//qwindowdefs.h
typedef QList<QWidget *> QWidgetList;
typedef QList<QWindow *> QWindowList;
typedef QHash<WId, QWidget *> QWidgetMapper;
typedef QSet<QWidget *> QWidgetSet;
//qmetatype.h
typedef QList<QVariant> QVariantList;
typedef QMap<QString, QVariant> QVariantMap;
typedef QHash<QString, QVariant> QVariantHash;
typedef QList<QByteArray> QByteArrayList;

3.关于QSS的坑
关于QSS要注意的坑,qss源自css,相当于css的一个子集,主要支持的是css2标准,很多网上的css3的标准的写法在qss这里是不生效的,所以有时候搜到css3的一些写法,不能盲目的直接copy过来用,很可能不支持的。qss也不是完全支持所有的css2,比如text-align官方文档就有说明,只支持 QPushButton andQProgressBar,务必看清楚;有时候偷懒直接来一句 *{xxx},你会发现大部分是应用了,也有小部分或者极个别没有应用,你可能需要在对应的窗体中 this->setStyleSheet() 来设置;qss的执行是有优先级的,如果没有指定父对象,则对所有的应用,比如在窗体widget中
{color:#ff0000;} 这样会对widget以及widget的所有子对象应用该样式,这种问题各大群每周都有人问,你会发现各种奇奇怪怪的异样不正常,怎么办呢,你需要指定类名或者对象名,比如#widget{color:#ff0000;} 这样就只会对widget对象应用该样式,另一种写法QWidget#widget{color:#ff0000;},只想对窗体本身而不是子控件按钮标签等.QWidget{color:#ff0000;} ,具体详细规则参见官方说明。

4.Qt的延时方法
关于Qt延时的几种方法,举几个例子

void QtHelperCore::sleep(int msec)
{
if (msec <= 0) {
return;
}
#if 1
//非阻塞方式延时,现在很多人推荐的方法
QEventLoop loop;
QTimer::singleShot(msec, &loop, SLOT(quit()));
loop.exec();
#else
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
//阻塞方式延时,如果在主线程会卡住主界面
QThread::msleep(msec);
#else
//非阻塞方式延时,不会卡住主界面,据说可能有问题,目前没发现
QTime endTime = QTime::currentTime().addMSecs(msec);
while (QTime::currentTime() < endTime) {
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
#endif
#endif
}

5.Qt编译的三种版本
关于QtCreator中三种不同编译版本 debug、release、profile 的区别简单说下:
debug调试模式:编译后的可执行文件很大,带了很多调试符号信息等,方便开发阶段调试的时候进入具体的堆栈查看值。会打开所有的断言,运行阶段性能差速度慢,可能会有卡顿感觉;
release发布模式:编译后的可执行文件很小,不带任何调试符号信息,一般用于打包发布程序。由于经过了各种优化,会关闭所有断言,运行阶段性能最好,如果有卡顿那肯定是你的程序有问题了;
profile概述模式:编译后的可执行文件比debug小很多比release大一点,带有部分调试符号信息,在debug和release之间取一个平衡,兼顾性能和调试,性能更优但是又方便调试
debug链接的库是带d结尾的,release和profile链接的库是不带d结尾的,很多人以为profile链接的是带d结尾的其实是错误的,新的Qt在线安装程序在安装的时候,可以勾选是否安装debug调试库(对应lib目录下一堆带d结尾的文件),以前的版本是默认都安装,现在可选安装以便减少体积,无论是否安装了debug调试库,你都可以选择debug模式生成对应debug的文件,无论是哪种模式,都可以在程序中开启日志钩子输出日志信息,方便收集运行阶段的各种信息反馈给开发人员查看问题;最初的开发工具一般是具有debug和release两种模式,随着用户需求的增加和场景的需要,部分开发工具衍生出了profile模式,更有甚者比如flutter还有第四种test模式。
6.环境搭建多练练
Qt的构建套件一般是在安装Qt开发环境的时候自动设置的,当然也可以手动设置,手动设置的时候千万要注意编译器和Qt库必须一致,否则该构建套件是有问题的,千万不能乱设置,尤其是对构建套件命名的时候最好标明qt版本和编译器版本,最好也要一致,不要说名称叫msvc而编译器选择的确是mingw,这样尽管能正常使用该构建套件,但是会造成一种误解,还以为该套件是msvc的,其实里面是mingw的。这个在windows上其实比较好甄别,也不太容易出问题,但Linux交叉编译的环境下,一定要注意区分那些交叉编译链,有时候编译没问题,一上板子发现运行有问题,艾玛,编译器选错了~~
7.指向Qt源码的报错
当你编译Qt程序发现编译通不过提示报错,而且报错提示指向的是Qt源码自身的一些头文件的时候,不要去尝试着修改Qt头文件来编译通过,那样没用而且会带来意想不到的错误,你使用的Qt的库是已经根据原始的头文件编译好的。如果报错提示在编译生成的临时的moc等文件,你也不要尝试去修改他,那个是临时文件,这次你改好了也许编译通过了,你重新编一下又覆盖了还是旧的错误。总之你要从你的代码找问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值