34 单元视图(Item Views)
qt Creator有4种Item Views,如图3-31所示。 View Widgets的qt类和名称介绍如表3-7所示。 图3-31 Item Views控件
表3-7 Item Views介绍

本节主要介绍Qt Creator中View Widgets的使用方法,视图控件可以用来很好地显示项目,在这方面它和列表框相同,只不过它的功能更加强大。下面就来具体介绍各种视图组件的用法。
341 ListView控件
1控件位置 Item Views→ListView 2控件介绍 ListView控件(列表视图)继承于QAbstractItemView。ListView是基于模型的列表/图标视图,为Qt的模型/视图结构提供了更灵活的方式,它是Qt模型/视图框架的一部分。可以看出Qt Creator的ListView和Qt Designer的ListView有很大差别。 3控件设置选项 在ListView控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置视图内字体; batchSize:如果将layoutMode设置为Batched,则这个属性保存批量处理的规格; layoutMode:项目的布局模式; modeColumn:模型中可见的列,默认情况下,值为0,表明模型中的第一列可见; viewMode:保存该ListView的视图模型。 4常用成员函数
1 1) QListView::QListView ( QWidget *parent = 0)
构造一个父对象为parent的ListView。
1 2) void QListView::currentChanged ( const QModelIndex & current, const QModelIndex & previous ) [virtual protected]

把current定为当前项目,previous是以前的当前项目。
1 3) void QListView::dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight ) [virtual protected]
更改模型中项目topLeft到bottomRight。
1 4) QModelIndex QListView::indexAt ( const QPoint & p ) const [virtual]
返回坐标点p处项目的模型索引。
1 5) void QListView::rowsInserted ( const QModelIndex & parent, int start, int end ) [virtual protected]
插入新行,新行的父母是parent,从start到end的所有项目。
1 6) QModelIndexList QListView::selectedIndexes () const [virtual protected]
(从左到右依次是:ListView、TextEdit)返回所有选中和非隐藏的项目的模型索引。
342 示例5:ListView的应用
Qt提供了model/view结构来管理与展示数据,model提供数据模型,view展示数据,delegate对数据项进行渲染。model、view和delegate通过信号/槽机制通信。下面通过这个示例来学习ListView的用法。 首先建立标准的Qt Gui Application项目,把项目自动生成的toolBar、menuBar和statusBar删除,设计界面如图3-32所示。 1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-8所示。 图3-32 示例5界面
2示例说明

程序执行后,会在listView中添加一些数据项。单击选中“listView”中的某一项,会在textEdit中显示该项。 表3-8 主要控件说明
3示例实现 头文件mainwindowh(文中的粗体为需要添加的内容):
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3 #include
4 #include
5 #include
6 namespace Ui {
7 class MainWindow;
8 }
9 class MainWindow : public QMainWindow
10 {
11 Q_OBJECT
12 public:
13 explicit MainWindow(QWidget *parent = 0);
14 ~MainWindow();
15 private:
16 Ui::MainWindow *ui;
17 private:
18 QStandardItemModel *standardItemModel;//声明model
19 private slots:
20 void itemClicked(QModelIndex index);//槽函数
21 };
22 #endif // MAINWINDOW_H

在头文件中声明一个QStandardItemModel对象和一个槽函数itemClicked(QModelIndex index)。对象standardItemModel是listViewd的model,槽函数itemClicked(QModelIndex index)对应listView中的选项被单击的事件。 在主窗体mainwindowcpp文件中自动生成如下代码:
1 #include "mainwindowh"
2 #include "ui_mainwindowh"
3 MainWindow::MainWindow(QWidget parent) :
4 QMainWindow(parent),
5 ui(new Ui::MainWindow)
6 {
7 ui->setupUi(this);
8 }
9 MainWindow::~MainWindow()
10 {
11 delete ui;
12 }
在主窗体mainwindowcpp文件中添加的头文件:
1 #include
在主窗体mainwindowcpp文件中构造函数:
1 /
构造函数*/
2 MainWindow::MainWindow(QWidget *parent) :
3 QMainWindow(parent),
4 ui(new Ui::MainWindow)
5 {
6 ui->setupUi(this);
7
8 standardItemModel = new QStandardItemModel(this);
9
10 /*****************初始化Item数组************************************/
11 QStringList strList;
12 strListappend("a");
13 strListappend("b");
14 strListappend("c");
15 strListappend("d");
16 strListappend("e");
17 strListappend("f");
18 strListappend("g");
19 strList << "h";

20 strList += "i";
21 int nCount = strListsize(); //获取strList的大小
22
23 /****************初始化model*************************************/
24 for(int i = 0; i < nCount; i++)
25 {
26 QString string = static_cast(strListat(i));
27 QStandardItem item = new QStandardItem(string);
28 if(i %2 == 1)
29 {
30 QLinearGradient linearGrad(QPointF(0, 0), QPointF(200, 200));
31 linearGradsetColorAt(0, QT::darkGreen);
32 inearGradsetColorAt(1, QT::yellow);
33 QBrush brush(linearGrad);
34 item->setBackground(brush);
35 }
36 standardItemModel->appendRow(item);
37 }
38 ui->listView->setModel(standardItemModel);//显示model中的内容
39 connect(ui->listView,SIGNAL(clicked(QModelIndex)),
40 this,SLOT(itemClicked(QModelIndex)));
41 }
在主窗体mainwindowcpp文件中添加槽函数itemClicked(QModelIndex index):
1 /
槽函数:设置textEdit显示的内容*/
2 void MainWindow::itemClicked(QModelIndex index)
3 {
4 ui->textEdit->setText(ui->textEdit->toPlainText()+indexdata()toString()+"\n");
5 }
主文件maincpp不需任何更改,使用项目自动生成的即可。 4示例执行结果 结果示例执行结果如图3-33所示。

图3-33 示例5执行
343 TreeView控件(1)
1控件位置 Item Views→TreeView 2控件介绍 TreeView控件(树形视图)继承于QAbstractItemView。TreeView和ListView类似,是基于模型的列表/图标视图,也是Qt模型/视图框架的一部分。 3控件设置选项 在TreeView控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置该控件内所有文本的字体; sortingEnable:项目是否排序。 4常用成员函数

1 1) QTreeView::QTreeView ( QWidget *parent = 0 )
构造一个父对象为parent的TreeView。
1 2) void QTreeView::collapse ( const QModelIndex & index ) [slot]
折叠模型索引为index的项目。
1 3) void QTreeView::collapseAll () [slot]
折叠所有项目。
1 4) int QTreeView::columnAt ( int x ) const
返回x坐标处的列。
1 5) void QTreeView::columnCountChanged ( int oldCount, int newCount ) [protected slot]
通知在树形视图中的列数,从oldCount改变到newCount。
1 6) void QTreeView::currentChanged ( const QModelIndex & current, const QModelIndex & previous ) [virtual protected]
把current定为当前项目,previous是以前的当前项目。
1 7) void QTreeView::dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight ) [virtual]
更改模型中项目topLeft到bottomRight。
1 8) void QTreeView::drawBranches ( QPainter *painter, const QRect & rect, const QModelIndex & index ) const [virtual protected]
在项目index的同一行,用painter绘制指定的rect矩形分支。
1 9) void QTreeView::drawRow ( QPainter *painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const[virtual protected]
用painter绘制新行,新行包含模型索引为index的项目,option是如何显示项目。
1 10) void QTreeView::drawTree ( QPainter *painter, const QRegion & region ) const [protected]
343 TreeView控件(2)
用painter在区域region绘制树。
1 11) void QTreeView::expand ( const QModelIndex & index ) [slot]
展开模型索引为index的项目。
1 12) void QTreeView::expandAll () [slot]
展开所有的项目。

