JefferyZhou

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

第一章 Qt 初步实践


  • 集成开发环境: KDevelop , vim

第二章 对话框


  • Q_OBJECT 启动Qt元对象系统的一些特性,比如支持信号与槽等,它必须防止到类定义的私有区。
  • QDialog 类的虚函数 virtual void accept(), 验证对话框的返回值。
  • QLineEdit::setEchoMode(), 设置编辑框对象的内容显示方式,Normal, Password, NoEcho, PasswordEchoOnEdit,
  • QVBoxLayout::setMargin(), 设置边界
  • QVBoxLayout::addStretch(), stretch 可以自由拉伸
  • QString::trimmed() 移除两端的 '\t', '\n', '\v', '\f', '\r' ' '
  • QMesssgeBox::about, QMessageBox::aboutQt, QMessageBox::information, QMessageBox::question, QMessageBox::warning, QMessageBox::critical, 模态消息对话框使用父窗口的图标,后四种对话框都具备返回值。
  • QMessageBox::setDetailedText()
  • 非模态对话框,必须在堆中创建。
  • T qobject_cast(QObject* object); 类型T必须直接或者间接从QObject的类继承, 并且在该类的定义里有Q_OBJECT宏变量(否则返回值是未定义的)
  • QColor::isValid(), 判断颜色对话框返回的颜色值是否有效。
  • QProgressDialog::setWindowModality(Qt::WindowModal); 设置进度模态对话框的话,需要用 qApp->procesEvents() 推动事件循环

第三章 基础窗口控件


  • 一个QLabel和一个窗口部件有伙伴关系,即指当前用户激活标签的快捷键时,鼠标/键盘的焦点将会转移到它的伙伴窗口部件上。只有QLabel标签对象才可以有伙伴窗口部件,也只有该QLabel对象具有快捷键(在显示文本的某个字符前面添加一个前缀“&”,就可以定义快捷键)是,伙伴关系才生效。
  • Q_INIT_RESOURCE(hello); 初始化资源hello.qrc
  • FORMS += ../../hello.ui 告诉qmake,引入文件引入 工程,通过调用setupUi()初始化和部署窗口部件。
  • 多继承情况下,Qt的类必须要放在其他类的前面,这是因为元对象编译器假定第一个继承类是QObject的子类,此外Qt不支持对QObject的虚继承。
  • 不同于回调函数机制,Qt提供了信号和槽机制,信号是一个特定的标识;一个槽就是一个函数,与一般的函数不同,槽函数既可以和信号关联,也可以像普通函数一样直接调用。当某个时间出现时,通过发送信号,可以将与之关联的槽函数激活,即执行槽函数代码。关联方式:一个信号和一个槽关联,一个信号和多个槽关联,多个信号和一个槽关联,一个信号和一个信号进行关联。[Qt::AutoConnection]
  • QTableWidget 与 QTableWidgetItem , insetRow(), insertItem(row, column, item)
  • 信号和槽的自动关联: void on_<窗口部件>_<信号名>_(<信号参数>);
  • QWidget 提供了一些处理窗口部件的几何布局函数,可以分为两类:第一类,包含窗口边框的处理函数,有x(), y(), frameGeometry(), pos() 和 move(); 第二类,有 width(), height(), geometry(), rect(), size(), resize()。
  • QObject::className() 返回类名,QObject::inherits() 判断一个对象是否是某个指定类的子类实例
  • QObject::tr() 和 QObject::trUtf8(), 进行国际化的字符串翻译
  • 属性系统基于元对象系统,通过宏Q_PROPERTY()声明一个属性:必须有一个读函数;一个可选的写函数;一个可选的重置函数,重置函数必须返回void并且没有任何参数;一个可选的DESIGNABLE属性,表明属性是否在GUI构造器中可用,可写属性默认为true,可读属性默认为false;一个可选的SCRIPTABLE,表明脚本引擎是否可以访问该属性,可写属性默认为true,可读属性默认为false;一个可选的STORED特性,表面该属性是否持久的,即当存储一个对象时,是否保存该属性的值,该特性支队可写属性有意义,默认值为true。多重继承的时候,属性必须继承来自第一个父类。
  • Q_ENUMS(enum_type), Q_FLAGS(enum_type)
  • QObject::setProperty() , QObject::property()
  • Qt支持的隐式共享的类:所有容器类,QByteArray, QBitmap, QBrush, QCursor, QDir, QFont, QImage, QPen, QPalette, QPixmap, QVariant.

第四章


第五章 布局管理


  • 绝对位置方式:setGeometry();手工布局方式:重载QWidget::resizeEvent(QResizeEvent*);布局管理器方式:Q*Layout。
  • QWorkSpace, QDockWidget, QStackedWidget, QSplitter, QMdiArea

