整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Qt开发经验小技巧191-195

Qt开发经验小技巧191-195

91. 关于QList队列的处理中,我们最常用的就是调用append函数添加item,往前插入item很多人第一印象就是调用insert(0,xxx)来插入,其实QList完全提供了往前追加item的函数prepend、push_front。

```cpp

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;

```

192. Qt内置了一些QList、QMap、QHash相关的类型,可以直接用,不用自己写个长长的类型。

```cpp

//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;

```

193. Qt的布局的边距间隔,如果在没有改动过的情况下,是会根据系统分辨率以及缩放比来决定对应的默认值,是变化的,比如在1080P分辨率是9px,在2K分辨率又变成了11px,所有你会发现你在1080P电脑编译的程序,明明看到的是6px、9px,怎么到2K、4K分辨率下间隔和边距就变得好大,如果要保持无论何种分辨率都一样,你需要手动重新设置这些值,这里有个坑,比如默认是是9,你想其他分辨率也是9,你必须先把9改成其他值比如10,然后再改成9,这样才表示真的改动,你直接9改成9是不会变化的,在属性设计器中右侧有个小箭头恢复值的,也是灰色,只有加深显示,并且出现了恢复默认值箭头,才表示你确实是改过了值。

194. Qt对高分屏以及dpi缩放的支持越来越成熟,在Qt4时代默认的策略就是跟随系统的缩放,从Qt5.6开始提供了 AA_EnableHighDpiScaling 的属性设置开启高分屏,到了5.14以后还可以指定缩放的策略 HighDpiScaleFactorRoundingPolicy 比如支持浮点数的缩放比而不是之前的整数倍,从Qt6开始默认永远开启了 AA_EnableHighDpiScaling 属性,没法取消。很多时候我们需要两种模式,一种就是永远不应用高分屏及缩放,一种就是自动应用高分屏及缩放。

```cpp

//永远不应用高分屏及缩放

int main(int argc, char *argv[])

{

#if (QT_VERSION >=QT_VERSION_CHECK(5,0,0))

QApplication::setAttribute(Qt::AA_Use96Dpi);

#endif

#if (QT_VERSION >=QT_VERSION_CHECK(5,14,0))

QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Floor);

#endif

QApplication a(argc, argv);

....

return a.exec();

}

//自动应用高分屏及缩放

//方法很多,综合对比下来还是采用配置文件指定缩放策略最适中。

//新建qt.conf文件放到可执行文件同一目录

[Platforms]

WindowsArguments=dpiawareness=0

//有时候想让用户去选择何种策略,需要开启高分屏的之后只需要将qt.conf文件放到可执行文件同一目录即可,就算代码中设置了不应用高分屏及缩放,也无效,也是优先取qt.conf文件的策略。

```

195. 关于QSS要注意的坑。

- qss源自css,相当于css的一个子集,主要支持的是css2标准,很多网上的css3的标准的写法在qss这里是不生效的,所以不要大惊小怪。

- qss也不是完全支持所有的css2,比如text-align官方文档就有说明,只支持 QPushButton and QProgressBar,务必看清楚。

- 有时候偷懒直接来一句 *{xxx},你会发现大部分是应用了,也有小部分或者极个别没有应用,你可能需要在对应的窗体中 this->setStyleSheet() 来设置。

