最近在网上看到一个Qt学习之路系列,初步浏览了一下。觉得不错。目前网上的系列学习文章并不太多,先从这个开始学起吧。
打算看完这个再看《C++ GUI Programming with Qt4》
http://devbean.blog.51cto.com/448512/d-8
Qt学习之路(1):前言 http://www.qteverywhere.com/archives/466
C++ GUI编程:以前就用过MFC,现在了解了Qt,还有wxWidget, gtk++
Qt:问题:非原生风格,要用qmake预处理。
优点:SIGNAL/SLOT机制,跨平台。
LGPL。这意味着,你可以将Qt作为一个库连 接到一个闭源软件里面
Qt学习之路(2):Hello, world! http://www.qteverywhere.com/archives/468
Qt的安装地址:https://qt.nokia.com/downloads
Qt的开发环境:目前用VS2005+qt-vsintegration-1.4.3开发windows上运行环境。
Qt Creator编译symbian模拟器上运行。
pro就是工程文件(project),它是 qmake自动生成的用于生产makefile的配置文件
Qt学习之路(3):Hello, world!(续) http://www.qteverywhere.com/archives/480
main函数中要有一个QApplication对象,传入argc, argv参数。
Widget等同于Windows技术里面的控件(controls)和容器(containers),大多数Qt程序使用QMainWindow或者QDialog作为顶级组件
组件创建出来之后通常是不可见的,使用show方法显示,避免出现之后在屏幕上面会有闪烁
exec()程序的事件循环就开始了
注意,我们并没有使用delete去删除创建的QLabel,因为在程序结束后操作系统会回收这个空间
qmake -project 命令创建.pro文件
qmake helloworld.pro (make)或者qmake -tp vc helloworld.pro (nmake)生成makefile,然后才能调用make或者是nmake进行编译
Qt也是支持HTML解析的。
Qt学习之路(4):初探信号槽 http://www.qteverywhere.com/archives/485
就像是插销一样:一个插头和一个插座。也类似与回调函数,触发等。
QObject里面有一个connect静态函数,用于连接信号槽
Qt使用信号槽机制完成了事件监听操作
Qt学习之路(5):组件布局
只要把组件放入某一种布局之中,当需要调整大小或者位置的时候,Qt就知道该怎样进行调整
layout使用addWidget添加组件,使用addLayout可以添加子布局 QHBoxLayout/QVBoxLayout/QGridBoxLayout
Qt学习之路(6): API文档的使用
Qt Assistant
Qt学习之路(7/8): 创建一个对话框
所谓前向声明就是告诉编译器,我要用这几个类。因为仅仅使用的是指针,并不涉及到这些类的函数,因此并不需要include它们的头文件
Q_OBJECT。这是一个宏。凡是定义信号槽的类都必须声明这个宏。
signal:,这是Qt的关键字,对信号的定义
private slots:是私有的槽的定义。
我们最好只引入需要的组件
构造函数有参数初始化列表,用来调用父类的构造函数
函数tr()全名是 QObject::tr(),被它处理的字符串可以使用工具提取出来翻译成其他语言,也就是做国际化使用。
所有使用了Q_OBJECT宏的类都自动具有tr()函数
字符串中的&代表快捷键ALT+xxx
label使用了setBuddy函数,它的意思是,当label获得焦点时,比如按下Alt+W,它的焦点会自动传给它的 buddy
connect()函数也是QObject的,因为我们继承了QObject,所以能够直接使用。
rightLayout的addStretch()添加的,就像弹簧一样,把上面的组件“顶起来”。
Qt学习之路(9):深入了解信号槽
槽函数和普通的C++成员函数没有很大的区别。它们也可以使virtual的;可以被重写;可以使public、protected或者 private的;可以由其它的C++函数调用;参数可以是任何类型的。如果要说区别,那就是,槽函数可以和一个信号相连接,当这个信号发生时,它可以被自动调用。
connect( sender, SIGNAL( signal ) , receiver, SLOT( slot) ) ;
一个信号可以和多个槽相连:但是它们的调用顺序是不确定的。
多个信号可以连接到一个槽
一个信号可以连接到另外的一个信号
槽可以被取消链接disconnect( lcd, SIGNAL( overflow( ) ) , this , SLOT( handleMathError( ) ) ) ; 当一个对象delete之后,Qt自动取消所有连接到这个对象上面的槽。
信号和槽的参数个数、类型以及出现的顺序都必须相同
如果信号的参数多于槽的参数,那么这个参数之后的那些参数都会被忽略
Qt学习之路(10): Meta-Object系统
Qt提出了一个Meta-Object系统。它提供了两个关键的作用:信号槽和内省。
内省又称为反射,允许程序在运行时获得类的相关信息,也就是meta-information,也就是“元信息”
Qt提供了一个独立的工具,moc,通过定义Q_OBJECT宏实现到标准C++函数的转变
首先,Q_OBJECT宏声明了一些QObject子类必须实现的内省的函数,如metaObject(),tr(),qt_metacall()等;
第二,Qt的moc工具实现Q_OBJECT宏声明的函数和所有信号;
第三,QObject成员函数connect()和disconnect()使用这些内省函数实现信号槽的连接。
Qt学习之路(11): MainWindow
QMainWindow窗口分成几个主要的区域:Title /MenuBar/ToolsBar/Dock Window areas/Central Widget/Status Bar
Qt学习之路(12/13): 菜单和工具条
QAction类保存有关于这个动作,也就是action的信息,比如它的文本描述、图标、快捷键、回调函数(也就是信号槽)
QAction能够根据添加的位置来改变自己的样子 ——如果添加到菜单中,就会显示成一个菜单项;如果添加到工具条,就会显示成一个按钮
当这个父组件被销毁时,比如 delete或者由系统自动销毁,与其相关联的这个QAction也会自动被销毁。
QMainWindow有一个menuBar()函数,会返回菜单栏.如果不存在会自动创建,如果已经存在就返回那个菜单栏的指针。
qrc其实是Qt Recource Collection的缩写
QToolBar的图标大小默认是32*32,菜单默认是16*16。如果提供的图标小于要求的尺寸,则不做操作,Qt不会为你放大图片;反之,如果提供的图标文件大于相应的尺寸要求,比如是64*64,Qt会自动缩小尺寸。(菜单图标添加失败,没有用qtcreator)
Qt学习之路(14): 状态栏
statusBar()函数,用于实现状态栏的调用
在Qt里面,状态栏显示的信息有三种类型:临时信息、一般信息和永久信息
QStatusBar右下角的大小控制点可以通过setSizeGripEnabled()函数来设置是否存在
Qt学习之路(15): Qt标准对话框之QFileDialog
QFileDialog是Qt中用于文件打开和保存的对话框QFileDialog:: getOpenFileName/ QFileDialog:: getSaveFileName
QFileDialog setWindowTitle/setDirectory/setFilter/setAcceptMode/exec/selectedFiles
Qt学习之路(16): Qt标准对话框之QColorDialog
QColor color = QColorDialog::getColor(Qt::white, this);
Qt学习之路(17): Qt标准对话框之QMeageBox
QMessageBox::information/
是static的
Qt学习之路(18): Qt标准对话框之QIutDialog
QString text = QInputDialog::getText
还有getInteger,getDouble,getItem三个类似的函数
Qt学习之路(19): 事件(event)
对于事件,Qt使用一个事件队列对所有发出的事件进行维护,当新的事件产生时,会被追加到事件队列的尾部,前一个事件完成后,取出后面的事件进行处理。
在Qt中,需要我们关心的事件总会发出一个信号。
如果我们使用组件,我们关心的是信号槽;如果我们自定义组件,我们关心的是事件。因为我们可以通过事件来改变组件的默认操作。比如,如果我们要自定义一个 QPushButton,那么我们就需要重写它的鼠标点击事件和键盘处理事件,并且在恰当的时候发出clicked()信号。
当事件发生时,Qt将创建一个事件对象。Qt的所有事件都继承于 QEvent类。在事件对象创建完毕后,Qt将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)。
Qt学习之路(20): 事件接收与忽略
把Qt的事件传递看成链状:如果子类没有处理这个事件,就会继续向其他类传递
如果希望忽略事件,只要调用父类的响应函数即可。
Qt学习之路(38): model-view架构
MVC模型。model-view-controller模型,即模型-视图-控制器
模型负责获取需要显示的数据
视图用于将模型数据显示给用户
控制器是模型和视图之间的媒介,
Qt的model-view架构. 对于控制器部分,Qt使用的是另外的一种抽象,代理delegate。代理被用来提供对item渲染和编辑的控制
对于很大的数据,我们则需要使用Qt的view类,比如QListView,QTabelView和QTreeView,同时需要提供一个model
Qt学习之路(44): QSortFilterProxyModel
QSortFilterProxyModel并不能单独使用,它只是一个“代理”,真正的数据需要另外的一个model提供,并且它是用来排序和过滤的。所谓过滤,也就是说按照你输入的内容进行数据的筛选,很像Excel里面的过滤器。不过Qt提供的过滤功能是基于正则表达式的
Qt学习之路(45/46/47): 自定义model之一/二/三
一个model中的每个数据元素都有一个model索引。
每个数据元素还要有一组属性值
list model而言,要定位其中的一个数据只需要有一个行号就可以
table model而言,这种定位需要有两个值:行号和列号
对于tree model而言,用于定位的可以是这个元素的父节点
CurrencyModel就是这样一个model。它底层的数据使用一个QMap<QString, double>类型的数据