第六章 2D 绘图


  • drawTiledPixmap() 平铺图形
  • QPicture 存储QPainter 指令,将绘图指令串行化为平台无关的格式存储。
  • Qt 支持 RGB, HSV, CMYK 颜色模型。RGB是面向硬件的模型,颜色由红, 绿, 蓝三种基本色混合而成。HSV模型则比较符合人对颜色的感觉,由色调(0 ~ 359), 饱和度(0 ~ 255), 亮度(0~255)组成。CMYK,由青,洋红,黄,黑四种基色组成,主要用在打印机等硬拷贝设备上,每个颜色分量的取值为0~255。另外QColor还可以使用SVG1.0中定义的任何颜色名为参数初始化。
  • Qt 提供了渐变填充的画刷,渐变填充包括两个要素:颜色的变化和路径的变化。颜色的变化可以指定从一种颜色渐变到另外一种颜色,也可以在变化的路径上指定一些点的颜色进行分段渐变。在Qt4中,提供了三种渐变填充:线性(QLinearGradient),圆形(QRadicalGradient),圆锥渐变(QConicalGradient)。所有类均从QGradient类继承。其中线性见比昂指定控制点,画刷在控制点之间进行颜色插值。圆形渐变需要指定圆心,半径和焦点,画刷在焦点和圆上的所有点之间进行颜色插值。圆锥渐变需要指定圆心和开始角,画刷沿着圆心逆时针对颜色进行插值。
  • 关闭窗口部件的双缓冲:widget->setAttribute(Qt::WA_PaintOnScreen)
  • Qt4 能够支持Alpha通道。通过使用Alpha通道,可以实现半透明效果。QColor类中定义了Alpha通道的透明度,0表示完全透明,255表示完全不透明,默认情况下是完全不透明。(Qt使用的Alpha公式:color = color_src * alpha_src + color_dest * (255 - alpha_src), alpha = src_alpha)
  • QBitMap 从 QPixmap 继承,QBitMap表示单色的pixmap,主要用来创建自定义的QCursor和QBrush对象,构造QRegion对象,设置pixmap和窗口部件的掩码。
  • 当QPainter 绘制指定的字体中不存在的字符时,将绘制一个空心的正方形。
  • Qt提供了4个处理图像的类:QImage,QPixmap,QBitMap和QPicture。他们有各自的特点,QImage优化了IO操作,可以直接存取操作像素数据;QPixmap主要用来在屏幕上显示图像;QBitMap从QPixmap继承,只能表示两种颜色;QPicture是可以记录和重放QPainter命令的类。
  • QImage的颜色数据格式,QRgb 实际是无符号整形数,存储ARGB的格式是0xAARRGGBB。32位的图像直接存储;单色图像使用一位的索引指向只有两种颜色的调色板,有两种类型的单色图big endian(MSB)和little endian(LSB);256色的图使用8位索引的调色板。颜色数据有三种类型的存储格式:RGB,ARGB和已预乘的ARGB。

第十一章 Qt 线程


  • 在具有图形用户界面的Qt应用程序中,主线程由GUI线程充当,该线程是Qt中唯一可以进行GUI相关操作的线程,即一个具有图形节目的Qt应用程序只能有一个GUI线程。
  • GUI线程是唯一一个允许创建QApplication对象并且对它调用exec()函数的线程。
  • QObject::moveToThread()函数改变QObject对象所属的线程,但是如果这个QObject对象有父对象将无法移动,在QApplication对象创建前构造的QObject对象的thread()函数返回0,也就意味着主线程只处理这些QObject对象的posted事件,而不处理其他事件,原因是这些QObject对象不属于任何线程。任何时候调用QApplication::postEvent()函数向任意线程创建的对象发消息,这个消息最终都会被派发到创建这个对象所属的事件循环。
  • 删除属于其他线程的QObject,必须使用QObject::deleteLater()函数发出一个DeferredDelete事件,并最终被目标QObject对象所属的事件循环接受处理
  • 线程本地存储,QThreadStorage<TYPE_PTR>, 模板类,只能存储指针,setLocalData()为调用线程存储一份独立的数据,这个数据通过localData()函数访问,并且持有的数据只能是new出来的。hasLocalData()可以查询算法已经设置了本地数据,当线程退出的时候,会自动释放拥有的数据。
  • 如果所启动的线程中没有事件循环,那么事件将不会发往该线程创建的QObject对象。
  • QObject对象还必须遵循如下约束:QObject子对象必须在其父对象的线程中创建;事件驱动类只能用于单线程;必须保证在某个线程中创建的所有对象在该线程释放前首先被释放。
  • 当信号的发送者和接受者分别属于不同的现场且接受者线程存在自身的事件循环时,使用直接连接方式是不安全的。
  • QtConcurrent 提供并行计算能力,QFuture类返回计算结果,提供QFutureWatcher类,监视QFuture。