1 13) void QTreeView::expandToDepth ( int depth ) [slot]
展开树形视图中的项目,深度为depth。
1 14) QHeaderView *QTreeView::header () const
返回该树形视图的header。
1 15) QModelIndex QTreeView::indexAbove ( const QModelIndex & index ) const
返回模型索引index的上一个索引。
1 16) QModelIndex QTreeView::indexAt ( const QPoint & point ) const [virtual]
返回点point处项目的模型索引。
1 17) QModelIndex QTreeView::indexBelow ( const QModelIndex & index ) const
返回模型索引index的下一个索引。
1 18) bool QTreeView::isExpanded ( const QModelIndex & index ) const
如果模型索引index处的项目是展开着的,返回true;否则返回false。
1 19) void QTreeView::rowsInserted ( const QModelIndex & parent, int start, int end ) [virtual protected]
插入新行,新行的父母是parent,包括从start到end的所有项目。
1 20) void QTreeView::rowsRemoved ( const QModelIndex & parent, int start, int end ) [protected slot]
删除行,行的父母是parent,包括从start到end的所有项目。
1 21) void QTreeView::selectAll () [virtual]
设置所有的项目都是选中状态。
1 22) QModelIndexList QTreeView::selectedIndexes () const [virtual protected]
返回所有选中和非隐藏的项目的模型索引。
1 23) void QTreeView::setHeader ( QHeaderView *header )
设置该TreeView的标题为header。
1 24) void QTreeView::sortByColumn ( int column, QT::SortOrder order )
对列column按order进行排序。
344 示例6:TreeView的应用(1)
本示例讲解了Qt中树控件QTreeView的开发应用,对于QTreeView没有过多的讲解,接下来介绍具体如何实现。

首先建立标准的Qt Gui Application项目,把项目自动生成的toolBar、menuBar和statusBar删除,设计界面如图3-34所示,其中从左到右依次是TreeView、TextEdit、TextEdit控件。 1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-9所示。 图3-34 示例6界面
表3-9 主要控件说明
2示例说明 程序执行后,会通过不同方式向treeView中添加选项,示例功能说明如下: textEdit显示树列表中的所有选项内容; textEdit_2显示当前选中的树列表中的内容。 3示例实现 头文件mainwindowh(文中的粗体为需要添加的内容):
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3 #include
4 #include

5 #include
6 namespace Ui {
7 class MainWindow;
8 }
9 class MainWindow : public QMainWindow
10 {
11 Q_OBJECT
12 public:
13 explicit MainWindow(QWidget parent = 0);
14 ~MainWindow();
15 void iterateOverItems(); //在textEdit中显示所有的Item
16 QList<QStandardItem
> returnTheItems();//返回列表中所有的Item
17 private:
18 Ui::MainWindow *ui;
19 QStandardItemModel *model;//声明model
20 private slots:
21 void on_treeView_doubleClicked(QModelIndex index);//槽函数
22 };
23 #endif // MAINWINDOW_H
注意此处的槽函数是通过右击控件→Go to slots自动生成的,所以不用在实现文件中添加映射函数。在主窗体mainwindowcpp文件中自动生成如下代码:
1 #include "mainwindowh"
2 #include "ui_mainwindowh"
3 MainWindow::MainWindow(QWidget *parent) :
4 QMainWindow(parent),
5 ui(new Ui::MainWindow)
6 {
7 ui->setupUi(this);
8 }
9
10
11 MainWindow::~MainWindow()
12 {
13 delete ui;
14 }
344 示例6:TreeView的应用(2) 在主窗体mainwindowcpp文件中添加的头文件:
1 #include
在主窗体mainwindowcpp文件中构造函数:

1 /构造函数/
2 MainWindow::MainWindow(QWidget *parent) :
3 QMainWindow(parent),
4 ui(new Ui::MainWindow)
5 {
6 ui->setupUi(this);
7
8 ui->treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
9 ui->treeView->header()->setResizeMode(QHeaderView::ResizeToContents);
10
11 /*************************new model**********************************/
12 model = new QStandardItemModel(4,1);
13
14 /*************************设置表头**********************************/
15 model->setHeaderData(0, QT::Horizontal, tr("First"));
16
17 /*************************添加Item到model中***********************/
18 QStandardItem *item1 = new QStandardItem("item1");
19 QStandardItem *item2 = new QStandardItem("item2");
20 QStandardItem *item3 = new QStandardItem("item3");
21 QStandardItem *item4 = new QStandardItem("item4");
22 model->setItem(0, 0, item1);
23 model->setItem(1, 0, item2);
24 model->setItem(2, 0, item3);
25 model->setItem(3, 0, item4);
26 QStandardItem *item5 = new QStandardItem("item5");
27 item4->appendRow(item5);
28 QStandardItem *item6 = new QStandardItem("item6");
29 item5 ->appendRow(item6);
30
31 /***************************向model中插入Item**************************/
32 QModelIndex modelIndex;
33 for(int i = 0; i < 4; ++i)
34 {
35 modelmodelIndex = model->index(0, 0, modelIndex);
36 model->insertRows(0, 1, modelIndex);
37 model->insertColumns(0, 1, modelIndex);
38 QModelIndex index = model->index(0, 0, modelIndex);

39 model->setData(index, i);
40 }
41 ui->treeView->setModel(model);
42 iterateOverItems();
43 }
在主窗体mainwindowcpp文件中添加槽函数on_treeView_doubleClicked(QModelIndex index):
1 /槽函数:处理双击Item事件/
2 void MainWindow::on_treeView_doubleClicked(QModelIndex index)
3 {
4 QModelIndex index0 = ui->treeView->currentIndex();
5 ui->textEdit_2->append(index0data()toString()+" is CurrentItem!");
6 }
在主窗体mainwindowcpp文件中添加成员函数returnTheItems():
1 /成员函数:返回列表中所有的Item/
2 QList<QStandardItem> MainWindow::returnTheItems()
3 {
4 return model->findItems("
", QT::MatchWildcard| QT::MatchRecursive);
5 }
在主窗体mainwindowcpp文件中添加成员函数iterateOverItems():
1 /成员函数:显示所有Item/
2 void MainWindow::iterateOverItems()
3 {
4 QList<QStandardItem> list = returnTheItems();
5 foreach (QStandardItem
item, list)
6 {
7 ui->textEdit->setText(ui->textEdit->toPlainText()+item->text()+"\n");
8 }
9 }
主文件maincpp不用进行任何更改,使用项目自动生成的即可。 4示例执行结果 示例执行结果如图3-35所示。

图3-35 示例6执行结果
345 TableView控件(1)
1控件位置 Item Views→TableView 2控件介绍 TableView控件(表格视图)是一个模型/视图结构的表视图实现,用来显示模型的项目。它提供了QTable类提供的标准表格,但使用Qt的模型/视图结构具有更灵活的方式,而且也是模型/视图类之一,是Qt的模型/视图框架的一部分。由QAbstractItemView类定义的接口来实现,使其能够显示由QAbstractItemModel类派生的模型提供的数据。 3控件设置选项 在TableView控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置表格内部的字体; cornerButtonEnabled:左上角的按钮是否有用; gridStyle:表格的格式;

showGrid:是否显示网格,值为true,显示,否则不显示; sortingEnabled:是否对项目排序。 4常用成员函数
1 1) QTableView::QTableView ( QWidget *parent = 0 )
构造一个父对象为parent的TableView。
1 2) void QTableView::clearSpans ()
删除该TableView中的所有行和列的跨度。
1 3) int QTableView::columnAt ( int x ) const
返回坐标x处的列,如果坐标处没有项目则返回-1。
1 4) int QTableView::columnSpan ( int row, int column ) const
返回行row、列column处的行跨度。
1 5) void QTableView::currentChanged ( const QModelIndex & current, const QModelIndex & previous ) [virtual protected]
把current指定为当前项目,previous是以前的当前项目。
1 6) QHeaderView *QTableView::horizontalHeader () const
返回该TableView的水平标题。
1 7) QModelIndex QTableView::indexAt ( const QPoint & pos ) const [virtual]
返回点pos处项目的模型索引。
1 8) int QTableView::rowAt ( int y ) const
返回坐标y处的行,如果坐标处没有项目则返回-1。
1 9) int QTableView::rowSpan ( int row, int column ) const
返回行row、列column处的列跨度。
1 10) void QTableView::selectColumn ( int column ) [slot]
345 TableView控件(2) 设置列column为选中状态。
1 11) void QTableView::selectRow ( int row ) [slot]
设置行row为选中状态。
1 12) QModelIndexList QTableView::selectedIndexes () const [virtual protected]
返回所有选中和非隐藏的项目的模型索引。
1 13) void QTableView::setHorizontalHeader ( QHeaderView *header )

