## 8.3 代码创建主窗口
本实例实现一个基本的主窗口程序,包含一个菜单条、一个工具栏、中央可编辑窗体及状态栏。实现的效果如图 8-2 所示。
### 8.3.1 头文件
主窗口头文件代码如下:
```
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class QAction;
class QMenu;
class QToolBar;
class QTextEdit;
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow();
void createMenus();
void createActions();
void createToolBars();
void createStatusBar();
public slots:
void slotNewFile();
void slotOpenFile();
void slotSaveFile();
void slotCopy();
void slotCut();
void slotPaste();
void slotAbout();
private:
QTextCodec *codec;
QMenu *menuFile;
QMenu *menuEdit;
QMenu *menuAbout;
QToolBar *toolBarFile;
QToolBar *toolBarEdit;
QAction *actionOpenFile;
QAction *actionNewFile;
QAction *actionSaveFile;
QAction *actionExit;
QAction *actionCopy;
QAction *actionCut;
QAction *actionPaste;
QAction *actionAboutQt;
QTextEdit * text;
#endif // MAINWINDOW_H
```
第 1 和第 2 句定义头文件包含卫哨,目的是防止重复包含头文件,这两句与结尾的第 42 句结合在一起使用才是完整的。
第 3 句包含了 QMainWindow 的定义,它是主窗口类的基类。
第 4 至第 7 句对程序下文中可能用到的类进行前置声明( forward declaration)。它 们会告诉编译器,我们用到的这些类已经存在了,并且不需要知道这些类的完整定义。我们 为什么要这样做,而不是将它们的头文件包含进来呢?这主要是由于在程序下文中,我们只 是简单的定义了指向这些类的对象的指针,而并没有涉及到该类的其他方面。
这样做的好处,一是避免了头文件被其他文件多次包含,尤其是在头文件中包含头文 件时,容易造成重复包含和产生包含顺序问题,并且增大了文件的体积;二是提高了编译速 度,因为编译器只需知道该类已经被定义了,而无需了解定义的细节。
小贴士:尽量不要在头文件中包含另外的头文件 一种好的编程风格是,尽量在头文件中使用类前置声明程序下文中要用到的类,实在需要包含其它的头文件时,可以把它放在我们的类实现文件中。在下面的程序中,你将会看到这个准则的应用。
第 8 句声明了我们的 MainWindow 类是派生自 QMainWindow。
第 10 句的 Q_OBJECT 宏对于所有使用了信号/槽机制的类而言是必需的,同时它要求被 放置在类声明的开始处。
第 12 句声明了我们的主窗口类 MainWindow 的构造函数。
在第 13 至第 16 句中,createActions()函数用于创建程序中用到的动作(Action), createMenus()函数用于创建菜单(Menu),createToolBars()函数用于创建工具栏(ToolBar),CreateStatusBar()函数用于创建状态栏(StatusBar)。接着声明了用到的槽函数,如“新建文件”、“打开文件”等。最后声明了实现主窗口所需的各个元素,包 括菜单项、工具条以及各个动作等。
第 17 至第 24 行,声明了类的槽,这里我们把它们定义为公有的,并且返回值均为 void。需要注意的是,槽同样可以被当做普通函数被调用,这时它的返回值对我们而言与调 用一个普通的 C++函数产生的返回值并无二致。而当槽作为一个信号的响应函数而被执行 时,它的返回值会被程序忽略。也就是说, 不使用信号,我们也可以正常调用槽函数来完 成一些事情。
第 25 至第 40 行,声明了用于实现主窗口所需的各种元素,主要包括 菜单项、工具 条、状态条以及各种动作等,它们是类的成员变量,通常我们被声明为私有的。
### 8.3.2实现文件
下面我们分析一下主窗口类的实现文件。
1\.构造函数
```
#include "mainwindow.h"
#include <QtGui>
// 主窗口实现
CMyMainWindow:: CMyMainWindow()
{
setWindowTitle(tr("MyMainWindow"));
text = new QTextEdit(this);
setCentralWidget(text);
createActions();
createMenu();
createToolBars();
createStatusBar();
}
```
第 1 行引用主窗口类的头文件。
第 2 行引入 QtGui 模块。
小贴士:在 qmake 工程中,默认情况下已经包含了 QtCore 和 QtGui 模块,因此无需配置就 可以使用这两个模块中的类。如果不想使用 QtGui 模块,而仅仅使用 QtCore,就可以在 qmake 工程文件中通过使用”QT -= gui”来取消 QtGui 模块的包含。而对于 Qt 的其他模 块,在使用之前必须在 qmake 工程文件中通过 QT 选项进行配置。在下面的章节中,我们会 有说明。
一般可以在应用程序中通过#include <QtGui/QtGui>来包含整个 QtGui 模块的所有类 的头文件,其中第一个 QtGui 是模块名,第二个 QtGui 是 QtGui 模块(文件夹)下的预定 义头文件;还有一种方法是使用#include <QtGui>,这时 QtGui 表示模块下的预定义头文 件。也可以单独包含某个类的头文件,比如在我们这个主窗口类中引入的 #include
<QMainWindow>,或者#include<QtGui/QMainWindow>。
第 5 行设置主窗口的标题,注意我们在程序中并没有使用任何中文的表示方法,因为 这是我们所不提倡的。在这里,你只需知道尽量不要在程序中的任何地方使用汉字,包括注 释,而我们有显示汉字和其他语言形式的方法。但是为了向大家讲解程序方便,我们会在注 释中使用一些汉字。
setWindowTitle 是继承自 QWidget 的方法,它的原型是 void setWindowTitle( const QString & )。再次提醒,要时刻记得 QMainWindow 是继承自 QWidget 的,所以 QWidget 的公有方法,在 QMainWindow 中也有。
第 6 行实例化 QTextEdit 的对象 text,参数 this 指针表示其父窗口为主窗口 CMyMainWindow。
第 7 行设置主窗口的中心窗口部件为 text。在前面我们曾经提到,Qt 主窗口应用程序 中,中心窗口部件是不可或缺的,通常只要是继承自 QWidget 的窗口部件的实例都可以用 作中心窗口部件。在本章的后面我们还会对中心窗口部件做详细的讲解。
第 8、9、10、11 行依次创建动作、主菜单、工具栏和状态栏。
2\.创建动作
菜单与工具栏都与 QAction 类密切相关,工具栏上的功能按钮与菜单中的选项条目相 对应,完成相同的功能,使用相同的快捷键与图标。 QAction 类为用户提供了一个统一的命 令接口,无论是从菜单触发还是从工具栏触发,或快捷键触发都调用同样的操作接口,达到 同样的目的。以下是各个动作(Action)的实现代码:
```
void CMyMainWindow::createActions()
{
// open file action “打开”动作
actionOpenFile = new QAction(QIcon(":/images/open.png"),tr("Open"),this);
actionOpenFile->setShortcut(tr("Ctrl+O"));
actionOpenFile->setStatusTip(tr("open a file"));
connect(actionOpenFile,SIGNAL(triggered()),this,SLOT(slotOpenFile()));
// new file action “新建”动作
actionNewFile = new QAction(QIcon(":/images/new.png"),tr("New"),this);
actionNewFile->setShortcut(tr("Ctrl+N"));
actionNewFile->setStatusTip(tr("new file"));
connect(actionNewFile,SIGNAL(triggered()),this,SLOT(slotNewFile()));
// save file action “保存”动作
actionSaveFile = new QAction(QPixmap(":/images/save.png"),tr("Save"),this);
actionSaveFile->setShortcut(tr("Ctrl+S"));
actionSaveFile->setStatusTip(tr("save file"));
connect(actionSaveFile,SIGNAL(activated()),this,SLOT(slotSaveFile()));
// exit action “退出”动作
actionExit = new QAction(tr("Exit"), this);
actionExit->setShortcut(tr("Ctrl+Q"));
actionExit->setStatusTip(tr("exit"));
connect(actionExit, SIGNAL(triggered()), this, SLOT(close()));
// cut action “剪切”动作
actionCut = new QAction(QIcon(":/images/cut.png"), tr("Cut"), this);
actionCut->setShortcut(tr("Ctrl+X"));
actionCut->setStatusTip(tr("cut to clipboard"));
connect(actionCut, SIGNAL(triggered()), text, SLOT(cut()));
// copy action “复制”动作
actionCopy = new QAction(QIcon(":/images/copy.png"), tr("Copy"), this);
actionCopy->setShortcut(tr("Ctrl+C"));
actionCopy->setStatusTip(tr("copy to clipboard"));
connect(actionCopy, SIGNAL(triggered()), text, SLOT(copy()));
// paste action “粘贴”动作
actionPaste = new QAction(QIcon(":/images/paste.png"), tr("Paste"), this);
actionPaste->setShortcut(tr("Ctrl+V"));
actionPaste->setStatusTip(tr("paste clipboard to selection"));
connect(actionPaste, SIGNAL(triggered()), text, SLOT(paste()));
// about action “关于”动作
actionAbout = new QAction(tr("About"), this);
connect(actionAbout, SIGNAL(triggered()), this, SLOT(slotAbout()));
}
```
第 3~6 行实现的是“打开文件”动作,第 3 行在创建这个动作时,依次指定了此动作 使用的图标、名称以及父窗口。注意程序中 tr()函数的使用很普遍。
小贴士:在程序中需要使用字符串操作时,尽量使用 tr()函数,这是为了日后使得应用程 序可以被翻译为多种语言所必须的。
第 4 行设置了此动作的快捷键为 Ctrl+O,使用的是 setShortcut()方法,它的原型 是:
```
void setShortcut ( const QKeySequence & shortcut )
```
由此引出了使用该方法的另一种方式:
```
actionOpenFile->setShortcut( QKeySequence( tr("Ctrl+O") ) );
```
专题:QkeySequence 的使用
QKeySequence 是专门用作设置快捷键的。它有 3 种主要的用法:
+ 使用 Qt 标准键缩写方式 它的标准写法是:
```
actionOpenFile->setShortcut( QKeySequence::Open );
```
注意,这种快捷键的预定义是与平台相关的。
+ 使用人们已经习惯的类似“Crtl+O”这样的形式 它的标准写法是:
```
actionOpenFile->setShortcut( QKeySequence( tr("Ctrl+O") ) );
```
它不区分大小写,所以也可写成:
```
actionOpenFile->setShortcut( QKeySequence( tr("Ctrl+o") ) );
```
+ 使用在 Qt::Key 和 Qt::Modifier 中定义的前缀修饰符和具体键的组合方式它的标准写法是:
```
actionOpenFile->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_O ) );
```
其中,Qt::CTRL 表示前置修饰符为 Ctrl 键,Qt::Key_O 表示按下的是字母 O 的键。
Qt::Key 和 Qt::Modifier 是枚举型常量,前者定义了在常见的键值,有上百条之多, 表 8-1 示出了我们这个程序中用到的值,读者可以在 Qt Assistant 中查阅它的所有值;后 者定义了 Qt 所支持的快捷键修饰语的缩写值,目前有 5 种,如表 8-2 所示。
表 8-1 Qt 标准键说明
| 常量 | 值 | 说明 |
| --- | --- | --- |
| QKeySequence::Close | 4 | 关闭文件 |
| QKeySequence::Copy | 9 | 复制 |
| QKeySequence::Cut | 8 | 剪切 |
| QKeySequence::Delete | 7 | 删除 |
| QKeySequence::HelpContents | 1 | 打开帮助内容 |
| QKeySequence::New | 6 | 创建新文件. |
| QKeySequence::Open | 3 | 打开文件 |
| QKeySequence::Paste | 10 | 粘贴 |
| QKeySequence::Print | 18 | 打印 |
| QKeySequence::SaveAs | 63 | 另存为 |
| QKeySequence::Save | 5 | 保存文件 |
表 8-2 Qt::Modifier 中定义的快捷键修饰语值
| 常量名 | 值 | 说明 |
| --- | --- | --- |
| Qt::SHIFT | Qt::ShiftModifier | 在所有标准键盘上都提供 |
| Qt::META | Qt::MetaModifier | Meta 键值. |
| Qt::CTRL | Qt::ControlModifier | Ctrl 键值. |
| Qt::ALT | Qt::AltModifier | Alt 键值 |
| Qt::UNICODE_ACCEL | 0x00000000 | 指定 Unicode 值,而不是 Qt 键值 |
小贴士:在 Mac OS X 中, CTRL 的值 对应 Macintosh 键盘上的命令键, 而 META 的值对应 Windows 平台上的 Ctrl 键值。
在主要使用系统预定义的快捷键的情况下,这是一种比较简便的方法。但快捷键的定 义与平台相关,而且这种写法不利于实现国际化,所以笔者不建议采用。
使用这种方式时,带上 tr()函数便可以支持国际化,并且也与 Windows 平台上大家所 熟悉的写法类似。作者向大家推荐尽量采用这种写法。
最后一种写法看上去比较复杂,并且不利于实现程序的国际化,也不推荐使用。 除了使用 setShortcut 外,定义快捷键还有一种方法,它的标准写法如下:
```
shortcut = new QShortcut(QKeySequence(tr("Ctrl+O", "File|Open")),parent);
```
请读者朋友自行针对我们的程序进行修改,作为一道课后思考题吧。
第 5 行设定了状态条显示,当把鼠标光标移动到此动作对应的菜单条目或工具栏按钮 上时,在状态条上会显示出“打开文件”的提示。
第 6 行连接此动作触发时所调用的槽函数 slotOpenFile()。
3\.使用资源文件
首先,大家需要知道在 Qt 工程中,通常使用.qrc 文件来对资源文件进行配置。我们建 议在工程目录下为资源文件建立一个单独的文件夹,以便于管理。在第 8.6 节中,我们会 对资源文件和 Qt 资源系统作专题的讲解。
第 1 步,建立 images 目录
在工程文件夹下面新建一个名为 imgaes 的目录,并将程序工程中需要使用的资源文件(如图标文件、图像文件等)放入该文件夹下面。
第 2 步,建立.qrc 文件
在工程的主目录下面建立一个文本文件,将其保存为 mainwindow.qrc,输入内容如 下:
```
<RCC>
<qresource>
</qresource>
</RCC>
<file>images/copy.png</file>
<file>images/cut.png</file>
<file>images/new.png</file>
<file>images/open.png</file>
<file>images/paste.png</file>
<file>images/save.png</file>
```
注意,这是一种 xml 格式的变体,我们需要在成对的标签中放置资源文件。
第 3 步,使工程文件能够识别资源文件 在工程文件(mainwindow.pro)中加入一行:
```
RESOURCES += /mainwindow.qrc
```
这一行是必须的,这样 qmake 才可以找到资源文件。
接下来的各个动作的设置就类似了,“剪切”、“复制”和“粘贴”动作连接的触发 响应槽函数,分别直接使用 QTextEdit 对象的 cut()、copy()和 paste()函数即可。“关 于”动作的触发响应槽函数使用的是 QApplication 的 slotAbout()。
在创建动作时,并不是必须要配合使用图标显示的,例如程序中创建“关于”动作和 “退出”动作时就没有使用图标。这种做法通常用于对应到顶级菜单的动作,并且该顶级菜 单没有子菜单时的情况。
4\.创建菜单栏 创建了各个动作后,就可以把它们与菜单栏中的项联系起来了。我们来分析一下 菜单栏的实现函数 createMenus()。
```
void CMyMainWindow::createMenu()
{
//文件菜单
menuFile = menuBar()->addMenu(tr("File"));
menuFile->addAction(actionNewfile);
menuFile->addAction(actionOpenFileOpen);
menuFile->addAction(actionSaveFileSave);
menuFile->addAction(actionExit);
//编辑菜单
menuEdit = menuBar()->addMenu(tr("Edit"));
menuEdit->addAction(actionCopy);
menuEdit->addAction(actionCut);
menuEdit->addAction(actionPaste);
//帮助菜单
menuAbout = menuBar()->addMenu(tr("Help"));
menuAbout->addAction(actionAbout);
}
```
其中,第 1~5 行创建了“文件”菜单。
第 1 行使用主窗口类的 menuBar()函数得到主窗口的菜单栏指针,再调用菜单栏对象的 addMenu()函数,即可把一个新菜单 menuFile 插入到菜单栏中。
menuBar()函数的原型如下:
```
QMenuBar * QMainWindow::menuBar () const
```
如果菜单栏已经存在,它将返回指向该菜单栏的指针;如果菜单栏还没有建立,它将 创建并且返回一个空的主窗口的菜单栏。
小贴士:menuBar()函数使得该菜单栏以程序中使用的主窗口作为自己的父窗口。因此,如 果你想在 Mac 应用程序中使得所有窗口都共用这个菜单栏的话,请不要使用这种写法来创 建菜单栏。要达到这个目的,你可以创建一个没有父窗口的菜单栏,这时我们的代码应该改 为:
```
QMenuBar *menuBar = new QMenuBar(0); menuFile = menuBar->addMenu(tr("File"));
```
另外,创建菜单栏还可以有另一种写法:
```
menuFile = new QMenu(tr("File"),this); QMenuBar *menuBar = menuBar();
menuBar->addMenu(menuFile);
```
如下面代码所示,addMenu()函数有多个原型,我们通常使用的是前两种。
```
QAction * QMenuBar::addMenu ( QMenu * menu )
QMenu * QMenuBar::addMenu ( const QString & title )
QMenu * QMenuBar::addMenu ( const QIcon & icon, const QString & title )
```
第 2~5 行调用 QMenu 的 addAction()函数在菜单中加入菜单栏条目“打开”、“新建”、“保存”和“退出”。
与上面的情形类似,第 6~9 行创建“编辑”菜单。第 10、11 行创建“帮助”菜单。 5.创建工具栏
接下来创建工具栏,我们来看一下 createToolBars()函数。
```
void CMyMainWindow::createToolBars()
{
toolBarFile = addToolBar(tr("File"));
toolBarFile->setMovable(false);
toolBarFile->setAllowedAreas(Qt::AllToolBarAreas);
toolBarFile->addAction(fileNewAction);
toolBarFile->addAction(fileOpenAction);
toolBarFile->addAction(fileSaveAction);
//编辑工具栏
toolBarEdit = addToolBar(tr(“Edit”));
addToolBar( Qt::RightToolBarArea, toolBarEdit);
toolBarEdit->setMovable(true);
toolBarEdit->setAllowedAreas( Qt::RightToolBarArea );
toolBarEdit->setFloatable(true);
QSize size(16, 15);
toolBarEdit->setIconSize(size);
toolBarEdit->addAction(copyAction);
toolBarEdit->addAction(cutAction);
toolBarEdit->addAction(pasteAction);
//文件工具栏
}
```
第 1~6 行创建了“文件”工具栏,第 5~8 行创建了“编辑”工具栏。
主窗口的工具栏上可以有多个工具条,一般采用一个菜单对应一个工具条的方式,也 可根据需要进行工具条的划分。
第 1 行调用 QMainWindow 的 addToolBar()函数获得主窗口的工具条对象,每新增一个 工具条调用一次 addToolBar()函数,赋予不同的名称,即可在主窗口中新增一个工具条。
专题:创建工具条的方法
addToolBar()函数有 3 种原型,分别介绍如下。
第 1 种:
```
void QMainWindow::addToolBar ( Qt::ToolBarArea area, QToolBar * toolbar )
```
这种方法是最为灵活的一个,第 1 个参数 area 负责设置工具栏的布局方向,比如是从 左到右(left-to-right ),还是从上到下(up-to-down)等等;第 2 个参数 toolbar 是工具栏对象的实例。
举个例子,把我们的程序修改成采用这个函数原型的形式:
第 2 种:
```
void QMainWindow::addToolBar ( QToolBar * toolbar )
```
这种方法是默认将工具栏放置在主窗口的顶部工具栏区域( Top Toolbar Area ), 它的作用等同于 addToolBar(Qt::TopToolBarArea, toolbar),实际上是第 1 种方法的一个具体例子。
这种方法有一个不灵活的地方,就是默认情况下它已经限定工具栏必须创建在主窗口 的顶部工具栏区域,那么由此工具栏的布局方向也已经确定是水平方向的,不可更改了。
第 3 种:
```
QToolBar * QMainWindow::addToolBar ( const QString & title )
```
读者朋友可以看到,我们的程序中就是使用了这种方法。在使用这种方法时,程序会 自动的首先创建一个 QToolBar 对象,并把它的窗口标题设置为 title ,然后将它放置在主窗口的顶部工具栏区域。 使用这种写法,也不能设置工具栏的布局方向。
第 2~4 行调用 QToolBar 的 addAction()函数在工具条中插入属于本工具条的动作。 第 5~8 行编辑工具条的实现,与文件工具条类似。 两个工具条的显示可以由用户进行选择,在工具栏上单击鼠标右键将弹出工具条显示的选择菜单,如图 8-2 所示。
![](https://box.kancloud.cn/2016-01-22_56a1a1532d3e8.png)
图 8-2 多个工具条可以自由切换
工具栏是可移动和停靠的窗口,它可停靠的区域由 Qt::ToolBarArea 枚举值所决定, 默认值是 Qt::AllToolBarAreas,即出现在主窗口的顶部工具栏区域。
setAllowAreas()函数用来指定工具条可停靠的区域,如:
```
toolBarEdit->setAllowAreas(Qt::TopToolBarArea | Qt::LeftToolBarArea);
```
它限定了“编辑”工具条只可以出现在主窗口的顶部或左侧。表 8-3 列举了 Qt 工具栏 所有可以停靠的区域。
表 8-3 工具栏可停靠区域- Qt::ToolBarArea 枚举值
| 常量 | 值 | 语义 |
| --- | --- | --- |
| Qt::LeftToolBarArea | 0x1 | 放置在主窗口左部工具栏区域 |
| Qt::RightToolBarArea | 0x2 | 放置在主窗口右部工具栏区域 |
| Qt::TopToolBarArea | 0x4 | 放置在主窗口顶部工具栏区域 |
| Qt::BottomToolBarArea | 0x8 | 放置在主窗口底部工具栏区域 |
| Qt::AllToolBarAreas | ToolBarArea_Mask | 可以放置在主窗口的上、下、左、右 4 个工具栏区域中的任意一个 |
| Qt::NoToolBarArea | 0 | 没有可供工具栏放置的区域 |
setMovable()函数用于设定工具条的可移动性,如:
```
toolBarEdit->setMovable(false);
```
该句指定文件工具条不可移动,只出现于主窗口的顶部。
6\.创建状态栏
随着菜单和工具栏的完成,已经为设置应用程序的状态栏做好了准备。在程序的普通模式下,状态栏用于显示状态提示和其他的一些临时消息。
```
tipLabel = new QLabel(tr("ready")); tipLabel->setAlignment(Qt::AlignHCenter);
tipLabel->setMinimumSize(tipLabel->sizeHint());
statusBar()->addWidget(tipLabel);
```
QMainWindow::statusBar()函数返回一个指向状态栏的指针。在第一次调用 statusBar()函数的时候会创建一个状态栏。状态栏指示器一般是一些简单的 QLabel,可以 在任何需要的时候改变它们的文本。当把这些 QLabel 添加到状态栏的时候,它们会自动被 重定义父对象,以便让它们成为状态栏的子对象。
7\.实现自定义槽函数 实现新建动作的响应的槽函数 slotNewFile()。
```
void MainWindow::slotNewFile()
{
MainWindow *newWin = new MainWindow(); newWin->show();
}
```
新建一个空白文件。必须调用 show()方法使得窗口实例可以显示。
```
void MainWindow::slotOpenFile()
{
fileName = QfileDialog::getOpenFileName(this); if( !fileName.isEmpty() )
{
if( text->document()->isEmpty() )
{
}
else
{
}
}
}
loadFile(fileName);
MainWindow *newWin = new MainWindow; newWin->show();
newWin->loadFile(fileName);
```
slotOpenFile()槽函数的作用是打开一个文件。利用标准文件对话框 QFileDialog 打 开一个已存在的文件,若当前中央窗体中已有打开的文件,则在一个新的窗口中打开选定的
文件;若当前中央窗体是空白的,则在当前窗体中打开。
具体读取文件内容的工作在 loadFile()函数中完成:
```
void MainWindow::loadFile(QString fileName)
{
QFile file( fileName );
if ( file.open( QIODevice::ReadOnly|QIODevice::Text ))
{
QTextStream textStream( &file );
while( !textStream.atEnd() )
{
text->append( textStream.readLine() );
}
}
}
```
主要是利用 QFile 和 QTextStream 读取文件内容。
本本例的重点是如何搭建一个基本的 QMainWindow 主窗口,因此对于菜单或工具栏的 具体功能实现并没有做太多的分析,这些功能可在此基本主窗口程序的基础之上逐步完善。
- 第 1 章 走近 Qt
- 1.1 Qt 简介
- 1.2 Qt 纪事概览
- 1.3 Qt 套件的组成(以 Qt4.5 为准)
- 1.4 Qt 的授权
- 1.5 Qt 的产品
- 1.6 Qt 的服务与支持
- 1.7 Qt 的最新进展
- 1.8为什么选择 Qt
- 1.9 问题与解答
- 1.10 总结与提高
- 第 2 章 Qt 的安装与配置
- 2.1 获取 Qt
- 2.2 协议说明
- 2.3 安装 Qt
- 2.4 配置 Qt4 环境
- 2.5 问题与解答
- 2.6 总结与提高
- 第 3 章 Qt 编程基础
- 3.1 标准 C++精讲
- 3.2 Windows 编程基础
- 3.3 Linux 编程基础
- 3.4 Mac 编程基础
- 3.5 问题与解答
- 3.6 总结与提高
- 第 4 章 Qt 4 集成开发环境
- 4.1 常见的 Qt IDE
- 4.2 Qt Creator
- 4.3 Eclipse
- 4.5 问题与解答
- 4.6 总结与提高
- 第 5 章 使用 Qt 基本 GUI 工具
- 5.1 使用 Qt Designer 进行 GUI 设计
- 5.2 使用 Qt Assistant 获取在线文档与帮助
- 5.3 使用 Qt Demo 学习 Qt 应用程序开发
- 5.4 问题与解答
- 5.5 总结与提高
- 第 6 章 Qt 4 程序开发方法和流程
- 6.1 开发方法
- 6.2 Hello Qt
- 6.3 几个重要的知识点
- 6.4 问题与解答
- 6.5 总结与提高
- 第 7 章 对话框
- 7.1 QDialog 类
- 7.2 子类化 QDialog
- 7.3 快速设计对话框
- 7.4 常见内建(built in)对话框的使用
- 7.5 模态对话框与非模态对话框
- 7.6 问题与解答
- 7.7 总结与提高
- 第 8 章 主窗口
- 8.1 主窗口框架
- 8.2 创建主窗口的方法和流程
- 8.3 代码创建主窗口
- 8.4 使用 Qt Designer 创建主窗口
- 8.5 中心窗口部件专题
- 8.6 Qt4 资源系统专题
- 8.7 锚接窗口
- 8.8 多文档
- 8.9 问题与解答
- 8.10 总结与提高
- 第 9 章 Qt 样式表与应用程序观感
- 9.1 应用程序的观感
- 9.2 QStyle 类的使用
- 9.3 样式表概述
- 9.4 使用样式表
- 9.5 问题与解答
- 9.6 总结与提高
- 第 10 章 在程序中使用.ui 文件
- 10.1 uic 的使用
- 10.2 Ui_YourFormName.h 文件的组成
- 10.3 编译时加入处理.ui 文件的方法
- 10.4 运行时加入处理.ui 文件的方法
- 10.5 信号与槽的自动连接
- 10.6 问题与解答
- 10.7 总结与提高 本章主要讲解了以下内容:
- 第 11 章 布局管理
- 11.1 基本概念和方法
- 11.2在 Qt Designer 中使用布局
- 11.3 基本布局实践
- 11.4 堆栈布局
- 11.5 分裂器布局
- 11.6 自定义布局管理器
- 11.7 布局管理经验总结
- 11.8 问题与解答
- 11.9 总结与提高
- 第 12 章 使用 Qt Creator
- 12.1 Qt Creator 概览
- 12.2 Qt Creator 的组成
- 12.3 快捷键和常用技巧
- 12.4 Qt Creator 构建系统的设置
- 12.5 处理项目间依赖关系( Dependencies )
- 12.6 Qt 多版本共存时的管理
- 12.7 使用定位器在代码间快速导航
- 12.8 如何创建一个项目
- 12.9 实例讲解
- 12.10 使用 Qt Creator 调试程序
- 12.11 问题与解答
- 12.12 总结与提高
- 第 13 章 Qt 核心机制与原理
- 13.1 Qt 对标准 C++的扩展
- 13.2 信号与槽
- 13.3 元对象系统
- 13.4 Qt 的架构
- 13.5 Qt 的事件模型
- 13.6 构建 Qt 应用程序
- 13.7 总结与提高
- 附录 A qmake 使用指南
- A.1 qmake 简介
- A.2 使用 qmake
- 附录 B make 命令
- B.1 命令解释
- B.2 使用 make 自动构建
- 附录 C Qt 资源
- C.1Qt 官方资源
- C.2 Qt 开发社区