- qss的执行是有优先级的,如果没有指定父对象,则对所有的应用,比如在窗体widget中 {color:#ff0000;} 这样会对widget以及widget的所有子对象应用该样式,这种问题各大Qt群每周都在上演,你会发现各种奇奇怪怪的异样不正常,怎么办呢,你需要指定类名或者对象名,比如 #widget{color:#ff0000;} 这样就只会对widget对象应用该样式,另一种写法 QWidget#widget{color:#ff0000;},只想对窗体本身而不是子控件按钮标签等 .QWidget{color:#ff0000;} ,具体详细规则参见官方说明。

- qss整体来说还是可以的,尽管有着有那的BUG,怀着包容的心对待它。

天一天遇到很多事情,下午静下心来,编译 QT/E 程序到ARM 设备上运行,今天就写写如何实现。

QT 编程扩展

一、编写自定义的信号与槽

1、将上个实验的目录复制出另一份并改名为testmyqt-x11

[root@localhost uptech]# cp testqt-x11/ testmyqt-x11 -arf

[root@localhost uptech]# ls

QT4 hello testmyqt-x11 testqt-x11

[root@localhost uptech]#

2、编辑自己定义槽函数的头文件myqt.h

包含ui_testx11.h 头文件,继承其控件类,定义自定义函数文件处理函数MyDlg,并添加自定义函数槽ShowInfo

即可。

[root@localhost testmyqt-x11]# ls

main.cpp testx11.ui

[root@localhost testmyqt-x11]#

手动编写myqt.h

[root@vm-dev testmyqt-x11]# vi myqt.h

#ifndef __DLG_H__

#define __DLG_H__

#include <QDialog>

#include <ui_testx11.h>

class MyDlg : public QDialog

{

Q_OBJECT

public:

MyDlg;

public slots:

void ShowInfo;

private:

Ui::Form ui;

};

#endif

编辑myqt.cpp 文件进行函数功能实现

其中ShowInfo函数槽中定义改变textEdit 的内容为“Welcome to UP-TECH”

[root@vm-dev testmyqt-x11]# vi myqt.cpp

#include "myqt.h"

MyDlg::MyDlg

{

ui.setupUi(this);

QObject::connect(ui.pushButton, SIGNAL(clicked), this, SLOT(ShowInfo));

QObject::connect(ui.pushButton_2, SIGNAL(clicked), this, SLOT(close));

}

void MyDlg::ShowInfo

{

ui.textEdit->setHtml(QApplication::translate("Form", "<!DOCTYPE HTML PUBLIC

\"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"

"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"

"p, li { white-space: pre-wrap; }\n"

"</style></head><body style=\" font-family:'Sans Serif'; font-size:10pt;

font-weight:400; font-style:normal;\">\n"

"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px;

margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\"

font-size:12pt; font-weight:600; color:#55aaff;\">Welcome to

UP-TECH</span></p></body></html>", 0, QApplication::UnicodeUTF8));

}

3、重新编辑main.cpp 函数

包含自定义头文件并使用自定义的类对象进行QT 实现

[root@vm-dev testmyqt-x11]# vi main.cpp

#include <QApplication>

#include "myqt.h"

int main(int argc, char **argv)

{

QApplication app(argc, argv);

MyDlg *mydlg=new MyDlg;

return mydlg->exec;

}

查看当前目录文件

[root@localhost testmyqt-x11]# ls

main.cpp myqt.cpp myqt.h testx11.ui

[root@localhost testmyqt-x11]#

全部源文件已经准备好,接下来使用QT/E 环境编译程序(当然如果想在宿主机X11 环境下编译该程序也可,只是更

改编译器的qmake 工具即可,如上一个QT/X11 实验)。

4、使用qmake –project 命令生成工程文件:

[root@localhost testmyqt-x11]# /usr/local/Trolltech/Qt-embedded-4.4.0/bin/qmake

-project

[root@localhost testmyqt-x11]# ls

main.cpp myqt.cpp myqt.h testmyqt-x11.pro testx11.ui

[root@localhost testmyqt-x11]#

5、使用qmake 生成Makefile 文件:

Makefile main.cpp myqt.cpp myqt.h testmyqt-x11.pro testx11.ui

[root@localhost testmyqt-x11]#

6、make 编译程序

[root@localhost testmyqt-x11]# make

生成可执行程序testmyqt-x11

[root@localhost testmyqt-x11]# ls

Makefile main.o moc_myqt.o myqt.h testmyqt-x11 testx11.ui

main.cpp moc_myqt.cpp myqt.cpp myqt.o testmyqt-x11.pro ui_testx11.h

[root@localhost testmyqt-x11]#

可以使用file 查看文件属性,以免与X11 程序混淆,如:

[root@localhost testmyqt-x11]# file testmyqt-x11

testmyqt-x11: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses

shared libs), for GNU/Linux 2.6.14, not stripped

[root@localhost testmyqt-x11]#

确保是ARM 处理器的ELF 可执行文件。

7、将其拷贝到上述过程搭建好的NFS 共享目录:

[root@localhost testmyqt-x11]# cp testmyqt-x11

/UP-Magic6410/Trolltech/Qt-embedded-witheabi4.3.1-4.4.0/

二、在ARM 端运行程序测试:

1、启动UP-Magic6410 实验系统,连好网线、串口线。通过串口终端挂载宿主机实验目录。

[root@UP_6410 yaffs]# mountnfs 192.168.1.145:/UP-Magic6410 /mnt/nfs/

2、设置环境变量 (ARM 端)

进入QT/Embedded 实验NFS 共享目录Trolltech 中

[root@UP_6410 yaffs]# cd /mnt/nfs/Trolltech/Qt-embedded-4.4.0/

[root@UP_6410 Qt-embedded-4.4.0]# ls

bin include mkspecs translations

etc lib plugins

[root@UP_6410 Qt-embedded-4.4.0]#

根据此实验目录下的目录进行ARM 端环境变量设置,如下:

[root@UP_6410 Qt-embedded-4.4.0]# export QTDIR=$PWD

[root@UP_6410 Qt-embedded-4.4.0]# export LD_LIBRARY_PATH=$PWD/lib

[root@UP_6410 Qt-embedded-4.4.0]# export TSLIB_TSDEVICE=/dev/event1

[root@UP_6410 Qt-embedded-4.4.0]# export TSLIB_PLUGINDIR=$PWD/lib/ts

[root@UP_6410 Qt-embedded-4.4.0]# export TSLIB_CONSOLEDEVICE=none

[root@UP_6410 Qt-embedded-4.4.0]# export TSLIB_CONFFILE=$PWD/etc/ts.conf

[root@UP_6410 Qt-embedded-4.4.0]# export POINTERCAL_FILE=$PWD/etc/ts-calib.conf

[root@UP_6410 Qt-embedded-4.4.0]# export QWS_MOUSE_PROTO=tslib:/dev/event1

[root@UP_6410 Qt-embedded-4.4.0]# export TSLIB_CALIBFILE=$PWD/etc/ts-calib.conf

[root@UP_6410 Qt-embedded-4.4.0]# export QT_QWS_FONTDIR=$PWD/lib/fonts

[root@UP_6410 Qt-embedded-4.4.0]# export

3、执行程序

[root@UP_6410 Qt-embedded-4.4.0]# ./testmyqt-x11 –qws –font unifont

观察UP-Magic6410 型设备LCD 输出QT 程序界面

备注:上诉提到的实验源码testmyqt-x11 已经在产品光盘中(/UP-Magic6410/SRC/gui/demo 目录)提供,用户可以省去编写代码时间。

实验效果:

可以点击相关按钮,测试自定义信号槽的事件响应。

今天就写这么多,希望明天能有好的心情,谢谢大家。

籍非常具有个人主观性,编程类的书籍也不例外。但是不管书籍的风格,重点或者节奏如何,好的 C++ 编程书能带读者开启一段引人入胜的旅程,拓展 C++ 语言的能力,向读者展示如何使用C++来构建各种东西。

我精心挑选了一些 C++ 的书籍,这些书都非常值得一读。我推荐的这 9 本书都是根据公共版权许可发行的书籍。在此之前,我先简要介绍一下 C++。

C++ 是由Bjarne Stroustrup设计的,在1983年发布了第一个版本。它是一门静态类型,通用的,可移植编程语言,形式自由,多范式,需要编译。也因为它结合了高层次和低层次的语言特征,被认为是一种中级语言。C++ 专为系统和应用程序编程而设计,它对 C 语言进行了扩展,自增操作符记为++,因此叫 C++。

C++ 一直是一门备受欢迎编程语言。例如,它被大量地用于嵌入式系统、银行和电信领域。它是 C 语言的超集,保留了 C 语言的效率和便利的符号标记,同时提供更强大的类型检查,多继承,数据抽象,异常处理,运算符重载,泛型编程和面向对象编程的功能。C++ 对许多其他语言产生了影响,包括 C#、Java 以及 C 语言的发展。

《Boost C++ 类库》(The Boost C++ Libraries)

作者 Boris Sch?ling,570 页

Boost C++库在C++世界中有非常重要的影响力。这些便携式的库为诸多任务和结构提供了支持,包括多线程,容器,字符串和文本处理,迭代器,线性代数,伪随机数生成,元程序设计模板,并发程序设计,数据结构,图像处理,正则表达式和单元测试等。 Boost几乎可以用于任何现代操作系统,包括Linux和Windows的衍生版本,同时也支持大多数现代编译器。

本书介绍了72个非常实用的Boost库,这些库涵盖的范围非常广,可以帮助程序员更容易地管理内存和处理字符串。这些库还提供了扩展标准库的多种容器和其他数据结构,使用这些库可以轻松地构建独立于平台的网络应用程序。

本书是值得添加到各类收藏的好东西。书里的430个代码示例很好地阐明了这些库的功能。

书中章节对内存管理,字符串处理,容器,数据结构,算法,通信,流和文件以及时间等问题进行了研究。稍后的章节继续探讨了函数,并行性和泛型编程问题。在结尾覆盖了大量有关语言扩展,错误信息以及数字处理,应用程序库,设计模式和其他库等内容。

Boost C++库是根据Creative Commons Attribution – NonCommercial – NoDerivatives 4.0国际许可证发布的。如果您喜欢随身携带书籍,可以在Amazon上购买纸质版。电子版也可以在kindle上购买,电子书和 PDF 格式都可以。如果你想学习C/C++可以来这个群,首先是三三零,中间是八五九,最后是七六六,里面有大量的学习资料可以下载。

《C++注解》(C++ Annotations)

作者 Frank B. Brokken,1029 页

本书提供了有关C++编程语言的全方位教程,可以用作C ++编程课程的教科书。它适用于熟悉C语言或者类似C语言语法的用户。

包括以下章节:

  • 命名空间

  • 字符串——C语言提供了基本的字符串支持

  • I/O字节流——提供了基于类概念的输入/输出(I / O)库

  • 类——C针对不同类型数据结构提供了两种方法。 C结构体保存各种类型的数据成员,C联合体也定义了各种类型的数据成员。本章介绍了另外一种结构——类,与结构体不同的是,类成员默认是私有的

  • 静态数据和函数

  • 内存管理——用C++语言描述内存分配的运算符

  • 异常——允许C++程序执行受控的非本地返回命令,弥补了非局部跳转(longjmp)和设置局部跳转(setjmp)函数的缺点

  • 运算符重载——通用的运算符重载

  • 抽象容器

  • 继承——派生的另一个术语。本章演示了基类指针可能用于指向派生类对象

  • 多态——继承的一种特殊形态

  • 友元——介绍friend关键字及其使用原则

  • 成员指针——定义指向成员的指针及其使用,静态成员指针和指针长度

  • 嵌套类——在嵌套类与其外围类具有紧密概念关系的情况下使用

  • 标准模板库(STL)——由容器,通用算法,迭代器,函数对象,分配器,适配器和数据结构组成的通用库。这些算法使用的数据结构是抽象的,可以与(实际上)任何数据类型一起使用

  • 泛型算法——涵盖STL的通用算法

  • 函数模板——探讨模板的句法特性。介绍了模板类型参数,模板非类型参数和函数模板的概念,并提供了多个模板示例

  • 类模板——讨论构建和使用类模板

  • 高级模板使用——简要介绍模板元编程的主要特征和与模板相关的细微之处

这本书有HTML,PDF,PostScript和Txt格式。它可以自由分发,并根据GNU通用公共许可证的条款发布。

《通过Qt4 介绍C++中的设计模式》(Introduction to Design Patterns in C++ with Qt 4, An)

作者 艾伦·尤斯特(Paul Ezust), 656页

本书首先介绍C++基本组成,面向对象的概念,UML(统一建模语言)和核心Qt类。进而转向更高层次的编程思想,Qt模型和设计模式。最后一部分严谨地印证了C++的重要特性,完整地覆盖了函数,继承和多态性方面的内容。

该书旨在用于大学课程,面向没有C或C ++编程经验的读者,还为教学工作者提供了Qt示例,练习,解决方案和授课幻灯片。

这本书是Bruce Perens开源系列的一部分。 本系列的所有图书均以Open Publication License V1.0或更新版本发布。

《如何像计算机科学家一样思考(C++篇)》(How to Think Like a Computer Scientist: C++)

作者Allen B. Downey,191页

《如何像计算机科学家一样思考》C++版本是一本简洁文雅的介绍如何使用C++编程语言进行软件设计的书。本书从最基本的概念开始,以阅读者容易接受的速度逐渐增添新内容,旨在把没有编程经验的读者培养成未来的开发人员。

本书的主要内容:

  • 变量,表达式和语句

  • 函数

  • 条件和递归

  • 丰富的函数

  • 迭代

  • 字符串

  • 向量

  • 成员函数

  • 对象向量

  • 向量对象

  • 类和不变量

  • 文件输入/输出和apMatrixes

本书是一本免费的C++版教科书,根据Creative Commons Attribution-NonCommercial 3.0 未本地化协议发布。

《基于Qt3的C++ 图形界面编程》(C++ GUI Programming with Qt 3)

作者 Jasmin Blanchette,Mark Summerfield,464页

Qt的最新稳定版本是5.8。 本书指导读者如何使用Qt 3编写图形界面程序,Qt 3最近一个版本的是在2004年发布,但是有很多这本书对于Qt 4和Qt 5用户来说仍然是有意义的。

本书需要读者对C++有基本的了解,这不是一本面向初学者的书。

本书向读者介绍了使用Qt编写图形界面应用程序的所有概念和实践,对核心问题进行了详细周密的讲解,还提供一些专业前沿的学习资料。

这本书是Bruce Perens开源系列的一部分。本系列的所有图书均以Open Publication License V1.0或更新版本发布的。

《开放式数据结构( C++版)》(Open Data Structures (in C++))

作者 Pat Morin,336页

本书讲授了基本的数据结构设计和分析及在C ++中的实现。它涵盖了序列(列表),队列,优先级队列,无序字典,有序字典以及图的数据结构的实现和分析。作者意图在于为计算机科学专业的学生提供一条研究数据结构的免费途径。但是本书不是一本介绍C++编程语言或C++标准模板库的书,但是它有助于程序员了解STL数据结构如何实现以及为什么这些实现是高效的。

书中章节涵盖了基于数组的列表,链表,分级链表,哈希表,二叉树(包括随机二叉搜索树,替罪羊树和红黑树)。稍后的章节介绍了堆,排序算法(基于比较,计数排序和基数排序),图,整型数据结构和外存搜索。

这本书是根据知识共享署名许可颁发的。我们可以免费阅读这本书的HTML,PDF版本,本书的LaTeX版本,Java / C ++ / Python源码可以从GitHub下载。还有平装版购买。本书已被翻译成斯洛文尼亚语和土耳其语。

《使用wxWidgets跨平台GUI编程》(Cross-Platform GUI Programming with wxWidgets)

作者 Julian Smart,Kevin Hock与Stefan CsomorBrifll,744页

wxWidgets是一个流行的C++库,它允许开发人员使用单一的代码库为Windows,Mac OS X,Linux和其他平台创建应用程序。它支持各种图形库。

本书的简要介绍和入门章节涵盖了以下内容:

  • 事件处理

  • 窗口基础

  • 绘图

  • 输入事件处理

  • 使用sizers窗口布局

  • 使用标准对话框

  • 创建自定义对话框

  • 图像编程

  • 剪贴板和拖放

  • 高级窗口类

  • 数据结构类

  • 文件和流

  • 内存管理,调试和错误检查

  • 编写国际化应用

  • 编写多线程应用程序

  • wxSocket编程

  • 处理文档和视图

  • 完善你的应用程序

这本书是Bruce Perens开源系列的一部分。本系列的所有图书均以Open Publication License V1.0或更新版本发布。

《Rook的C++指南》(The Rook’s Guide to C++)

作者 Jeremy Hansen,160页

书中的章节涵盖变量,文本,常量,输出输入,数据类型和转换,条件判断(if,else和else if,switch语句),字符串,循环,数组,块,函数和作用域。之后的章节对解决问题和问题定位进行了讲述,包括预处理器,高级算法,文件I / O,指针,动态数据,类和抽象,编译分离和STL。

这本书的大部分内容是由25位诺维奇大学的学生在一个黑客马拉松周写的,虽然不够完美,但还是一本不错的书。 它是根据基于Creative Commons Attribution-NonCommercial-ShareAlike 3.0.协议发布许可证发布的,也可以从亚马逊购买纸质版。

《GCC概述》(An Introduction to GCC)

作者 Brian Gough,144页

本书主要介绍了 GNU C 和 C++编译器:gcc 和 g ++。二者都是GNU编译器集合(GCC)的一部分。

书中如何使用编译器本身。作者根据多年来在邮件列表上发表的问题,引导读者直接了解到GCC最重要的部分。

本书章节包括:

  • 简介

  • 编译C程序——介绍如何使用gcc编译C程序。程序可能由单个源文件或多个源文件中编译而成,也可以使用系统库和头文件

  • 编译选项——描述了GCC中可用编译器中常见的其他选项。这些选项对应不同的功能,例如用于设置库和所包含文件的搜索路径,配置额外的警告和诊断信息,预处理器宏和C语言

  • 使用预处理器——描述了GCC包内的GNU C预处理器cpp的使用,预处理器在源文件编译之前扩展了宏。当GCC处理C或C ++程序时,预处理都会自动调用

  • 编译调试——提供-g调试选项,用于在目标文件和可执行文件中存储附加的调试信息。这些调试信息可以将错误信息从特定的机器指令追溯到原始源文件中相应的行

  • 编译优化——GCC是一个优化编译器。它提供了很多选项,旨在提高其生成的可执行文件的速度或减小文件大小

  • 编译C ++程序——描述了如何使用GCC编译用C ++编写程序,以及针对于该语言的命令行选项

  • 平台特定选项——介绍常见平台的一些可用选项,如Intel和AMD x86选项,x86扩展选项,x86 64位处理器选项,DEC Alpha选项,SPARC选项,POWER / PowerPC选项,多体系架构支持以及浮点相关问题

  • 疑难解答(问题定位)——GCC提供了几个帮助和诊断选项,来帮助用户定位编译过程中的问题

  • 与编译器相关的工具——描述了很多与GCC结合使用的工具,包括用于创建库的GNU归档器ar,以及GNU性能和覆盖测试程序,gprof和gcov

  • 编译器如何工作——对GCC如何将源文件转换为可执行文件进行了更详细地描述。编译是一个多阶段的过程,涉及多个工具,包括GNU编译器本身(通过gcc或g++前端),GNU 汇编器as和GNU 链接器ld。在编译过程中使用的一套完整工具集称为工具链

  • 检查编译后的文件——描述了多种有用的工具,用于检查可执行文件和目标文件的内容

  • 常见错误消息——描述 gcc和g ++生成的最常见的错误和警告消息。每个案例都附有错误和警告信息产生原因的描述,以及相应的例子和可能的解决方案和建议

  • 获取帮助——如果读者遇到简介里未涉及的问题,还有多种参考手册更详细地描述了GCC和语言相关的主题