设置该TableView的水平标题为header。
1 14) void QTableView::setSpan ( int row, int column, int rowSpanCount, int columnSpanCount )
设置行row、列column处的行跨度为rowSpanCount、列跨度为columnSpanCount。
1 15) void QTableView::setVerticalHeader ( QHeaderView *header )
设置该TableView的垂直标题为header。
1 16) void QTableView::showColumn ( int column ) [slot]
显示列column。
1 17) void QTableView::showRow ( int row ) [slot]
显示行row。
1 18) QHeaderView *QTableView::verticalHeader () const
返回该TableView的垂直标题。
346 示例7:TableView的应用
TableView一般和QSqlTableModel一起使用,来显示数据表项,这里只简单介绍TableView的用法,没有涉及数据库。 首先创建标准的Qt Gui Application项目,把项目自动生成的toolBar、menuBar和statusBar删除,设计界面如图3-36所示。 图3-36 示例7界面
1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-10所示。 表3-10 主要控件说明

2示例说明 本示例只是简单地让tableView显示表格内容。 3示例实现 头文件mainwindowh(文中的粗体为需要添加的内容):
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3 #include
4 #include
5 namespace Ui {
6 class MainWindow;
7 }
8 class MainWindow : public QMainWindow
9 {
10 Q_OBJECT
11 public:
12 explicit MainWindow(QWidget *parent = 0);
13 ~MainWindow();
14 private:
15 Ui::MainWindow *ui;
16 QStandardItemModel *model; //声明model
17 int size;//model 尺寸
18 };
19 #endif // MAINWINDOW_H
在主窗体mainwindowcpp文件中自动生成如下代码:
1 #include "mainwindowh"
2 #include "ui_mainwindowh"
3 MainWindow::MainWindow(QWidget *parent) :
4 QMainWindow(parent),
5 ui(new Ui::MainWindow)
6 {
7 ui->setupUi(this);
8 }
9 MainWindow::~MainWindow()
10 {
11 delete ui;

12 }
在主窗体mainwindowcpp文件中构造函数:
1 /构造函数/
2 MainWindow::MainWindow(QWidget *parent) :
3 QMainWindow(parent),
4 ui(new Ui::MainWindow)
5 {
6 ui->setupUi(this);
7 size = 3; //初始化变量
8 model = new QStandardItemModel;
9 model->setColumnCount(size);
10 model->setRowCount(size);
11
12 /**************************设置表头标签********************************/
13 model->setHeaderData(0,QT::Horizontal,"ID");
14 model->setHeaderData(1,QT::Horizontal,"User");
15 model->setHeaderData(2,QT::Horizontal,"PassWd");
16
17 /*************************填充model**********************************/
18 for(int j=0;j<size;j++)
19 {
20 QStandardItem *itemID = new QStandardItem(QString::number(j));
21 model->setItem(j,0,itemID);
22 QStandardItem *itemUser = new QStandardItem("author"+QString::number(j));
23 model->setItem(j,1,itemUser);
24 QStandardItem *itemPassWd = new QStandardItem("123456");
25 model->setItem(j,2,itemPassWd);
26 }
27 ui->tableView->setModel(model);
28 ui->tableView->verticalHeader()->hide();
29 ui->tableView->setColumnWidth(0,30);
30 ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
31 }
主文件maincpp采用该项目自动生成的即可。 4示例执行结果
示例执行结果如图3-37所示。

图3-37 示例7执行结果
347 ColumnView控件
1控件位置 Item Views→ColumnView 2控件介绍 ColumnView控件中文称作“列视图”。 3控件设置选项 在ColumnView控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置表格内部的字体。 4常用成员函数
1 1) QColumnView::QColumnView ( QWidget *parent = 0 )
构造一个父对象为parent的ColumnView。
1 2) QAbstractItemView *QColumnView::createColumn ( const QModelIndex & index ) [virtual protected]
index是视图的根模型索引,返回新的视图。
1 3) void QColumnView::currentChanged ( const QModelIndex & current, const QModelIndex & previous ) [virtual protected]
把current指定为当前项目,previous是以前的当前项目。

1 4) QModelIndex QColumnView::indexAt ( const QPoint & point ) const [virtual]
返回点pos处项目的模型索引。
1 5) QWidget *QColumnView::previewWidget () const
返回预览组件,如果没有则返回0。
1 6) void QColumnView::rowsInserted ( const QModelIndex & parent, int start, int end ) [virtual protected]
插入新行,新行的父母是parent,包括从start到end的所有项目。
1 7) void QColumnView::selectAll () [virtual]
设置该ColumnView中的所用项目为选中状态。
1 8) void QColumnView::setPreviewWidget ( QWidget *widget )
设置widget为该ColumnView的预览组件。 ColumnView的用法和以上三种基本相同,在此就不再举例说明。
35 单元组件(Item Widgets)
Qt Creator有三种Item Widgets,如图3-38所示。 图3-38 Item Widgets控件
Item Widgets的Qt类和名称介绍如表3-11所示。 表3-11 Item Widgets介绍

本节主要介绍Qt Creator的Item Widgets的使用方法。
351 ListWidget控件(1)
1控件位置 Item Widget→ListWidget 2控件介绍 ListWidget控件(列表单元控件)继承于QListview类,样式如图3-39所示。与ListView不同的是,ListWidget是基于Item的列表控件,采用的是传统的添加、删除项目。 图3-39 ListWidget控件
3控件设置选项 在ListWidget控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置表格内部的字体; count:保存项目的数目; currentRow:保存当前项目的行; sortingEnabled:是否对item排序。 4常用成员函数
1 1) QListWidget::QListWidget ( QWidget *parent = 0 )

构造一个父对象为parent的ListWidget。
1 2) void QListWidget::addItem ( const QString & label )
添加一个新的项目,在新添加的项目中添加label标签。
1 3) void QListWidget::addItem ( QListWidgetItem *item )
添加项目item。
1 4) void QListWidget::addItems ( const QStringList & labels )
添加一列项目。
1 5) void QListWidget::clear () [slot]
清除该ListWidget中的所有项目。
1 6) QListWidgetItem *QListWidget::currentItem () const
返回当前活动项目。
1 7) void QListWidget::editItem ( QListWidgetItem *item )
如果项目item是可编辑的,开始编辑项目item。
1 8) QList<QListWidgetItem *> QListWidget::findItems ( const QString & text, QT::MatchFlags flags ) const
查找匹配字符串text的项目,并返回查找结果。
1 9) void QListWidget::insertItem ( int row, QListWidgetItem *item )
在行row处插入项目item。
1 10) void QListWidget::insertItem ( int row, const QString & label )
351 ListWidget控件(3) 这是一个重载函数,函数功能同9),在行row处插入标签为label的新项目。
1 11) void QListWidget::insertItems ( int row, const QStringList & labels )
在行row处插入一列项目。
1 12) QListWidgetItem *QListWidget::item ( int row ) const
返回行row处的项目,如果行row处没有项目则返回0。
1 13) QListWidgetItem *QListWidget::itemAt ( const QPoint & p ) const
返回点p处的项目。
1 14) QListWidgetItem *QListWidget::itemAt ( int x, int y ) const
返回坐标(x,y)处的项目。

1 15) QWidget *QListWidget::itemWidget ( QListWidgetItem *item ) const
返回项目item处显示的控件。
1 16) QListWidgetItem *QListWidget::takeItem ( int row )
移除行row处的项目,并返回项目控件。
1 17) void QListWidget::removeItemWidget ( QListWidgetItem *item )
删除项目item处的控件。
1 18) int QListWidget::row ( const QListWidgetItem *item ) const
返回项目item所在的行。
1 19) QList<QListWidgetItem *> QListWidget::selectedItems () const
返回所有被选中的项目的控件。
1 20) void QListWidget::setCurrentItem ( QListWidgetItem *item )
设置项目item为当前项目。
1 21) void QListWidget::setItemWidget ( QListWidgetItem *item, QWidget *widget )
设置控件widget为项目item的显示控件。
1 22) void QListWidget::setItemWidget ( QListWidgetItem *item, QWidget *widget )
这是个重载函数,函数功能同23)。
1 23) void QListWidget::sortItems ( QT::SortOrder order = QT::AscendingOrder )
把项目按照order进行排序。
352 TreeWidget控件(1)
1控件位置 Item Widget→TreeWidget 2控件介绍

