## 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 所示。

圖 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 開發社區