第十二章 事件处理


  • Qt中定义的事件是一个从QEvent类继承而来的对象,它表示应用程序内部或外部发生了某些应用程序自身必须知道的事情。任何从QObject类派生的对象均可以通过QObject::event()方法接受事件。
  • 事件处理方法,重新实现事件处理接口,类似mousePressEvent();重新实现QObject::event()函数,可以在事件到达特定的事件处理接口前处理它们;在QObject中注册事件过滤器,目标对象中的所有事件首先发送给这个监视对象的eventFilter();在QApplication中注册事件过滤器,如果事件过滤器被注册到程序中唯一的QApplication对象上,应用程序中所有对象的每一个事件在它们被送达其他事件过滤器前,首先抵达这个eventFilter()函数;继承QApplication并重新实现notify()函数,重新实现这个函数是在事件过滤器得到所有事件前获得它们的唯一方法。
  • 如果事件到达目标对象之前没有被截获处理,或者没有被它的目标对象处理,那么此时,目标对象的父对象将变成新的目标对象,整个事件处理将重复进行,直到该事件被处理或者到达顶层对象。
  • Qt中加快用户界面响应通常有三种方法:第一种方法是使用线程;第二种是在处理耗时事件时频繁调用QApplication::processEvents();第三种方法是推迟耗时事件处理,直到应用程序空闲下来。
  • Qt中有一个0毫秒计时器,只要主循环中没有未被处理的事件,这个定时器就会被触发。

第十四章 界面风格


  • QWidget::repaint() 和 QWidget::update()的区别,QWidget::repaint()函数会导致Qt立即调用QWidget::paintEvent()进行界面重绘,而QWidget::update函数不会导致人机界面的立即重绘,只有当Qt应用程序返回到主事件循环,Qt才会调度一个绘制事件。
  • Qt的样式表对大小写不敏感,但对类名,对象名和属性名大小写敏感。

第十五章 XML


  • Qt 支持 DOM Level 2 规范

第十六章 模型视图结构


  • Qt 的模型视图结构分为三部分:模型,视图和代理。模型和数据源通信,并为其他部件提供接口。视图从模型中获取模型索引,模型索引用来引用数据条目。在视图中,代理负责绘制数据条目,当编辑条目时,代理和模型直接进行通信。
  • 模型,视图和代理之间通过信号和槽进行通信,其关系如下: 数据发生改变时,模型发出信号通知视图;用户对界面进行了操作,视图发出信号;代理发出信号告知模型和视图编辑器目前的状态;
  • 模型索引只是提供了临时索引信息,因为模型可能对内部的结果进行重新组织,所以模型索引可能在下一次使用时失效。如果索引要长期引用,可以使用QPersistentModelIndex类保存模型索引。
  • 如果想对模型的数据进行处理,如进行排序和过滤,可以使用代理模型。代理模型提供了模型和视图之间的数据处理代理,使得源模型和视图之间的数据能够进行一些特殊的处理。Qt提供了QSortFilterProxyModel代理模型完成排序和过滤操作。
  • 通常情况下,如果要使用定制的视图,可以通过实现条目代理来完成。
  • Qt使用抽象类QAbstractItemDelegate作为代理类的基类。用户实现代理类时,至少要实现两个纯虚函数,其中,paint()函数完成绘制,sizeHint()函数返回条目的尺寸。大部分情况下,可以直接从Qt已经实现的通用QItemDelegate类继承,以减少代码量。
  • 对于不同的数据类型,QItemDelegate提供了默认的编辑方式。也可以通过QItemEditorFactory类来注册特定的数据类型编辑器。

十八章 进程与进程间通信


  • 从Qt4.2版本引入了一项新的进程间通信技术D-Bus,并提供了相应的变成模块QtBus。
  • 常说的"进程间通信"是指有一定效率要求的通信手段,通常由操作系统内核提供支持,具体而言包括消息队列,信号量,共享存储,SOCKET管道(包括普通管道,流管道和命名管道)。
  • 共享内存和本地Socket是实现单机进程间通信的两种常见方法,Qt从4.4版本开始对这两个方面进行了支持,主要包括QSharedMemory,QLocalSocket和QLocalServer类。
  • D-Bus 是一种进程间通信(IPC,Inter Process Communication)和远程调用(RPC,Remote Procedure Call)机制,最初为Linux系统开发,它用一套统一的协议替代现有系统中相互竞争的IPC方案。它的设计同样支持系统级进行和普通用户进程间的通信。D-Bus是一种高速的二进制消息传输协议,具有低延时和低开销的特点,非常适合本机通信。
posted on 2012-09-24 17:06  JefferyZhou  阅读(4971)  评论(0编辑  收藏  举报