TreeWidget控件(树形单元控件)继承于QTreeView类,样式如图3-40所示。TreeWidget控件是树形视图使用预定义的模型,它也是基于模型/视图结构的控件。为方便开发人员使用树形视图,可以使用这个控件来创建简单的树形结构列表。 图3-40 TreeWidget控件
3控件设置选项 在TreeWidget控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置表格内部的字体; columnCount:保存该TreeWidget的列数。 4常用成员函数
1 1) QTreeWidget::QTreeWidget ( QWidget *parent = 0 )
构造一个父对象为parent的TreeWidget。

1 2) void QTreeWidget::addTopLevelItem ( QTreeWidgetItem *item )
在该TreeWidget中追加item为顶级项目。
1 3) void QTreeWidget::addTopLevelItems ( const QList<QTreeWidgetItem *> & items )
把items中的项目作为顶级项目追加到该TreeWidget中。
1 4) void QTreeWidget::clear () [slot]
清除该TreeWidget中的所有项目。
1 5) void QTreeWidget::collapseItem ( const QTreeWidgetItem *item ) [slot]
折叠项目item。
1 6) int QTreeWidget::currentColumn () const
返回当前活动列。
1 7) QTreeWidgetItem *QTreeWidget::currentItem () const
352 TreeWidget控件(2) 返回当前活动项目。
1 8) void QTreeWidget::editItem ( QTreeWidgetItem *item, int column = 0 )

如果列column的item是可编辑的,开始编辑。
1 9) void QTreeWidget::expandItem ( const QTreeWidgetItem *item ) [slot]
展开项目item。
1 10) QList<QTreeWidgetItem *> QTreeWidget::findItems ( const QString & text, QT::MatchFlags flags, int column = 0 ) const
查找匹配字符串text的项目,并返回查找结果。
1 11) QTreeWidgetItem *QTreeWidget::headerItem () const
返回头项目。
1 12) QModelIndex QTreeWidget::indexFromItem ( QTreeWidgetItem *item, int column = 0 ) const [protected]
返回列column的项目item的模型索引。
1 13) int QTreeWidget::indexOfTopLevelItem ( QTreeWidgetItem *item ) const
返回顶级项目item的模型索引,如果item不存在则返回-1。
1 14) int QTreeWidget::sortColumn () const
返回排序的列。
1 15) void QTreeWidget::sortItems ( int column, QT::SortOrder order )
对列column的项目按照order进行排序。
1 16) QTreeWidgetItem *QTreeWidget::itemAbove ( const QTreeWidgetItem *item ) const
返回item的上一个项目。
1 17) QTreeWidgetItem *QTreeWidget::itemAt ( const QPoint & p ) const
返回点p处的项目。
1 18) QTreeWidgetItem *QTreeWidget::itemAt ( int x, int y ) const

返回坐标(x,y)处的项目。
1 19) void QTreeWidget::setItemWidget ( QTreeWidgetItem *item, int column, QWidget *widget )
设置控件widget为项目item的显示控件,项目item在列column中。
1 20) QTreeWidgetItem *QTreeWidget::itemBelow ( const QTreeWidgetItem *item ) const
返回item的下一个项目。
1 21) QWidget *QTreeWidget::itemWidget ( QTreeWidgetItem *item, int column ) const
返回列column中的项目item的显示控件。
1 22) void QTreeWidget::removeItemWidget ( QTreeWidgetItem *item, int column )
移除列column中的项目item的显示控件。
1 23) QList<QTreeWidgetItem *> QTreeWidget::selectedItems () const
返回所有选中状态的项目。
1 24) void QTreeWidget::setCurrentItem ( QTreeWidgetItem *item )
352 TreeWidget控件(3) 设置项目item为当前项目。
1 25) void QTreeWidget::setCurrentItem ( QTreeWidgetItem *item, int column )
设置列column的项目item为当前项目。

1 26) void QTreeWidget::setHeaderItem ( QTreeWidgetItem *item )
设置item为该TreeWidget的头项目。
1 27) void QTreeWidget::setHeaderLabel ( const QString & label )
设置label为头标题。
1 28) QTreeWidgetItem *QTreeWidget::topLevelItem ( int index ) const
返回所有index的顶级项目。
353 TableWidget控件(1)
1控件位置 Item Widget→TableWidget 2控件介绍 TableWidget控件(表格单元控件)的样式如图3-41所示。 图3-41 TableWidget控件
3控件设置选项

在TableWidget控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置表格内部的字体; columnCount:保存列的数目; rowCount:保存行的数目。 4常用成员函数
1 1) QTableWidget::QTableWidget ( QWidget *parent = 0 )
构造一个父对象为parent的TableWidget。
1 2) QTableWidget::QTableWidget ( int rows, int columns, QWidget *parent = 0 )
构造一个rows行、colums列、父对象为parent的TableWidget控件。
1 3) QWidget *QTableWidget::cellWidget ( int row, int column ) const
返回行row、列column的单元格处的控件。
1 4) void QTableWidget::clear () [slot]
删除该TreeWidget中的所有项目。
1 5) void QTableWidget::clearContents () [slot]
删除该TreeWidget中的除了header外的所有项目。

1 6) int QTableWidget::column ( const QTableWidgetItem *item ) const
返回项目item所在的列。
1 7) int QTableWidget::currentColumn () const
返回当前活动的列。
1 8) QTableWidgetItem *QTableWidget::currentItem () const
返回当前活动的项目。
1 9) int QTableWidget::currentRow () const
返回当前活动的行。
1 10) void QTableWidget::editItem ( QTableWidgetItem *item )
如果item是可编辑的,开始编辑item。
1 11) QList<QTableWidgetItem *>QTableWidget::findItems( const QString & text,QT::MatchFlags flags ) const
查找匹配字符串text的项目,并返回查找结果。
1 12) void QTableWidget::insertColumn ( int column ) [slot]
在列column处插入新列。
1 13) void QTableWidget::insertRow ( int row ) [slot]
在行row处插入新行。
1 14) QTableWidgetItem *QTableWidget::item ( int row, int column ) const
返回行row、列column处的项目。
1 15) QTableWidgetItem *QTableWidget::itemAt ( const QPoint & point ) const

353 TableWidget控件(2) 返回点point处的项目。
1 16) QTableWidgetItem *QTableWidget::itemAt ( int ax, int ay ) const
返回坐标(ax,ay)处的项目。
1 17) void QTableWidget::removeCellWidget ( int row, int column )
移除行row、列column单元格处的显示控件。
1 18) void QTableWidget::removeColumn ( int column ) [slot]
移除列column。
1 19) void QTableWidget::removeRow ( int row ) [slot]
移除行row。
1 20) int QTableWidget::row ( const QTableWidgetItem *item ) const
返回item的行。
1 21) QList<QTableWidgetItem *> QTableWidget::selectedItems ()
返回所有选中状态的项目。
1 22) void QTableWidget::setCellWidget ( int row, int column, QWidget *widget )
设置行row、列column处的显示控件为widget。
1 23) void QTableWidget::setCurrentCell ( int row, int column )

设置行row、列column处的单元格为当前活动单元格。
1 24) void QTableWidget::setCurrentItem ( QTableWidgetItem *item )
设置项目item为当前活动项目。25) void QTableWidget::setHorizontalHeaderItem ( int column, QTableWidgetItem *item )设置项目item为列column的水平头项目。功能同setVerticalHeaderItem()。
1 26) void QTableWidget::setHorizontalHeaderLabels ( const QStringList & labels )
设置水平标题为labels。功能同seVerticalHeaderLabels()。
1 27) void QTableWidget::setItem ( int row, int column, QTableWidgetItem *item )
设置行row、列column的单元格的项目为item。
1 28) void QTableWidget::sortItems ( int column, QT::SortOrder order = QT::AscendingOrder )
对列column按照order进行排序。
1 29) QTableWidgetItem *QTableWidget::takeHorizontalHeaderItem ( int column )
移除列column的水平头项目。功能同takeVerticalHeaderItem()。
1 30) QTableWidgetItem *QTableWidget::takeItem ( int row, int column )
移除行row、列column单元格处的项目。
1 31) QTableWidgetItem *QTableWidget::verticalHeaderItem ( int row ) const
返回行row的垂直头项目。

