C++ GUI Qt4编程--阅读笔记(原创)
由 王宇 原创并发布 :
第一章Qt入门
1.1HellowQt
qmake-project
qmakehello.pro
make
1.2建立连接
QObject::connect(button,SIGNAL(clicked()),&app,SLOT(quit());
1.3窗口部件的布局
1.4使用参考文档:QtAssistant
第二章创建对话框
2.1子类化QDialog
2.2深入介绍信号和槽
connect(sender,SIGNAL(signal),receiver,SLOT(slot))
一个信号可以连接多个槽
多个信号可以连接同一个槽
一个信号可以与另外一个信号相连接
连接可以被移除
2.3快速设计对话框
QtDesigner
主程序:UI::GoToCellDiaglogui;QDialog*dialog=newQDialog();ui.setUi(dialog);dialog->show();
2.4改变形状的对话框
扩展对话框
扩展对话框通常只显示简单的外观,但是他还有一个切换按键,可以让用户在对话框的简单外观和扩展外观之间来回切换
多页对话框:QTabWidget
2.5动态对话框
动态对话框就是在程序运行是使用的从Qt设计师的.ui文件创建而来的那些对话框。动态对话框不需要通过uic把.ui文件转换成C++代码,相反它是程序运行的时候使用QUiLoader类载入该文件的
QUiLoaderuiLoader;QFilefile("sortdialog.ui");QWidget*sortDialog=uiLoader.load(&file);
2.6内置的窗口部件类和对话框类
Qt的按键部件
QPushButton、QToolButton、QCheckBox、QRadioButton
Qt的显示窗口部件
QLabel、QLCDNumber、QProgreeBar、QTextBrowser
Qt的输入窗口部件
QTextEdit、QSpinBox、QDoubleBox、QComboBox、QDataEdit、QTimeEdit、QDateTimeEdit、QScrollBar
Qt单页容器窗口部件
QGroupBox、QFrame、QTabWidget、QToolBox
Qt的项目视图窗口部件
QListView、QTreeView、QTableView
Qt的反馈对话框
QMessageBox、QInputDialog、QProgressDialog、QErrorMesage
Qt的颜色对话框和字体对话框
QColoerDialogQFontDialog
Qt文件对话框和打印对话框
QFileDialog、QPrintDialog
第三章创建主窗口
3.1子类化QMainWindow
3.2创建菜单和工具栏
3.3设置状态栏
3.4实现File菜单
3.5使用对话框
3.6存储设置
3.7多文档
3.8程序启动动画
第四章实现应用程序的功能
第五章创建自定义窗口部件
5.1自定义Qt窗口部件
通过继承子类的方法
5.2子类化QWidget
许多自定义窗口部件都是对现有窗口部件的简单组合,不论它们是内置的Qt窗口部件,还是其他一些部件,通过对现有窗口部件的组合构建而成的自定义窗口部件
5.3在Qt设计师中集成自定义窗口部件
改进法是最快捷和简单的方法
改进法的缺点:在QTDesigner中,无法对自定义窗口部件中的那些特定属性进行访问,并且也无法对这个窗口部件自身进行绘制
插入法需要创建一个插件库,QtDesigter可以在运行时加载这个库,并且可以利用该库创建窗口部件的实例
5.4双缓冲
是一种图形用户界面编程技术,它包括把一个窗口部件渲染到一个脱屏像素映射中以及把这个像素映射复制到显示器上
第六章布局管理
布局类:QHBoxLayout、QVBoxLayout、QGridLayout、QStractLayout
6.1在窗口中摆放窗口部件
绝对位置法:窗口部件分配固定的大小和位置
人工布句法:给定的大小尺寸总是可以和窗口的大小成比例
布局管理法:QHBoxLayout、QVBoxLayout、QGridLayout
6.2分组布局
QStackedLayout类可以对一组子窗口部件进行摆放,或者对它们进行“分页”,而且一次只显示其中一个,而把其他的子窗口部件或者分页都隐藏起来
6.3切分窗口
QSplitter就是一个可以包含一些其他窗口部件的窗口部件。例如资源管理器中的左右结构
6.4滚动区域
QScrollArea类提供了一个可以滚动的视口和两个滚动条
6.5停靠窗口和工具栏
停靠窗口是指一些可以停靠在QMainWindow中或是浮动为独立窗口
四个停靠窗口区域:
中央窗口部件的上部、下部、左侧、右侧
6.6多文档界面
第七章事件处理
事件是有窗口系统或者Qt自身产生的,用以响应所发生的各类事情
不应该混淆“事件”和“信号”这两个概念。一般情况下,在使用窗口部件的时候,信号是十分有用的;而在实现窗口部件时,事件则是十分有用的
例如,当使用QPushButton时,我们对于它的clicked()信号往往更为关注,而很少关心促成发射该信号的底层鼠标或者键盘事件
7.1重新实现事件处理器
7.2安装事件过滤器
5个级别的事件处理和事件过滤方法
1、重新实现特殊的事件处理器
2、重新实现QObjec::event();
3、在QObject中安装事件过滤器
4、在QApplication对象中安装事件过滤器
5、子类化QApplication并且重新实现notify()
7.3处理密集时的响应保持
第八章二维图形
Qt的二维图形引擎是基于QPainter类的
几何形状:点、线、矩形、椭圆、饼状图等
高级特性:反走样(文字和图形边缘)、像素混合、渐变填充和矢量路径
QPainter可以画在“绘图设备”上,例如:QWideget、QPixmap、QImage;也可以用来打印文件和创建PDF
可以使用OpenGL命令来替代QPainter
8.1用QPainter绘图
三个主要工具:画笔、画刷、字体
画笔用来画线和边缘。它包括颜色、宽度、线形、拐点风格及连接风格
画刷用来填充几个形状的图案
字体用来绘制文字。
QPainterPath类可以通过连接基本的图形元素来确定任意的矢量形状:直线、椭圆、多边形、弧形和其他的绘制路径
绘制路径是基本的图元,从这个意义上来说,任何图形或图形组合都可以用绘制路径描述
8.2坐标系统变换
理论上,像素的中心取决于半像素坐标。
如果告诉QPainter绘制一个像素。例如:(100,100)它会相应地在两个方向做+0.5的偏移,使得像素点得中心位置在(100.5,100,5)
这一差别初看起来理论性很强,但它在实践中却很重要。首先只有当反走样无效时(默认情况)才偏移+0.5;如果反走样有效,并且我们试图在(100,100)的位置绘制一个黑色的像素,实际上QPainter会为(99.5,99.5)(99.5,100.5)(100,5,99.5)(100.5,100.5)四个像素点着浅灰色,给人的印象是一个像素正好位于四个像素的重合处
如果不需要这种效果,可以通过指定半像素坐标或者通过偏移QPainter(+0.5,+0.5)来避免这种效果的出现
世界变换是在窗口-视口转换之外使用的变换矩阵。它允许移动、缩放、旋转或者拉伸绘制的项
8.3用QImage高质量绘图
绘图时,我们可能需要面对速度和准确率的折中问题
Qt受限于平台的内在支持:
在X11上,类似反走样以及对分数坐标的支持只有当X服务器上存在X渲染扩展时才有效
在MacOSX上,内置的走样绘图引擎使用与X11和Windows不同的算法绘制多边形,绘制结果也稍有不同
Qt图形引擎的一个特别强大的特性是它支持复合模式
默认的复合模式是QImage::CompositionMode_SourceOver,这意味着源像素(正在绘制的像素)被混合在目的像素(已存在的像素)上,这样,源图像的透明部分给我们以透明效果
8.4基于项的图形视图
如果需要处理从几个到几万的项时,而且要求用户能够点击、拖动、和选取项,Qt的视图类提供了对这一个问题的解决方案
Qt的视图体系包括一个由QGraphicScene充当的场景和一些由QGraphicItem的子类充当
8.5打印
Qt中的打印与在QWidget、QPixmap或者QImage上的绘制非常相似,它包含以下步骤:
1、创建一个当作绘制设备的QPrinter.
2、弹出一个QPrinterDialog对话框,以允许用户选择打印机并且设置一些选项
3、创建一个在QPrinter上操作的QPainter
4、使用QPainter绘制一页
5、调用QPainter::newPage()来进行下一页的绘制
6、重复步骤4和步骤5,直到所有页都被打印为止
第九章拖放
拖放是在一个应用程序内或者多个应用程序之间传递信号的一种直观的现代操作方式
9.1使拖放生效
当用户把一个对象拖动到这个窗口部件上时,就会调用dragEnterEvent()
当用户在窗口部件上放下一个对象时,就会调用dropEvent()
QWidget也提供dragMoveEvent()和dragLeaveEvent()
9.2支持自定义拖动类型
9.3剪贴板处理技术
第十章项视图类
第十一章容器类
容器类通常是用于在内存中存储给定类型的许多项的模板类
既可以使用Qt容器也可以使用STL容器
Qt容易的主要优点是它们在所有的平台上在运行时都表现得一致,并且它们都是隐含共享的
隐含共享或者称为“写时复制”是一个能够把整个容器作为不需要太多运行成本的值来传递的最优化过程
Qt容器的另一个主要特征就是易于使用的迭代器类,这是从java中得到的灵感,它们可以利用QDataStream变成数据流,而且它们通常可以使可执行文件中的代码量比相应的STL类中的要少
最后在Qt/EmbededLinux支持的一些硬件平台上,通常只能使用Qt容器
Qt提供了:QVector
QString、QByteArrag和QVariant与容器有很多相似之处
11.1连续容器
QVector
向量与普通C++数组的区别在于:向量知道自己的大小并且可以被重新定义大小
对比较大的向量来说,在QVector
QList
除非我们想在一个极大的列表中执行插入或者要求列表中的元素都必须占据连续的内存地址,否则QList
QStringList类是被广泛用于Qt应用编程接口的QList
11.2并联容器
并联容器可以保存任意多个具有相同类型的项,且它们由一个键索引:主要提供:QMap
QMap
QHash
11.3通过算法
qFind(list.begin(),list.end(),"key");
qFill组装一个容器
qCopy()
qSort()、qStableSort()
qDeleteAll()
qSwap()
11.4字符串、字节组和变量
QString、QByteArray、QVariant使用隐含共享来最优化内存和速度
QString不仅仅是为用户界面,更多的是为数据结构所用
QString转换为constchar*,可以使用toAscii()或toLatin1()
QByteArray上调用data()或constData()时,返回的字符串属于QByteArray对象。这就意味着不必为内存泄漏而担心,Qt将为我们重新收回内存
另一方面,必须注意不要太长时间地使用指针
第十二章输入与输出
从文件或者其他设备读取或者写入数据几乎是每个应用程序共有的特点
Qt通过QIODevice为输入输出提供了极佳的支持
QIODevice是一个封装能够读写字节块“设备”的强有力的提取器
QFile
QTemporaryFile
QBuffer
QProcess
QTcpSocket
QUdpSoclet
QSslSocket
QProcess、QTcpSocket、QUdpSocket和SslSocket都是顺序存储设备,这意味着所存储的数据从第一个字节开始到最后一个字节为止只能读取一次
QFile、QTemporayFile和QBuffer则是随机存取设备,因此可以从任意位置多次读取字节位所存储的数据
QDataStream用来多写二进制数据,QTextStream用来读写文本数据
QFile使存取单个文件变得简单
QProcess类允许启动外部程序并通过标准输入、输出以及标准错误通道与外部程序交互
网络与XML的读写,都是非常重要的主题
12.1读取和写入二进制数据
Qt中载入和保存二进制数据的最简单方式是通过实例化一个QFile打开文件,然后通过QDataStream对象存取它
QDataStream提供了一种与运行平台无关的存储格式,它不仅支持QList
12.2读取和写入文本
Qt提供了QTextStream类读写纯文本文件以及如HTML、XML和源代码等其他文件格式的文件
QText Stream
第十三章数据库
QSqlDatabase QSqlQuery QSqlTableModel QTableView QSqlTableModel
第十四章多线程
QT hread QMutex QReadWriteLock QSemaphore QWaitCondition
第十五章网络
第十六章XML
QXmlStreamReader QXmlSimpleReader QXmlStreamWriter
第十七章提供在线帮助
第十八章国际化
第十九章自定义外观
第二十章三维图形
第二十一章创建插件
第二十二章应用程序脚本