354 示例8:TableWidget的示例
QTableWidget是常用的显示数据表格的控件,类似于vcc#中的DataGrid。QTableWidget是QTableView的子类,两者的区别是,QTableView可以使用自定义的数据模型来显示内容(也就是先要通过setModel来绑定数据源),而QTableWidget则只能使用标准的数据模型,并且其单元格数据是由QTableWidgetItem的对象来实现的(也就是不需要数据源,将逐个单元格内的信息填好即可)。 首先创建标准的Qt Gui Application项目,把项目在主界面中自动生成的toolBar、menuBar和statusBar删除,设计界面如图3-42所示。 图3-42 示例8界面
1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-12所示。 2示例说明
表3-12 主要控件说明

本示例具体介绍怎样向tableWidget中添加文本和控件。 3示例实现 头文件mainwindowh(文中的粗体为需要添加的内容):
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3 #include
4 namespace Ui {
5 class MainWindow;
6 }
7 class MainWindow : public QMainWindow
8 {
9 Q_OBJECT
10
11
12 public:
13 explicit MainWindow(QWidget *parent = 0);
14 ~MainWindow();
15 private:
16 Ui::MainWindow *ui;
17 };
18 #endif // MAINWINDOW_H
头文件采用Qt Creator自动生成的即可,不需要任何更改。 在主窗体mainwindowcpp文件中自动生成如下代码:

1 #include "mainwindowh"
2 #include "ui_mainwindowh"
3 MainWindow::MainWindow(QWidget parent) :
4 QMainWindow(parent),
5 ui(new Ui::MainWindow)
6 {
7 ui->setupUi(this);
8 }
9 MainWindow::~MainWindow()
10 {
11 delete ui;
12 }
在主窗体mainwindowcpp文件中添加头文件:
1 #include
2 #include
3 #include
4 #include
在主窗体mainwindowcpp文件中构造函数:
1 /
构造函数*/
2 MainWindow::MainWindow(QWidget *parent) :
3 QMainWindow(parent),
4 ui(new Ui::MainWindow)
5 {
6 ui->setupUi(this);
7
8 /***************添加QLabel********************************************/
9 QLabel *label = new QLabel();
10 label->setText("Jhon");
11 ui->tableWidget->setCellWidget(1,0,label);
12

13 /**************添加QComboBox*****************************************/
14 QComboBox *ComboBoxSex = new QComboBox();
15 ComboBoxSex->addItem("Man");
16 ComboBoxSex->addItem("Woman");
17 ui->tableWidget->setCellWidget(1,1,ComboBoxSex);
18
19 /**************添加QDateTimeEdit***************************************/
20 QDateTimeEdit *dateTimeEdit1 = new QDateTimeEdit();
21 dateTimeEdit1->setDateTime(QDateTime::currentDateTime());
22 dateTimeEdit1->setDisplayFormat("dd/MM/yyyy");
23 dateTimeEdit1->setCalendarPopup(true);
24 ui->tableWidget->setCellWidget(1,2,dateTimeEdit1);
25
26
27
28 /**************添加QComboBox*****************************************/

29 QComboBox *ComboBoxWork1 = new QComboBox();
30 ComboBoxWork1->addItem(tr("Worker"));
31 ComboBoxWork1->addItem(tr("Farmer"));
32 ComboBoxWork1->addItem(tr("Doctor"));
33 ComboBoxWork1->addItem(tr("Lawyer"));
34 ComboBoxWork1->addItem(tr("Solder"));
35 ui->tableWidget->setCellWidget(1,3,ComboBoxWork1);
36
37 /****************添加QSpinBox****************************************/
38 QSpinBox *spinboxIncome1 = new QSpinBox();
39 spinboxIncome1->setRange(1000,10000);
40 ui->tableWidget->setCellWidget(1,4,spinboxIncome1);
41 }
主文件maincpp不需任何更改,使用项目自动生成的即可。 4示例执行结果 示例执行结果如图3-43所示。

图3-43 示例8执行结果
36 容器(Containers)
Qt Creator有9种Containers Widgets,如图3-44所示。 Containers Widgets的Qt类和名称介绍如表3-13所示。 图3-44 Containers控件
表3-13 Containers Widgets介绍
本节主要介绍Qt Creator的Containers Widgets的使用方法。Qt提供了很多Containers类型的控件,有十种之多。

361 GroupBox控件
1控件位置 Containers→GroupBox 2控件介绍 GroupBox控件(组合框)的样式如图3-45所示。使用GroupBox的好处就是用户可以比较清晰地了解程序的界面。我们可以把与功能相关的空间放到一个GroupBox中,用户可以方便地找到相应的功能控件。 图3-45 GroupBox控件
3控件设置选项 在GroupBox控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; title:该控件对应图形界面中所显示的名称; font:设置title的字体。

由于GroupBox控件非常简单,这里不再过多介绍,后面会在具体示例中向大家介绍实践用法。
362 ScrollArea控件
1控件位置 Containers→ScrollArea 2控件介绍 ScrollArea控件(滚动区)是一个用来显示子控件的内容的框架。如果子控件的尺寸超过了框架的大小,可以提供滚动条,方便查看整个子控件。 3控件设置选项 在ScrollArea控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置文本框的字体。 4常用成员函数
1 1) QScrollArea::QScrollArea ( QWidget *parent = 0 )
构造一个父对象为parent的ScrollArea。例如:

1 QScrollArea *scrollarea = new QScrollArea(this);
2 2) void QScrollArea::setWidget ( QWidget *widget )
设置控件widget为该ScrollArea的子控件。
1 3) QWidget *QScrollArea::takeWidget ()
删除该ScrollArea的子控件。
1 4) QWidget *QScrollArea::widget () const
返回该ScrollArea的子控件。
363 示例9:GroupBox和ScrollArea的示例(1)
由于GroupBox和ScrollArea使用起来很简单,这里用一个示例来介绍这两个控件的使用方法。 首先创建标准的Qt Gui Application项目,把项目在主界面中自动生成的toolBar、menuBar和statusBar删除,设计界面如图3-46所示。 1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-14所示。

图3-46 示例9界面
表3-14 主要控件说明
2示例说明 本示例中显示图片的label是自定义的,示例功能说明: 单击“打开图片”按钮,程序就会按照图片原来的尺寸打开这张图片,如果窗体不够大,就会出现滚动条。 3示例实现 头文件mainwindowh(文中的粗体为需要添加的内容):
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3 #include
4 #include
5 namespace Ui {
6 class MainWindow;
7 }
8 class MainWindow : public QMainWindow
9 {
10 Q_OBJECT

11 public:
12 explicit MainWindow(QWidget *parent = 0);
13 ~MainWindow();
14 private:
15 Ui::MainWindow *ui;
16 QLabel *label ;
17 private slots:
18 void on_btnOpen_clicked();
19 };
20 #endif // MAINWINDOW_H
在头文件中声明一个Label和一个槽函数on_btnOpen_clicked(),Label的名称是label,用来添加到ScrollArea中显示的图片。此处的槽函数是通过右击控件→Go to slots自动生成的,所以不用在实现文件中添加映射函数。 在主窗体mainwindowcpp文件中自动生成如下代码:
1 #include "mainwindowh"
2 #include "ui_mainwindowh"
3 MainWindow::MainWindow(QWidget *parent) :
4 QMainWindow(parent),
5 ui(new Ui::MainWindow)
6 {
7 ui->setupUi(this);
8 }
9 MainWindow::~MainWindow()
10 {
11 delete ui;
12 }
在主窗体mainwindowcpp文件中添加的头文件:

1 #include
2 #include
在主窗体mainwindowcpp文件中构造函数:
1 /构造函数/
2 MainWindow::MainWindow(QWidget parent) :
3 QMainWindow(parent),
4 ui(new Ui::MainWindow)
5 {
6 ui->setupUi(this);
7 label = new QLabel;//new label
8 ui->scrollArea->setWidget(label);//设置label处于滚动区内
9 }
363 示例9:GroupBox和ScrollArea的示例(2) 在主窗体mainwindowcpp文件中添加槽函数on_btnOpen_clicked():
1 /
槽函数:打开图片*/
2 void MainWindow::on_btnOpen_clicked()
3 {
4 QString fileName = QFileDialog::getOpenFileName(this,
5 tr("Open File"), QDir::currentPath());//获取文件
6 if(!fileNameisEmpty())//文件不为空
7 {
8 QImage image(fileName);
9 if(imageisNull())
10 {

11 QMessageBox::information(this, tr("Image Viewer"),
12 tr("Cannot load %1")arg(fileName));
13 return;
14 }
15 label->setPixmap(QPixmap::fromImage(image));//显示图片
16 }
17 }
主文件maincpp不用任何更改,使用项目自动生成的即可。 4示例执行结果 示例执行结果如图3-47所示。 图3-47 示例9执行结果
364 ToolBox控件
1控件位置

Containers→ToolBox 2控件介绍 ToolBox控件(工具箱)的样式如图3-48所示。Toolbox提供了一系列的页和隔间,就像Qt Designer和Qt Creator中的工具箱一样。 图3-48 ToolBox控件
3控件设置选项 在ToolBox控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置该控件内部文本的字体; currentIndex:当前活动页的索引; itemLabel:当前活动页的标签; itemName:当前活动页的名称;

itemBackgroundMode:当前活动页的背景模式。 4常用成员函数
1 1) QToolBox::QToolBox ( QWidget *parent = 0, const char *name = 0,WFlags f = 0 )
构造一个名称为name、父对象为parent和标志为f的ToolBox。
1 2) int QToolBox(QWidget *item,const QIconSet & iconSet,const QString & label)
增加一个item到ToolBox的底部,新增加的item的标签的文本是label,标签的图标是iconSet。
1 3) int QToolBox(QWidget *item, const QString & label)
增加一个item到ToolBox的底部,新增加的item的标签的文本是label。
1 4) int QToolBox::count() const
返回该工具箱中item的数目。
1 5) int QToolBox::currentIndex() const
返回当前活动item的索引。
1 6) QWidget *QToolBox::currentItem() const
返回当前活动item,如果该ToolBox为空,返回0。
1 7) int QToolBox::indexof (QWidget *item) const
返回item的索引。
1 8) int QToolBox::insertItem(int index,QWidget *item,const QIconSet & iconSet,const QString & label)
在索引index处插入一个新的项目,项目是item,标签图标是iconSet,标签文本是label,返回插入item的索引。

1 9) int QToolBox::insertItem(int index,QWidget *item, const QString & label)
在索引index处插入一个新的项目,项目是item,标签文本是label,返回插入item的索引。
1 10) QWidget *QToolBox::item (int index) const
返回索引index位置的item。
1 11) QString QToolBox::itemLabel(int index) const
返回索引index位置的标签。
1 12) int QToolBox::RemoveItem(QWidget *item)
删除该ToolBox中的item项目,删除成功后返回item的索引,否则返回-1。
1 13) void QToolBox::setCurrentIndex(int index)
设置索引index位置的项目为当前活动项目。
1 14) void QToolBox::setCurrentIndex(QWidget *item)
设置索引item为当前活动项目。
1 15) void QToolBox::setItemLabel ( int index,const QString & label)
设置label为索引index位置的项目的标签文本。
365 示例10:ToolBox的应用
在这个示例中,我们只是简单地设计了Qt Creator中的工具箱的模型,没有实际操作功能。

首先建立一个空项目,在空项目中添加新建C++Class,新添加的C++Class配置如图3-49所示。 (点击查看大图)图3-49 新建C++类
1示例说明 本示例只是实现了类似于Qt Creator控件栏的外形,没有实际操作功能,目的是让大家学会怎样向ToolBox中添加控件和在ToolBox中对控件进行布局。 2示例实现
头文件toolboxh(文中的粗体为需要添加的内容):

1 #ifndef TOOLBOX_H
2 #define TOOLBOX_H
3 #include
4 #include
5 class toolbox : public QToolBox
6 {
7 Q_OBJECT
8 public:
9 explicit toolbox(QWidget *parent = 0);
10
11
12 QToolButton *toolButton1_1; //声明多个QToolButton类对象
13 QToolButton *toolButton1_2;
14 QToolButton *toolButton1_3;
15 QToolButton *toolButton1_4;
16 QToolButton *toolButton2_1;
17 QToolButton *toolButton2_2;
18 QToolButton *toolButton3_1;
19 QToolButton *toolButton3_2;
20 QToolButton *toolButton3_3;
21 QToolButton *toolButton3_4;
22 signals:
23 public slots:
24 };
25 #endif // TOOLBOX_H
在头文件中声明多个ToolButton控件。 在类实现文件toolboxcpp中自动生成如下代码:
1 #include "toolboxh"
2 toolbox::toolbox(QWidget *parent) :
3 QToolBox(parent)

4 {
5 }
在主窗体toolboxcpp文件中添加的头文件:
1 #include
2 #include
3 #include
在主窗体toolboxcpp文件中构造函数:
1 /构造函数/
2 toolbox::toolbox(QWidget parent) :
3 QToolBox(parent)
4 {
5 /************定义QGroupBox************/
6 QGroupBox groupBox1 = new QGroupBox;
7 QGroupBox
groupBox2 = new QGroupBox();
8 QGroupBox
groupBox3 = new QGroupBox();
9
10 /************Layout的QToolButton************/
11 this->toolButton1_1 = new QToolButton;
12 this->toolButton1_1->setText(tr("Vertical Layout"));
13 this->toolButton1_1->setAutoRaise(true);
14 this->toolButton1_2 = new QToolButton;
15 this->toolButton1_2->setText(tr("Horizontal Layout"));
16 this->toolButton1_2->setAutoRaise(true);
17 this->toolButton1_3 = new QToolButton;
18 this->toolButton1_3->setText(tr("Grid Layout"));
19 this->toolButton1_3->setAutoRaise(true);

20 this->toolButton1_4 = new QToolButton;
21 this->toolButton1_4->setText(tr("Form Layout"));
22 this->toolButton1_4->setAutoRaise(true);
23
24 /*************Spacers的ToolButton***************/
25 this->toolButton2_1 = new QToolButton;
26
27
28 this->toolButton2_1->setText(tr("Horizontal Spacer"));
29 this->toolButton2_1->setAutoRaise(true);
30 this->toolButton2_2 = new QToolButton;
31 this->toolButton2_2->setText(tr("Vertical Spacer"));
32 this->toolButton2_2->setAutoRaise(true);
33
34 /************Buttons*************************/
35 this->toolButton3_1 = new QToolButton;
36 this->toolButton3_1->setText(tr("Push Button"));
37 this->toolButton3_1->setAutoRaise(true);
38 this->toolButton3_2 = new QToolButton;
39 this->toolButton3_2->setText(tr("Tool Button"));
40 this->toolButton3_2->setAutoRaise(true);
41 this->toolButton3_3 = new QToolButton;
42 this->toolButton3_3->setText(tr("Radio Button"));
43 this->toolButton3_3->setAutoRaise(true);
44 this->toolButton3_4 = new QToolButton;
45 this->toolButton3_4->setText(tr("Check Box"));

46 this->toolButton3_4->setAutoRaise(true);
47
48 /************给Layout布局*************************/
49 QVBoxLayoutlayout1 = new QVBoxLayout(groupBox1);
50 layout1->setMargin(10);
51 layout1->setAlignment(QT::AlignLeft);
52 layout1->addWidget(toolButton1_1);
53 layout1->addWidget(toolButton1_2);
54 layout1->addWidget(toolButton1_3);
55 layout1->addWidget(toolButton1_4);
56 layout1->addStretch();
57
58 /************给Spacers布局*************************/
59 QVBoxLayout
layout2 = new QVBoxLayout(groupBox2);
60 layout2->setMargin(10);
61 layout2->setAlignment(QT::AlignLeft);
62 layout2->addWidget(toolButton2_1);
63 layout2->addWidget(toolButton2_2);
64 layout2->addStretch();
65
66 /************给Buttons布局*************************/
67 QVBoxLayout*layout3 = new QVBoxLayout(groupBox3);
68 layout3->setMargin(10);
69 layout3->setAlignment(QT::AlignLeft);
70 layout3->addWidget(toolButton3_1);
71 layout3->addWidget(toolButton3_2);
72 layout3->addWidget(toolButton3_3);
73 layout3->addWidget(toolButton3_4);

74 addItem(groupBox1, tr("Layouts"));
75 addItem(groupBox2, tr("Spacers"));
76 addItem(groupBox3, tr("Buttons"));
77 }
主文件maincpp:
1 #include <QTGui/QApplication>
2 #include "toolboxh"
3 int main(int argc, char *argv[])
4
5
6 {
7 QApplication a(argc, argv);
8 toolbox w;
9 wshow();
10 return aexec();
11 }
3示例执行结果 示例执行结果如图3-50所示。

图3-50 示例10执行结果
366 TabWidget控件(1)
1控件位置 Containers→TabWidget 2控件介绍 TabWidget控件(切换卡)的样式如图3-51所示。切换卡控件顶部或底部有一个标签选项栏,每个标签选项都有一个页面。选择哪个页面,只须单击对应的标签选项即可,或按指定的【ALT+字母】快捷键组合即可。TabWidget的工作方式与前面的控件有一些区别。简单地说,TabWidget控件只是用来显示页面的标签页的容器。 图3-51 TabWidget控件
3控件设置选项
在TabWidget控件的properties选项中,一般常对以下选项进行设置。  name:该控件对应源代码中的名称;

currentPage:当前活动的页面; margin:页面边框的空白宽度,默认是0; tabShap:标签选项的模式; pageName:当前活动页的名称; pageTitle:当前活动页的标签文本。 4常用成员函数
1 1) QTabWidget::QTabWidget ( QWidget *parent = 0, const char *name = 0, WFlags f = 0 )
构造一个名称为name、父对象为parent和标记为f的TabWidget。
1 2) void QTabWidget::addTab ( QWidget *child, const QString & label ) [virtual]
增加子页到该TabWidget,子页控件是child,子页标签文本是label。
1 3) void QTabWidget::addTab( QWidget *child, const QIconSet & iconset, const QString & label ) [virtual]
这是一个重载成员函数,功能同函数2),只是增加了一个iconset,iconset是图标集。
1 4) QString QTabWidget::tabLabel ( QWidget *w ) const

返回索引index处子页的选项标签文本。
1 5) void QTabWidget::changeTab ( QWidget *w, const QString & label )
更改子页w的标签文本为label。
1 6) void QTabWidget::changeTab ( QWidget *w, const QIconSet & iconset, const QString & label )
更改子页w的图标为iconset和更改标签文本为label。
1 7) int QTabWidget::count () const
366 TabWidget控件(2) 返回该TabWidget中子页的数目。
1 8) QWidget *QTabWidget::currentPage () const
返回当前活动子页。
1 9) int QTabWidget::currentPageIndex () const
返回当前活动子页的索引。
1 10) int QTabWidget::indexOf ( QWidget *w ) const
返回子页w的索引。
1 11) void QTabWidget::insertTab ( QWidget *child, const QString & label, int index = -1 ) [virtual]
在索引index处插入新的子页,子页控件是child,子页标签文本是label。注意:在插入新的子页时要确保插入的子页名与标签文本与TabWidget中

的所有子页不同。如果指定index,就是在指定的位置插入,否则就和简单的添加一样。
1 12) void QTabWidget::insertTab ( QWidget *child, const QIconSet & iconset, const QString & label, int index = -1 ) [virtual]
在索引index处插入新的子页,子页控件是child,子页标签文本是label,子页图标为iconset。
1 13) QString QTabWidget::label ( int index ) const
返回索引index处子页的选项标签。
1 14) QWidget *QTabWidget::page ( int index ) const
返回索引index处子页。
1 15) void QTabWidget::removePage ( QWidget *w ) [virtual slot]
删除子页w。
1 16) void QTabWidget::setCurrentPage ( int index ) [slot]
设置索引index处子页为当前活动页。
1 17) void QTabWidget::setTabLabel ( QWidget *w, const QString & label)
设置子页w的标签文本为label。

367 示例11:TabWidget的应用(1)
TabWidget控件是一个经常使用的控件,它可以把很多内容集中在一个窗体中,以减少很多窗体,使软件界面美观大方,操作简便。下面我们就通过这个示例来了解TabWidget的具体用法。 首先创建标准的Qt Gui Application项目,把项目自动生成的主界面中的toolBar、menuBar和statusBar删除,界面设计结果如图3-52所示。 图3-52 示例11界面
1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-15所示。 表3-15 主要控件说明
2示例说明

在设计界面时,TabWidget控件中有一个Tab1选项卡; 自定义3个选项卡QLabel、QPushButton和QTextEdit,分别添加到tabWidget控件中; 单击“addTab”按钮,在TabWidget控件中添加一个新的选项卡; 程序执行后,可以关闭TabWidget中的选项卡。 3示例实现 头文件mainwindowh(文中的粗体为需要添加的内容):
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3 #include
4 namespace Ui {
5 class MainWindow;
6 }
7 class MainWindow : public QMainWindow
8 {
9 Q_OBJECT
10 public:
11 explicit MainWindow(QWidget *parent = 0);
12 ~MainWindow();
13 private:
14 Ui::MainWindow *ui;
15 private slots: //声明槽函数
16 void on_btnAddTab_clicked();
17 void removeSubTab(int index);
18 };

19 #endif // MAINWINDOW_H
声明两个槽函数,槽函数on_btnAddTab_clicked()对应单击按钮“addTab”,是通过右击控件→Go to slots自动生成的,所以不用在实现文件中添加映射函数。槽函数removeSubTab(int index)对应关闭选项卡信号。 在主窗体mainwindowcpp文件中自动生成如下代码:
1 #include "mainwindowh"
2 #include "ui_mainwindowh"
3 MainWindow::MainWindow(QWidget parent) :
4 QMainWindow(parent),
5 ui(new Ui::MainWindow)
6 {
7 ui->setupUi(this);
8 }
9 MainWindow::~MainWindow()
10 {
11 delete ui;
12 }
在主窗体mainwindowcpp文件中添加的头文件:
1 #include
2 #include
3 #include
367 示例11:TabWidget的应用(2)
在主窗体mainwindowcpp文件中构造函数:
1 /
构造函数*/
2 MainWindow::MainWindow(QWidget *parent) :

3 QMainWindow(parent),
4 ui(new Ui::MainWindow)
5 {
6 ui->setupUi(this);
7
8 /************界面初始化*************************/
9 ui->tabWidget->setWindowTitle("TabWidget");
10 ui->tabWidget->addTab(new QLabel("

<font
11 color=blue>Hello!World!

"),"QLabel");
12 ui->tabWidget->addTab(new QPushButton("Push XD"), "QPushButton");
13 ui->tabWidget->addTab(new QTextEdit, "QTextEdit");
14 ui->tabWidget->setTabsClosable(true);
15
16 /************信号和槽的映射************************/
17 connect(ui->tabWidget,SIGNAL(tabCloseRequested(int)),this,SLOT(removeSubTab(int)));
18 }
在主窗体mainwindowcpp文件中添加槽函数removeSubTab(int index):
1 /槽函数:删除tab/
2 void MainWindow::removeSubTab(int index)

3 {
4 ui->tabWidget->removeTab(index);
5 }
在主窗体mainwindowcpp文件中添加槽函数on_btnAddTab_clicked():
1 /槽函数:添加tab/
2 void MainWindow::on_btnAddTab_clicked()
3 {
4 QTextEdit *edit=new QTextEdit;
5
6 /************设置edit显示Hello World!*************************/
7 edit->sethtml("

Hello World!

");
8 ui->tabWidget->addTab(edit,"New Tab");
9 ui->tabWidget->setCurrentIndex(ui->tabWidget->count()-1);
10 }
主文件maincpp不需任何更改,使用项目自动生成的即可。 4示例执行结果 示例执行结果如图3-53所示。

图3-53 示例11执行结果
368 StackedWidget控件
1控件位置 Containers→StackedWidget 2控件介绍 StackedWidget控件中文称作“控件栈”。Qt提供了这样一个控件栈,可以使开发人员用栈管理控件像用栈管理其他数据类型一样简单。控件栈只显示栈顶的控件。开发人员可以使用raiseWidget()函数把栈中任何其他控件移到栈顶,从而实现控件之间的切换。 3控件设置选项 在Stacked Widget控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; currentPage:当前活动的页面; pageName:当前活动页的名称; font:设置该控件内部文本的字体。
4常用成员函数

1 1) QWidgetStack::QWidgetStack ( QWidget *parent = 0, const char *name = 0 )
构造一个名称为name、父对象为parent的WidgetStack。
1 2) int QWidgetStack::addWidget ( QWidget *w, int id = -1 )
把控件w添加到该控件栈中,标识是id。
1 3) int QWidgetStack::id ( QWidget *w ) const
返回控件w的标识。
1 4) void QWidgetStack::raiseWidget ( int id ) [slot]
把标识为id的控件升到该控件栈的栈顶。
1 5) void QWidgetStack::raiseWidget ( QWidget *w ) [slot]
把控件w升到该控件栈的栈顶。
1 6) void QWidgetStack::removeWidget ( QWidget *w )
把控件w从该控件栈中删除。
1 7) QWidget *QWidgetStack::widget ( int id ) const
返回标识是id的控件。
369 示例12:StackedWidget的应用
在使用StackedWidget创建界面时,一般和QListWidget一起使用,可以实现类似TabWidget的功能,但是它的界面布局和外形相对于TabWidget就灵活很多。

首先创建标准的Qt Gui Application项目,把项目在主界面中自动生成的toolBar、menuBar和statusBar删除,界面设计结果如图3-54所示。 图3-54 示例12界面
1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-16所示。 表3-16 主要控件说明
2示例说明 这个示例很简单,单击listWidget中的窗口选项,右侧stackedWidget把对应窗口调到栈顶,显示对应窗口。
3示例实现

所有控件都是采用拖拽的方式布局的,所以没有在头文件中声明任何控件,示例很简单,也没有声明任何槽函数和成员函数,所以没有对头文件mainwindowh进行任何更改。 在主窗体mainwindowcpp文件中自动生成如下代码:
1 #include "mainwindowh"
2 #include "ui_mainwindowh"
3 MainWindow::MainWindow(QWidget parent) :
4 QMainWindow(parent),
5 ui(new Ui::MainWindow)
6 {
7 ui->setupUi(this);
8 }
9 MainWindow::~MainWindow()
10 {
11 delete ui;
12 }
在主窗体mainwindowcpp文件中构造函数(文中的粗体为需要添加的内容):
1 /
构造函数*/
2 MainWindow::MainWindow(QWidget *parent) :
3 QMainWindow(parent),
4 ui(new Ui::MainWindow)
5 {
6 ui->setupUi(this);
7 setWindowTitle(tr("StackedWidget")); //设置窗口标题

8 connect(ui->listWidget,SIGNAL(currentRowChanged(int)),ui->stackedWidget, SLOT(setCurrentIndex(int) ) );//设置信号与槽的映射
9 }
在这个示例中,可以不用手写任何代码,通过在Property Editor中对窗口的属性进行修改,修改windowTitle项为StackedWidget,如图3-55所示。 图3-55 Property Editor窗口
在Signals & Slots Editor窗口中添加新编辑项,选项如图3-56所示。 图3-56 Signals & Slots Editor窗口

这样就不用在实现函数的构造函数中添加如下代码了。
1 setWindowTitle(tr("StackedWidget"));
2 connect(ui->listWidget,SIGNAL(currentRowChanged(int)),ui->stackedWidget, SLOT(setCurrentIndex(int)));
主文件maincpp没有进行任何更改,使用项目自动生成的即可。 4示例执行结果 示例执行结果如图3-57所示。 图3-57 示例12执行结果
3610 Frame控件
1控件位置 Containers→Frame

2控件介绍 Frame控件(框架)的样式如图3-58所示。Frame用来存放其他控件,也可用于装饰。它一般用来作为更加复杂容器的基础,也可以用在form中作为占位控件。 图3-58 Frame控件
3控件设置选项 在Frame控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; framesShape:框架外形格式; framesShadow:框架阴影格式; frameWidth:框架的宽度(只读); LineWidth:线宽。 4常用成员函数

1 QFrame::QFrame ( QWidget *parent = 0, const char *name = 0, WFlags f = 0 )
构造一个框架风格为NoFrame并且1像素框架宽度的框架窗口部件,例如:
1 QFrame *f = new QFrame ();
3611 Widget控件
1控件位置 Containers→Widget 2控件介绍 Widget控件(组件)在创建时是不可见的,它可以包含子控件,在删除该Widget时,子控件也将一起删除。 3控件设置选项 在Widget控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置表盘上的字体; cursor:设置鼠标光标样式。 4常用成员函数
1 1) QWidget::QWidget ( QWidget *parent = 0, const char *name = 0, WFlags f =0 )
构造一个名称为name、父对象为parent的Widget。

1 2) QWidget *QWidget::childAt ( int x, int y, bool includeThis = FALSE ) const
返回该Widget坐标系统中像素位置(x,y)处的可视的子窗口部件。
1 3) QWidget *QWidget::childAt ( const QPoint & p, bool includeThis = FALSE ) const
返回该Widget坐标系统位置p处的可视的子窗口部件。
1 4) void QWidget::drawText ( int x, int y, const QString &str )
在该Widget坐标系统中像素位置(x,y)处绘制字符串str。
1 5) void QWidget::drawText ( const QPoint & p,const QString &str )
在该Widget坐标系统中位置p处绘制字符串str。
3612 MdiArea控件
1控件位置 Containers→MdiArea 2控件介绍
MdiArea控件中文称作“MDI窗口显示区”。先来解释一下什么是MDI,MDI是Multiple Document Interface的简称,中文意思是多文档界面,多文档界面主要适用于当完成一项工作时需要用到多个文件,例如影像处理软件。QMainWindow是SDI(Single Document Interface,单文档界面)。每个开启的文件占据一个视窗,主要适用于所有工作没有太多文件参与的情况。

3控件设置选项 在MdiArea控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置字体; viewMode:设置视图模式Qt提供TabbedView和SubWindowView两种选择; documentMode:保存的标签栏在选项卡式视图模式是否设置为文件的模式,默认为false; tabShape:(当viewMode是TabbedView时)设置该MdiArea的标签形式Qt提供两种选择:Rounded和Triangular; tabPosition:(当viewMode是TabbedView时)设置标签所在方向; activeSubWindowName:子窗口的名称; activeSubWindowTitle:子窗口的标签。 4常用成员函数
1 1) QMdiArea::QMdiArea ( QWidget *parent = 0 )
构造一个父对象为parent的MdiArea。
1 2) void QMdiArea::activateNextSubWindow () [slot]
激活下一个窗口。

1 3) void QMdiArea::activatePreviousSubWindow () [slot]
激活上一个窗口。
1 4) QMdiSubWindow *QMdiArea::activeSubWindow () const
返回当前活动子窗口,如果当前没有活动子窗口,则返回0。
1 5) QMdiSubWindow *QMdiArea::addSubWindow( QWidget *widget, QT::WindowFlags windowFlags = 0)
添加一个新的子窗口部件。
1 6) void QMdiArea::closeActiveSubWindow () [slot]
关闭当前活动子窗口。
1 7) void QMdiArea::closeAllSubWindows () [slot]
关闭所有的子窗口。
1 8) QMdiSubWindow *QMdiArea::currentSubWindow () const
函数功能同activeSubWindow()。
1 9) void QMdiArea::removeSubWindow ( QWidget *widget )
删除widget,widget必须是该MdiArea的子部件。
1 10) void QMdiArea::setActiveSubWindow ( QMdiSubWindow *window ) [slot]
设置子窗口window为当前活动子窗口。

3613 示例13:MdiArea的应用(1)
MdiArea一般用来设计多文档界面,下面就通过一个示例来具体学习MdiArea的用法。 首先创建标准的Qt Gui Application项目,把项目在主界面中自动生成的toolBar、menuBar和statusBar删除,界面设计结果如图3-59所示。 图3-59 示例13界面
1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-17所示。 表3-17 主要控件说明

2示例说明 程序执行后,构造函数会在mdiArea中添加5个窗体; 单击“上一个窗体”按钮,mdiArea中的上一个窗体变成当前活动窗体; 单击“下一个窗体”按钮,mdiArea中的下一个窗体变成当前活动窗体; 单击“关闭当前窗体”按钮,程序会关闭mdiArea中当前活动窗体; 单击“关闭所有窗体”按钮,程序会关闭mdiArea中的所有窗体。 3示例实现 头文件mainwindowh(文中的粗体为需要添加的内容):
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3 #include
4 namespace Ui {
5 class MainWindow;
6 }
7 class MainWindow : public QMainWindow

8 {
9 Q_OBJECT
10 public:
11 explicit MainWindow(QWidget *parent = 0);
12 ~MainWindow();
13 private:
14 Ui::MainWindow