您正在查看: Qt 分类下的文章

Linux环境下Qt4图形界面与MySQL编程4

37 输入组件(Input Widgets)
qt Creator有15种Input Widgets,如图3-62所示。 图3-62 Input Widgets控件
Input Widgets的qt类和名称介绍如表3-18所示。 表3-18 Input Widgets介绍

本节主要介绍Qt Creator的Input Widgets的使用方法。Qt具有多种Input类型控件,分别有ComboBox、LineEdit、TextEdit等显示控件。Qt Creator比Qt Designer新增添了很多输入控件,使开发人员更加方便设计界面。 下面就来具体介绍各种Input Widgets的用法。
371 ComboBox控件
1控件位置 Input Widgets→ComboBox 2控件介绍 ComboBox控件(组合框)的样式如图3-63所示。Qt Creator的ComboBox和Qt Designer的ComboBox样式有些不同。

图3-63 ComboBox控件
3控件设置选项 在ComboBox控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置显示的字体; editable:用来获取或设置一个值,以确定ComboBox的编辑框是否可编辑。值为true时为可编辑,值为false时为只读; currentIndex:当前选项的索引; maxVisibleItems:ComboBox可见的最大项目数; maxCount:ComboBox的最大项目数。 4常用成员函数
1 1) QComboBox::QComboBox ( QWidget *parent = 0, const char *name = 0 )
构造一个名称为name、父对象为parent的ComboBox。
1 2) QComboBox::QComboBox ( bool rw, QWidget *parent = 0, const char *name = 0 )
构造一个名称为name、父对象为parent的ComboBox。如果rw是true,则编辑栏可编辑;否则只能选择ComboBox项目之一。
1 3) void QComboBox::clear () [slot]

删除ComboBox中的所有项目。
1 4) int QComboBox::count () const
返回ComboBox中的项目数。
1 5) int QComboBox::currentItem () const
返回ComboBox中当前项目的索引。
1 6) QString QComboBox::currentText () const
返回组合框的当前项目文本。
1 7) void QComboBox::insertItem ( const QString & t, int index = -1 )
在索引index处,插入一个文本为t的项目。如果index是负数,该项目将被追加到末尾。
1 8) void QComboBox::insertItem ( const QPixmap & pixmap, int index = -1 )
在索引index处,插入一个图标为pixmap的项目。如果index是负数,该项目将被追加到末尾。
1 9) void QComboBox::insertItem ( const QPixmap & pixmap, const QString & text, int index = -1 )
在索引index处,插入一个文本为t和图标为pixmap的项目。如果index是负数,该项目将被追加到末尾。
1 10) QString QComboBox::currentText () const
返回组合框的当前项目文本。
1 11) void QComboBox::removeItem ( int index )
删除索引index处项目。
1 12) void QComboBox::setCurrentItem ( int index ) [virtual]
把索引index处的项目设为当前项目。

372 Font ComboBox控件
1控件位置 Input Widgets→Font ComboBox 2控件介绍 Font ComboBox控件(字体组合框)继承于QComboBox类,样式如图3-64所示。Font ComboBox组合框分两个部分显示:顶部是一个允许输入文本的文本框,下面的列表框则显示列表项。可以认为Font ComboBox就是文本框与列表框的组合。与列表框相比,组合框不能选择多项,只能选择其中的一项,专门用于字体选择。 图3-64 Font ComboBox控件
3控件设置选项 在Font ComboBox控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置显示的字体;

editable:用来获取或设置一个值,以确定ComboBox的编辑框是否可编辑。值为true时为可编辑,值为false时为只读; currentIndex:当前选项的索引; currentFont:当前字体; maxVisibleItems:ComboBox可见的最大项目数; maxCount:ComboBox的最大项目数。 4常用成员函数
1 QFontComboBox::QFontComboBox ( QWidget *parent = 0 )
构造一个父对象为parent的Font ComboBox。
373 LineEdit控件
1控件位置 Input Widgets→LineEdit 2控件介绍 LineEdit控件(行编辑)是一种常用且比较容易掌握的控件。应用程序主要使用它来接收输入文字信息,样式如图3-65所示。

图3-65 LineEdit控件
3控件设置选项 在LineEdit控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; text:该控件对应图形界面中显示的名称; font:设置text的字体; ReadOnly:用来获取或设置一个值,该值指示文本框中的文本是否为只读,值为true时为只读,值为false时为可读写。 4常用成员函数
1 1) QLineEdit::QLineEdit ( QWidget *parent, const char *name = 0 )
构造一个名称为name、父对象为parent的LineEdit。
1 2) QLineEdit::QLineEdit ( const QString & contents, QWidget *parent, const char *name = 0 )
构造一个名称为name、父对象为parent和内容为contents的LineEdit。
1 3) void QLineEdit::clear () [virtual slot]
清除行编辑的内容。
1 4) bool QLineEdit::isReadOnly () const
如果行编辑是只读则返回true,否则返回false。

1 5) void QLineEdit::setReadOnly ( bool )[virtual slot]
设置行编辑的读写属性。
1 6) void QLineEdit::setText ( const QString & ) [virtual slot]
设置行编辑的文本。
1 7) QString QLineEdit::text () const
返回行编辑的文本。
374 TextEdit控件
1控件位置 Input Widgets→TextEdit 2控件介绍 TextEdit控件(文本编辑)的样式如图3-66所示。应用程序主要使用它输入文本信息或显示文本信息。TextEdit的属性和成员函数与LineEdit基本相同,在此不做介绍。

图3-66 TextEdit控件
375 PlainTextEdit控件
1控件位置 Input Widgets→PlainTextEdit 2控件介绍 PlainTextEdit控件中文称作“文本编辑”。PlainTextEdit控件和TextEdit控件只是样式有些不同,可以通过设置属性来改变样式。 3常用成员函数 构造函数:
1 1) QPlainTextEdit::QPlainTextEdit ( QWidget *parent = 0 )
2 2) QPlainTextEdit::QPlainTextEdit ( const QString & text, QWidget *parent = 0 )
例如:
1 QPlainTextEdit *plaintextedit = new QPlainTextEdit("Hello World!",this);

376 示例15:ComboBox、LineEdit和TextEdit的应用(1)
ComboBox、LineEdit和TextEdit都是常用控件,并且Font ComboBox和ComboBox用法相似,PlainTextEdit和TextEdit用法相似,所以Font ComboBox和PlainTextEdit的示例就不再单独列举,这里用一个综合示例来介绍这几个控件的详细用法。 首先创建标准的Qt Gui Application项目,把项目在主界面中自动生成的toolBar、menuBar和statusBar删除,界面设计结果如图3-67所示。 1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-19所示。 图3-67 示例15界面
表3-19 主要控件说明

控件类型控件名称控件说明QLineEditleX四则运算的第一个参数QComboBoxcbxRule四则运算的规则QLineEditleY四则运算的第二个参数QPushButtonbtnEqual计算结果QTextEdittextEditResult显示计算结果 2示例说明 本示例实现的是简单的四则运算; 在两个输入框中输入两个参数,选择运算法则,然后单击“=”按钮,运算结果显示在右边的textEdit框中。 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_btnEqual_clicked();
17 };
18 #endif // MAINWINDOW_H
在头文件中声明一个槽函数on_btnEqual_clicked(),对应按钮“=”的单击信号。此处的槽函数是通过右击控件→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 }
376 示例15:ComboBox、LineEdit和TextEdit的应用(2)
在主窗体mainwindowcpp文件中添加的头文件:

1 #include
在主窗体mainwindowcpp文件中槽函数on_btnEqual_clicked():
1 /槽函数:计算结果/
2 void MainWindow::on_btnEqual_clicked()
3 {
4 if(ui->leX->text()isEmpty())
5 {
6 QMessageBox::warning(NULL, "warning", "Please input X ", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
7 }
8 if(ui->leY->text()isEmpty())
9 {
10 QMessageBox::warning(NULL, "warning", "Please input Y ", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
11 }
12 int x,y;
13 str += ui->leX->text()+ui->cbxRule->currentText()+ui->leY->text()+" = ";
14
15 /**************获取x和y*********************************/
16 x=ui->leX->text()toInt();
17 y=ui->leY->text()toInt();
18
19 /**************判断法则**********************************/
20 if(ui->cbxRule->currentText()=="+")
21 str +=QString::number(x+y)+"\n";
22 else if(ui->cbxRule->currentText()=="-")

23 str +=QString::number(x-y)+"\n";
24 else if(ui->cbxRule->currentText()=="")
25 str +=QString::number(x
y)+"\n";
26 else if(ui->cbxRule->currentText()=="/")
27 str +=QString::number(x/y)+"\n";
28
29 /****************显示结果***********************************/
30 ui->textEditResult->setText(str);
31 }
主文件maincpp没有进行任何更改,使用该项目自动生成的即可。 4示例执行结果 示例执行结果如图3-68所示。 图3-68 示例15执行结果

377 SpinBox控件
1控件位置 Input Widgets→SpinBox 2控件介绍 SpinBox控件(整数旋转框)的样式如图3-69所示。SpinBox允许用户通过单击向上/向下按钮来增加/减少当前显示的值,也可以直接输入旋转框的值。如果该值是直接输入旋转框,一般需要按【Enter】键确认新值(有的版本不需要),该值通常是一个整数。 图3-69 SpinBox控件
3控件设置选项 在SpinBox控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置编辑框的字体; value:SpinBox默认值; lineStep:使用箭头来改变旋转框的值的递增/递减量;

minValue:SpinBox的最小值; maxValue:SpinBox的最大值; prefix:SpinBox的前缀字符串; Suffix:SpinBox的后缀字符串。 4常用成员函数
1 1) QSpinBox::QSpinBox ( QWidget *parent = 0, const char *name = 0 )
构造一个名称为name、父对象为parent的SpinBox。
1 2) QSpinBox::QSpinBox ( int minValue, int maxValue, int step = 1, QWidget *parent = 0, const char *name = 0 )
构造一个名称为name、父对象为parent、最小值为minValue、最大值为maxValue和增/减量为step的SpinBox。例如:
1 QSpinBox *sb = new QSpinBox(0,99,1,this);
2 3) void QSpinBox::stepDown () [virtual slot]
把旋转框的值减小一个lineStep。等同于单击向下按钮。
1 4) void QSpinBox::stepUp () [virtual slot]
把旋转框的值增加一个lineStep。等同于单击向上按钮。
1 5) QString QSpinBox::text () const
返回旋转框的文本,包括前缀和后缀。
1 6) int QSpinBox::value () const
返回旋转框的值。

1 7) void QSpinBox::setValue ( int value ) [virtual slot]
设置旋转框的值。
1 8) void QSpinBox::setLineStep ( int )
设置旋转框的增/减量。
1 9) void QSpinBox::setMaxValue ( int )
设置旋转框的最大值。
1 10) void QSpinBox::setMinValue ( int )
设置旋转框的最小值。
1 11) void QSpinBox::setPrefix ( const QString & text ) [virtual slot]
设置旋转框的前缀字符串。
1 12) void QSpinBox::setSuffix ( const QString & text ) [virtual slot]
设置旋转框的后缀字符串。
378 Double SpinBox控件
1控件位置 Input Widgets→Double SpinBox 2控件介绍

Double SpinBox控件(小数旋转框)继承于QSpinBox,样式如图3-70所示。Double SpinBox与SpinBox的不同是其可以表示小数,而其他的功能都一样。 图3-70 Double SpinBox控件
3控件设置选项 在Double SpinBox控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置编辑框的字体; value:SpinBox默认值; lineStep:使用箭头来改变旋转框的值的递增/递减量; minValue:SpinBox的最小值; maxValue:SpinBox的最大值; prefix:SpinBox的前缀字符串; Suffix:SpinBox的后缀字符串;

decimals:SpinBox的小数位数。 4常用成员函数
1 1) QDoubleSpinBox::QDoubleSpinBox ( QWidget *parent = 0 )
构造一个父对象为parent的Double SpinBox,例如:
1 QDoubleSpinBox *dsb = new QDoubleSpinBox(this);
379 Slider控件
1控件位置 Input Widgets→Horizontal/Vertical Slider 2控件介绍 Slider控件(滑动条)的样式如图3-71所示。与Qt Designer不同的是,Qt Creator只是把Slider分成Horizontal/Vertical Slider两个控件,但是功能相同,两种滑动条之间可以相互转换,只须改变orientation属性即可。

图3-71 Slider控件
3控件设置选项 在Slider控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置滑动条上的字体; lineStep:滑动条值的最小跨度; value:滑动条的值; minValue:滑动条的最小值; maxValue:滑动条的最大值; orientation:滑动条的布局方向,Qt提供的选择有Horizontal和Vertical。 4常用成员函数
1 1) QSlider::QSlider ( QWidget *parent, const char *name = 0 )
构造一个名称为name、父对象为parent的Slider。
1 2) QSlider::QSlider ( Qrientation orientation, QWidget *parent , const char *name = 0 )

构造一个名称为name、父对象为parent和布局方向为orientation的Slider。
1 3) QSlider::QSlider ( int minValue, int maxValue, int pageStep, int value, Orientation orientation, QWidget *parent , const char *name = 0 )
构造一个名称为name、父对象为parent、布局方向为orientation、最大值为maxValue、最小值为minValue、页步长为pageStep和值为value的Slider。
1 4) void QSlider::setValue ( int v ) [virtual slot]
设置该滑动条的值为v。
1 5) int QSlider::value () const
返回该滑动条的值。
3710 示例16:SpinBox、Double SpinBox和Slider的应用(1)
首先创建标准的Qt Gui Application项目,把项目在主界面中自动生成的toolBar、menuBar和statusBar删除。设计界面如图3-72所示。

图3-72 示例16界面
1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-20所示。 表3-20 主要控件说明
2示例说明 改变spinBox的值,horizontalSlider的值随着改变;改变horizontalSlider的值,spinBox的值也会随着改变; 改变doubleSpinBox的值,horizontalSlider_2的值随着改变;改变horizontalSlider_2的值,doubleSpinBox的值也会随着改变。 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 slotDoubleSpinbox_Slider();
17 void slotSlider_DoubleSpinbox();
18 };
19 #endif // MAINWINDOW_H
在头文件中声明两个槽函数,槽函数slotDoubleSpinbox_Slider()使horizontalSlider_2的值随着doubleSpinBox的值发生变化而变化;槽函数slotSlider_DoubleSpinbox()使doubleSpinBox的值随着horizontalSlider_2的值改变而改变。另外,在Signals & Slots Editor窗口中添加了两个信号和槽的映射,如图3-73所示。 图3-73 信号与槽的映射
在主窗体mainwindowcpp文件中自动生成如下代码:

1 #include "mainwindowh"
2 #include "ui_mainwindowh"
3 MainWindow::MainWindow(QWidget parent) :
4
5
6 QMainWindow(parent),
7 ui(new Ui::MainWindow)
8 {
9 ui->setupUi(this);
10 }
11 MainWindow::~MainWindow()
12 {
13 delete ui;
14 }
3710 示例16:SpinBox、Double SpinBox和Slider的应用(2) 在主窗体mainwindowcpp文件中构造函数:
1 /
构造函数*/
2 MainWindow::MainWindow(QWidget *parent) :
3 QMainWindow(parent),
4 ui(new Ui::MainWindow)
5 {
6 ui->setupUi(this);
7
8 /*********信号和槽的映射******************************/
9 connect(ui->doubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotDoubleSpinbox_Slider()));
10 connect(ui->horizontalSlider_2, SIGNAL(valueChanged(int)), this, SLOT(slotSlider_DoubleSpinbox()));
11 }
在主窗体mainwindowcpp文件中添加槽函数slotDoubleSpinbox_Slider():

1 /槽函数:设置horizontalSlider_2的值/
2 void MainWindow::slotDoubleSpinbox_Slider()
3 {
4 ui->horizontalSlider_2->setValue((int)(ui->doubleSpinBox->value()100));
5 }
在主窗体mainwindowcpp文件中添加QSlider horizontalSlider_2的槽函数:
1 /
槽函数:设置doubleSpinBox的值*/
2 void MainWindow::slotSlider_DoubleSpinbox()
3 {
4 ui->doubleSpinBox->setValue((double)(ui->horizontalSlider_2->value())/100);
5 }
主文件maincpp没有进行任何更改,使用项目自动生成的即可。 4示例执行结果 示例执行结果如图3-74所示。 图3-74 示例16执行结果
3711 Dial控件
1控件位置 Input Widgets→Dial

2控件介绍 Dial控件(表盘)的样式如图3-75所示。Dial可以用来描述各种各样的仪表盘样式。 图3-75 Dial控件
3控件设置选项 在Dial控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置表盘上的字体; lineStep:表盘值的最小跨度; value:表盘的值; minValue:表盘的最小值; maxValue:表盘的最大值; notchTarget:表盘的刻度;

notchesVisible:是否显示表盘刻度,值为true时显示,否则不显示。 4常用成员函数
1 1) QDial::QDial ( QWidget *parent = 0, const char *name = 0, WFlags f = 0 )
构造一个名称为name、父对象为parent的Dial。
1 2) QDial::QDial ( int minValue, int maxValue, int pageStep, int value, QWidget *parent = 0, const char *name = 0 )
构造一个名称为name、父对象为parent、最大值为maxValue、最小值为minValue、步长为pageStep和值为value的Dial。
1 3) void QDial::setValue ( int v ) [virtual slot]
设置该表盘的值为v。
1 4) int QDial::value () const
返回该表盘的值。
3712 示例17:Dial的应用
Dial是绘制一些表盘时的最好选择,界面美观大方,使用起来还很简单。下面就通过示例来了解Dail的具体用法。 首先创建标准的Qt Gui Application项目,把项目在主界面中自动生成的toolBar、menuBar和statusBar删除,界面设计结果如图3-76所示。

图3-76 示例17界面
1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-21所示。 2示例说明 改变spinBox的值,dial的值随着改变;改变dial的值,spinBox的值也会随着改变。 3示例实现 在这个示例中,不需要手动添加任何代码,只须在Signals & Slots Editor窗口中添加了两个信号和槽的映射即可,如图3-77所示。 图3-77 信号与槽的映射
4示例执行结果 示例执行结果如图3-78所示。

图3-78 示例17执行结果
表3-21 主要控件说明
3713 ScrollBar控件
1控件位置 Input Widgets→Horizontal/Vertical ScrollBar 2控件介绍
ScrollBar控件(滚动条)的样式如图3-79所示。ScrollBar和Slider相同,Qt Creator只是把Slider分成Horizontal Slider和Vertical

Slider两个控件。两种滚动条之间同样可以相互转换,只须改变orientation属性即可。 图3-79 ScrollBar控件3控件设置选项
在ScrollBar控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置滑动条上的字体; lineStep:滑动条值的最小跨度; value:滑动条的值; minValue:滑动条的最小值; maxValue:滑动条的最大值;

orientation:滑动条的布局方向,Qt提供的选择有Horizontal和Vertical。 4常用成员函数
1 1) QScrollBar::QScrollBar ( QWidget *parent, const char *name = 0 )
构造一个名称为name、父对象为parent的ScrollBar。
1 2) QScrollBar::QScrollBar ( Orientation orientation, QWidget *parent, const char *name = 0 )
构造一个名称为name、父对象为parent、布局方向为orientation的ScrollBar。
1 3) void QScrollBar::setValue ( int v ) [slot]
设置该滚动条的值为v。
1 4) int QScrollBar::value () const
返回该滚动条的值。
3714 DateEdit控件
1控件位置 Input Widgets→DateEdit 2控件介绍 DateEdit控件(日期编辑框)的样式如图3-80所示,是用来编辑和显示日期的控件。

图3-80 DateEdit控件
3控件设置选项 在DateEdit控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置文本框的字体; date:显示的日期; minValue:日期的最小值; maxValue:日期的最大值; order:设置日期显示格式,Qt提供的格式有YMD、YDM、DMY。 4常用成员函数
1 1) QDateEdit::QDateEdit ( QWidget *parent = 0, const char *name = 0 )
构造一个名称为name、父对象为parent的DateEdit。
1 2) QDateEdit::QDateEdit ( const QDate & date, QWidget *parent = 0, const char *name = 0 )
构造一个名称为name、父对象为parent、当前显示日期为date的DateEdit。下面是以当前日期构造的一个对象示例:
1 QDateEdit *Date = new QDateEdit(QDate::currentDate(), this );
2 3) QDate QDateEdit::date () const
返回DateEdit控件Date的值。
1 4) void QDateEdit::setDate ( const QDate & date ) [virtual]
设置DateEdit控件Date的值为date。
1 5) void QDateEdit::setDay ( int day ) [virtual protected]
设置DateEdit控件Date的Day为day,必须确保day为有效值。
1 6) void QDateEdit::setMonth ( int month ) [virtual protected]

设置DateEdit控件Date的Month为month,必须确保month为有效值。
1 7) void QDateEdit::setYear ( int year ) [virtual protected]
设置DateEdit控件Date的Year为year,必须确保year为有效值。
3715 TimeEdit控件
1控件位置 Input Widgets→TimeEdit 2控件介绍 TimeEdit控件(时间编辑框)的样式如图3-81所示,是用来编辑和显示时间的控件。 图3-81 TimeEdit控件
3控件设置选项 在TimeEdit控件的properties选项中,一般常对以下选项进行设置: name:该控件对应源代码中的名称; font:设置文本框的字体; time:显示的日期;
minValue:时间的最小值,默认是00:00:00;

maxValue:时间的最大值,默认是23:59:59; display:设置时间显示格式。 4常用成员函数
1 1) QTimeEdit::QTimeEdit ( QWidget *parent = 0, const char *name = 0 )
构造一个名称为name、父对象为parent的TimeEdit。
1 2) QTimeEdit::QTimeEdit ( const QTime & time, QWidget *parent = 0, const char *name = 0 )
构造一个名称为name、父对象为parent、当前显示时间为time的TimeEdit。
1 3) QTime QTimeEdit::time () const
返回TimeEdit控件Time的值。
1 4) void QTimeEdit::setTime ( const QTime & time ) [virtual]
设置TimeEdit控件Time的值为time。
1 5) void QTimeEdit::setHour ( int h ) [virtual protected]
设置TimeEdit控件Time的Hour为h,必须确保h为有效值。
1 6) void QTimeEdit::setMinute ( int m ) [virtual protected]
设置TimeEdit控件Time的Minute为m,必须确保m为有效值。
1 7) void QTimeEdit::setSecond ( int s ) [virtual protected]
设置TimeEdit控件Time的Second为s,必须确保s为有效值。

3716 DateTimeEdit控件
1控件位置 Input Widgets→DateTimeEdit 2控件介绍 DateTimeEdit控件(日期时间编辑框)的样式如图3-82所示。DateTimeEdit是一个用来编辑和显示日期和时间的控件,相当于把DateEdit和TimeEdit联合起来一起使用。这里不做过多介绍,会在接下来的示例中具体介绍DateTimeEdit控件的用法。 图3-82 DateTimeEdit控件
3控件设置选项 在DateTimeEdit控件的properties选项中,一般常对以下选项进行设置: name:该控件对应源代码中的名称;
font:设置文本框的字体;

datetime:显示的日期和时间。
3717 示例18:DateEdit、TimeEdit和DateTimeEdit的应用(1)
首先创建标准的Qt Gui Application项目,把项目在主界面中自动生成的toolBar、menuBar和statusBar删除,界面设计结果如图3-83所示。 图3-83 示例18界面
1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-22所示。 表3-22 主要控件说明

2示例说明 程序执行后,dateTimeEdit显示当前系统时间,并时刻更新; dateTimeEdit、dateEdit和timeEdit是只读的; 单击按钮“Edit Date”,可以编辑dateEdit,dateTimeEdit和dateEdit是同步的。单击按钮“OK”,结束编辑,dateEidt变成只读的; 单击按钮“Edit Time”,可以编辑timeEdit,dateTimeEdit和timeEdit是同步的。单击按钮“OK”,结束编辑,timeEidt变成只读的。 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_btnEditTime_clicked();
17 void on_btnOk_clicked();
18 void on_btnEditDate_clicked();
19 void timeoutslot();
20 };
21 #endif // MAINWINDOW_H
声明四个槽函数,槽函数timeoutslot()是自己声明的,对应定时器timer;其他三个槽函数都是通过右击控件→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
12 {
13 delete ui;
14 }
C

3717 示例18:DateEdit、TimeEdit和DateTimeEdit的应用(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 /*********初始化**********************************/
9 ui->dateTimeEdit->setDate(QDate::currentDate()); //获取当前日期
10 ui->dateTimeEdit->setTime(QTime::currentTime());//获取当前时间
11 QTimer *timer=new QTimer(this);
12 connect(timer,SIGNAL(timeout()),this,SLOT(timeoutslot()));//timeoutslot()为自定义槽
13

14 /*********启动timer定时器******************************/
15 timer->start(1000);
16 }
在主窗体mainwindowcpp文件中添加QPushButton btnEditDate的槽函数:
1 /***********定义槽函数,编辑date***********************/
2 void MainWindow::on_btnEditDate_clicked()
3 {
4 ui->dateEdit->setReadOnly(false); //设置dateEdit的只读属性为假
5 connect(ui->dateEdit,SIGNAL(dateChanged(QDate)),ui->dateTimeEdit, SLOT(setDate(QDate)));
6 }
在主窗体mainwindowcpp文件中添加QPushButton btnEditTime的槽函数:
1 /**********定义槽函数,编辑时间***************************/
2 void MainWindow::on_btnEditTime_clicked()
3 {
4 ui->timeEdit->setReadOnly(false); //设置timeEdit的只读属性为假
5 connect(ui->timeEdit,SIGNAL(timeChanged(QTime)),ui->dateTimeEdit, SLOT(setTime(QTime)));
6 }

在主窗体mainwindowcpp文件中添加QPushButton btnOk的槽函数:
1 /***********定义槽函数,保存编辑***************************/
2 void MainWindow::on_btnOk_clicked()
3 {
4 ui->dateEdit->setReadOnly(true);
5 ui->timeEdit->setReadOnly(true);
6 }
在主窗体mainwindowcpp文件中添加QTimer timer的槽函数:
1 /***********定义timer的槽函数*********************************/
2 void MainWindow::timeoutslot()
3 {
4 QDate date = ui->dateTimeEdit->date();
5
6
7 QTime time = ui->dateTimeEdit->time();
8 QTime time1(23,59,59);
9 if(time == time1)
10 {
11 datedate = dateaddDays(1);
12 }
13 timetime = timeaddSecs(1);
14 ui->dateTimeEdit->setDate(date);
15 ui->dateTimeEdit->setTime(time);
16 }
主文件maincpp没有进行任何更改,使用项目自动生成的即可。 4示例执行结果

示例执行结果如图3-84所示。 图3-84 示例18执行结果
38 显示组件(Display Widgets)
Qt Designer有十种DisplayWidgets,如图3-85所示。 图3-85 Display控件

Display Widgets的Qt类和名称介绍如表3-23所示。 表3-23 Display Widgets介绍
本节主要介绍Qt Creator的Display Widgets的使用方法。Qt Creator比Qt Designer提供更多的Display Widgets。 下面就来具体介绍各种Display Widgets的用法。
381 Label控件
1控件位置 Display Widgets→Label 2控件介绍 Label控件(标签)的样式如图3-86所示。同Qt Designer中的TextLabel控件。 图3-86 Label控件

3控件设置选项 在Label控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置text的字体; text:用来设置或返回标签控件中显示的文本信息。 4常用成员函数
1 1) QLabel::QLabel ( QWidget *parent, const char *name = 0, WFlags f = 0 )
构造一个名称为name、父对象为parent和标记符为f的TextLabel。
1 2) QLabel::QLabel ( const QString & text, QWidget *parent, const char *name = 0, WFlags f = 0 )
构造一个名称为name、父对象为parent、标记符为f和内容为text的TextLabel。
1 3) void QLabel::clear () [slot]
清除标签内容。
1 4) void QLabel::setText ( const QString & ) [virtual slot]
设置标签的文本。
1 5) QString QLabel::text () const
返回标签的文本。

382 TextBrowser控件
1控件位置 Display Widgets→TextBrowser 2控件介绍 TextBrowser控件(文本浏览器)的样式如图3-87所示,QTextBrowser继承自QTextEdit。TextBrowser是只读的,不允许对内容进行更改,但是相对于QTextEdit来讲,它还具有链接文本的作用。 图3-87 TextBrowser控件
3控件设置选项 在TextBrowser控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置显示框字体;

frameShape:边框样式,Qt Designer提供了多项选择; frameShadow:边框阴影,Qt Designer提供的选择有plain、raised、sunken; lineWidth:边框线宽; text:显示的文本; source:显示的文件名称,如果没有文件显示或来源,则显示空字符串。 4常用成员函数
1 1) QTextBrowser::QTextBrowser ( QWidget *parent = 0, const char *name = 0 )
构造一个名称为name、父对象为parent的TextBrowser。
1 2) void QTextBrowser::backward () [virtual slot]
更改内置导航链接的文件清单为显示前一个文档文件,如果没有以前的文档,就什么都不做,可以实现向前翻页的功能。
1 3) void QTextBrowser::forward () [virtual slot]
更改内置导航链接的文件清单为显示下一个文档文件,如果没有以前的文档,就什么都不做,可以实现向后翻页的功能。
1 4) void QTextBrowser::home () [virtual slot]
更改显示的文件浏览器中的链接,显示第一个文件。
1 5) void QTextBrowser::linkClicked ( const QString & link ) [signal]
当单击链接时,发射该信号。

1 6) void QTextBrowser::reload () [virtual slot]
重新载入当前的设置源。
1 7) void QTextBrowser::setSource ( const QString & name ) [virtual slot]
设置当前显示的文件名称为name。
1 8) QString QTextBrowser::source () const
返回当前显示的文件的文件名称。
383 示例19:TextBrower的应用
QTextBrower继承于QTextEdit类,增加了导航功能,可以用TextBrower打开超链接。下面通过一个示例来学习用TextBrower打开超链接的方法。 首先创建标准的Qt Gui Application项目,把项目在主界面中自动生成的toolBar、menuBar和statusBar删除,界面设计结果如图3-88所示。 图3-88 示例19界面

1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-24所示。 表3-24 主要控件说明
2示例说明 程序执行后,会在Text Brower中添加三个超链接; 单击超链接,使用默认浏览器打开该超链接的网站。 3示例实现 在主窗体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 MainWindow::MainWindow(QWidget *parent) :
2 QMainWindow(parent),
3 ui(new Ui::MainWindow)
4 {
5 ui->setupUi(this);
6
7 /*********打开tBwsShow的外部链接设置**************************/
8 ui->tBwsShow->setOpenLinks(true);
9 ui->tBwsShow->setOpenExternalLinks(true);
10
11 /*********添加链接***********************************************/
12 ui->tBwsShow->append(QString::fromLocal8Bit("<a href="http://wwwbaiducom">baidu"));
13 ui->tBwsShow->append(QString::fromLocal8Bit("<a href = "http://wwwsinacomcn/">sina"));
14 ui->tBwsShow->append(QString::fromLocal8Bit("<a href = "http://wwwqqcom/">qq"));
15 }
主文件maincpp没有进行任何更改,使用项目自动生成的即可。

4示例执行结果 示例执行结果如图3-89所示。 图3-89 示例19执行结果
384 GraphicsView控件
1控件位置 Display Widgets→GraphicsView 2控件介绍
GraphicsView(绘图视图)是用于显示QGraphicsScene内容的控件。学习该控件就不得不了解GraphicsView框架,GraphicsView框架为2D绘图提供一个简单、容易使用、功能强大的解决方案。Graphics View框架由三个主要的类组成:QGraphicsItem、QGraphicsScene和QGraphicsView。其中QGraphicsItem定义图元;QGraphicsScene定义场景,包含所有需要绘制的图元,根据用户的操作改变图元的状态;QGraphicsView定义观察

场景的视窗,可以充当绘图的区域,成为独立的窗体被弹出,或者嵌入其他UI组件中形成复合UI组件。 3控件设置选项 在GraphicsView控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置显示框字体; frameShape:边框样式; frameShadow:边框阴影,Qt Creator提供的选择有plain、raised、sunken; lineWidth:边框线宽。 4常用成员函数
1 1) QGraphicsView::QGraphicsView ( QWidget *parent = 0 )
构造一个父对象为parent的GraphicsView。
1 2) QGraphicsView::QGraphicsView ( QGraphicsScene *scene, QWidget *parent = 0 )
构造一个父对象为parent的GraphicsView,填充场景scene到该GraphicsView。
1 3) void QGraphicsView::centerOn ( const QPointF & pos )
调整视窗的内容,确保点pos在视窗中居中。

1 4) void QGraphicsView::centerOn ( qreal x, qreal y )
这是一个重载函数,函数功能同函数3),相当于调用center(QPointF(x,y))。
1 5) void QGraphicsView::centerOn ( const QGraphicsItem *item )
这是一个重载函数,函数功能同函数3),调整视区的内容,使项目item为中心。
1 6) void QGraphicsView::ensureVisible ( const QRectF & rect, int xmargin = 50, int ymargin = 50 )
调整视窗的内容,使视窗rect中的内容是可见的。
1 7) void QGraphicsView::ensureVisible ( qreal x, qreal y, qreal w, qreal h, int xmargin = 50, int ymargin = 50 )
这是一个重载函数,函数功能同函数6),相当于调用ensureVisible(QRectF(x,y,w,h),xmargin,ymargin)。
1 8) void QGraphicsView::ensureVisible ( const QGraphicsItem *item, int xmargin = 50, int ymargin = 50 )
这是一个重载函数,函数功能同函数6),调整视窗的内容,使item的内容可见。
1 9) QGraphicsItem *QGraphicsView::itemAt ( const QPoint & pos ) const
返回pos处的item。
1 10) QGraphicsItem *QGraphicsView::itemAt ( int x, int y ) const
这是一个重载函数,函数功能同函数9),返回坐标(x,y)处的item。

1 11) QList<QGraphicsItem *> QGraphicsView::items () const
返回相关场景中所用的图元。
1 12) QList<QGraphicsItem *> QGraphicsView::items ( const QPoint & pos ) const
返回视图中位置pos处的项目列表。
1 13) QGraphicsScene *QGraphicsView::scene () const
返回当前可视化的场景;如果当前没有可视化的场景,则返回0。
1 14) void QGraphicsView::setScene ( QGraphicsScene *scene )
设置场景scene为当前可视化场景。
1 15) void QGraphicsView::updateScene ( const QList & rects ) [slot]
面更新场景。 《linux环境下Qt4图形界面与mysql编程》本书以“图形界面编程控件与数据库编程基础→简单易学的实例→实际工程项目开发与场景分析”为写作主线,以当前最新的Qt47为依据,采用“深入分析控件+实例解析”的方式,并配合经典的实际工程项目,对linux操作系统下的Qt47与mysql编程技术进行了全面细致的讲解。本节为大家介绍示例20:GraphicsView的应用。 AD:

385 示例20:GraphicsView的应用(1)
本示例通过用GraphicsView显示图片文件,简单地介绍了Graphics View、Graphics Scene和QGraphicsItem之间的关系。 首先创建标准的Qt Gui Application项目,把项目在主界面中自动生成的toolBar、menuBar和statusBar删除,界面设计结果如图3-90所示。 图3-90 示例20界
1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-25所示。 表3-25 主要控件说明

2示例说明 界面布局设置好之后,添加资源文件,把图片文件1jpg添加到资源文件中。添加资源文件的方法在示例3中已经详细介绍过了,这里就不再重复介绍。 程序执行后,自动加载图片1jpg,不要把程序最大化,使边框出现滚动条,可以通过鼠标在一定空间内拖动图片1jpg; 单击菜单栏选择“Open”选项,可以打开其他图片; 单击菜单栏选择“Exit”选项,退出程序。 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 QString pictureName;//当前显示的图片
16 QGraphicsScene *scene;//声明scene
17 QGraphicsPixmapItem *item;//声明item
18 private:
19 Ui::MainWindow *ui;
20 private slots://声明槽函数
21 void slotOpen();
22 void slotExit();
23 };
24 #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 }
385 示例20:GraphicsView的应用(2) 在主窗体mainwindowcpp文件中添加的头文件:
1 #include
在主窗体mainwindowcpp文件中构造函数:

1 MainWindow::MainWindow(QWidget *parent) :
2 QMainWindow(parent),
3 ui(new Ui::MainWindow)
4 {
5 ui->setupUi(this);
6
7 /****************界面初始化********************************/
8 this->pictureName = ":/1jpg";
9 scene = new QGraphicsScene;
10 scene->setSceneRect(-300,-300,600,600);
11 scene->setItemIndexMethod(QGraphicsScene::NoIndex);
12 QPixmap pixmap(this->pictureName);
13 pixmappixmap = pixmapscaledToWidth(200);
14 item = scene->addPixmap(pixmap);
15
16 /***************设置view的场景*****************************/
17 ui->view->setScene(scene);
18 ui->view->setRenderHint(QPainter::Antialiasing);
19 ui->view->setCacheMode(QGraphicsView::CacheBackground);
20 ui->view->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);

21 ui->view->setDragMode(QGraphicsView::ScrollHandDrag);
22 ui->view->resize(400,300);
23
24 /***************信号和槽函数的映射**************************/
25 connect(ui->actionOpen,SIGNAL(triggered()),this,SLOT(slotOpen()));
26 connect(ui->actionExit,SIGNAL(triggered()),this,SLOT(slotExit()));
27 }
28
29 在主窗体mainwindowcpp文件中添加QAction actionOpen的槽函数:
30
31 /*****************定义槽函数,打开图片**************************/
32 void MainWindow::slotOpen()
33 {
34 this->pictureName = QFileDialog::getOpenFileName(this);//打开文件对话框
35 if(!this->pictureNameisEmpty())
36 {
37 QPixmap pixmap(this->pictureName);
38 pixmappixmap = pixmapscaledToWidth(200);
39 item = scene->addPixmap(pixmap);

40 ui->view->setScene(scene);//设置view的场景
41 }
42 }
在主窗体mainwindowcpp文件中添加QAction actionExit的槽函数:
1 /******************定义槽函数,退出程序**************************/
2 void MainWindow::slotExit()
3 {
4 this->close();
5 }
4示例执行结果 示例执行结果如图3-91所示。 图3-91 示例20执行结果
386 Calendar控件
1控件位置

Display Widgets→Calendar 2控件介绍 Calendar控件(日历)的样式如图3-92所示。顾名思义,这是一个和日历有关的控件,使用起来很简单,也很方便。 图3-92 Calendar控件3控件设置选项
在Calendar控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置text的字体; selectedDate:当前日期; minimumDate:该日历控件能够显示的最小日期; maxmumDate:该日历控件能够显示的最大日期; firstDayOfWeek:每星期的第一天;

gridVisible:是否显示网格; dateEditEnable:是否允许编辑日历。 4常用成员函数
1 1) QCalendarWidget::QCalendarWidget ( QWidget *parent = 0 )
构造一个父对象为parent的Calendar。
1 2) int QCalendarWidget::monthShown () const
返回当前显示的月份。
1 3) void QCalendarWidget::setCurrentPage ( int year, int month ) [slot]
显示给定的年份和月份。
1 4) void QCalendarWidget::setDateRange ( const QDate & min, const QDate & max ) [slot]
设置该Calendar的显示范围,最小日期为min,最大为max。
1 5) void QCalendarWidget::showSelectedDate () [slot]
显示当前选中的日期。
1 6) void QCalendarWidget::showToday () [slot]
显示系统当前日期。
1 7) int QCalendarWidget::yearShown () const
返回当前显示的年份。

387 示例21:Calendar的应用
首先创建标准的Qt Gui Application项目,把项目在主界面中自动生成的menuBar、toolBar和statusBar删除,界面设计结果如图3-93所示。 图3-93 示例21界面
1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-26所示。 图3-94 信号与槽的映射
2示例说明 在Signals & Slots Editor中添加槽函数如图3-94所示;
程序执行后,只显示dateEdit和pushButton两个控件;

单击按钮“Edit Date”,显示calendarWidget控件,可以通过calendarWidget控件来编辑dateEdit的日期。在calendarWidget控件上选定日期并单击之后,dateEdit的日期随之改变。同时calendarWidget控件隐藏。 表3-26 主要控件说明
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_calendarWidget_clicked(QDate date);
17 };
18 #endif // MAINWINDOW_H
声明一个槽函数on_calendarWidget_clicked(QDate date),这个槽函数是通过右击calendarWidget→Go to slot自动生成的,对应calendarWidget的clicked(QDate date)信号。 在主窗体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 MainWindow::MainWindow(QWidget *parent) :
2 QMainWindow(parent),
3 ui(new Ui::MainWindow)
4 {
5 ui->setupUi(this);

6
7 /****************隐藏日历控件*********************/
8 ui->calendarWidget->hide();
9 }
在主窗体mainwindowcpp文件中添加QCalendarWidget calendarWidget的槽函数:
1 /********************定义槽函数,编辑日期******************/
2 void MainWindow::on_calendarWidget_clicked(QDate date)
3 {
4 ui->dateEdit->setDate(ui->calendarWidget->selectedDate());
5 ui->calendarWidget->hide();
6 }
主文件maincpp没有进行任何更改,使用项目自动生成的即可。 4示例执行结果 示例执行结果如图3-95所示。

图3-95 示例21执行结果
388 LCDNumber控件
1控件位置 Display Widgets→LCDNumber 2控件介绍 图3-96 LCDNumber控件
LCDNumber控件(LCD数字显示框)的样式如图3-96所示,可以显示十六进制、十进制、八进制或二进制数。 3控件设置选项
在LCDNumber控件的properties选项中,一般常对以下选项进行设置。

name:该控件对应源代码中的名称; font:设置显示框字体; frameShape:边框样式,Qt Designer提供了多项选择。 frameShadow:边框阴影,Qt Designer提供的选择有plain、raised、sunken。 lineWidth:边框线宽; mode:设置显示格式,Qt提供的格式有十六进制、十进制、八进制、二进制。 value:该LCDNumber的值。 intValue:该LCDNumber的整数值; numDigits:显示框最大可以显示的数字位数。 4常用成员函数
1 1) QLCDNumber::QLCDNumber ( QWidget *parent = 0, const char *name = 0 )
构造一个名称为name、父对象为parent的LCD Number。
1 2) QLCDNumber::QLCDNumber ( uint numDigits, QWidget *parent = 0, const char *name = 0 )

构造一个名称为name、父对象为parent和显示框最大可以显示的数字位数为numDigits的LCDNumber。如下构造了一个最多能显示4位数的LCD显示器:
1 QLCDNumber *lcd= new QLCDNumber (4,this);
2 3) void QLCDNumber::display ( int num ) [slot]
设置显示的值为num。
1 4) void QLCDNumber::display ( const QString & s ) [slot]
这是一个重载函数,函数功能同函数4),显示s。
1 5) void QLCDNumber::display ( double num ) [slot]
这是一个重载函数,函数功能同函数5),显示num。
1 6) int QLCDNumber::intValue () const
返回显示值的整数值,对应intValue属性。
1 7) int QLCDNumber::numDigits () const
返回显示框最大可以显示的数字位数,对应numDigits属性。
1 8) double QLCDNumber::value () const
返回该LCDNumber显示的值。
389 示例22:LCDNumber的应用
首先创建标准的Qt Gui Application项目,把项目在主界面中自动生成的menuBar、toolBar和statusBar删除,界面设计结果如图3-97所示。

图3-97 示例22界面
1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-27所示。 表3-27 主要控件说明
2示例说明 在Signals & Slots Editor中添加槽函数如图3-98所示;

图3-98 信号和槽的映射
程序执行后,改变horizontalSlider的值,lcdNumber和spinBox的值随着改变; 改变spinBox的值,lcdNumber和horizontalSlider的值随着改变。 3示例实现 本示例不需要添加任何代码,只需新建一个Qt Gui Application项目,把项目在主界面中自动生成的menuBar、toolBar和statusBar删除,按照以上步骤添加完成即可。 4示例执行结果 示例执行结果如图3-99所示。 图3-99 示例22执行结果

3810 ProgressBar控件
1控件位置 Display Widgets→ProgressBar 2控件介绍 ProgressBar控件(进度条)的样式如图3-100所示,显示为一个水平进度条。一个进度条是用来给用户显示操作进度的,证明他们的应用程序仍在运行,进度条控件非常常见,例如我们下载资源时经常会显示进度条来显示下载进度。 图3-100 ProgressBar控件面
3控件设置选项 在ProgressBar控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置显示框字体; frameShape:边框样式,Qt Designer提供了多项选择;
frameShadow:边框阴影,Qt Designer提供的选择有plain、raised、sunken。

lineWidth:边框线宽; progress:进度条当前的进度值。 4常用成员函数
1 1) QProgressBar::QProgressBar ( QWidget *parent = 0, const char *name = 0, WFlags f = 0 )
构造一个名称为name、父对象为parent的ProgressBar。
1 2) QProgressBar::QProgressBar ( int totalSteps, QWidget *parent = 0, const char *name = 0, WFlags f = 0 )
构造一个名称为name、父对象为parent和总的进度值为totalSteps的ProgressBar。如下构造了一个进度值为100的进度条:
1 QProgressBar *pgb= new QProgressBar (100,this);
2 3) int QProgressBar::progress () const
返回该进度条的当前进度值。
1 4) void QProgressBar::setProgress ( int progress ) [virtual slot]
设置该进度条的当前进度值为progress。
1 5) void QProgressBar::reset () [slot]
把进度条恢复到初始状态。

3811 示例23:ProgressBar的应用(1)
首先创建标准的Qt Gui Application项目,把项目在主界面中自动生成的menuBar、toolBar和statusBar删除,界面设计结果如图3-101所示。 图3-101 示例23界面
1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-28所示。 2示例说明 单击按钮“ProgressBar”,progressBar的值在10秒内从0变为10; 单击按钮“ProgressDialog”,弹出一个有进度条的窗口,进度条在10秒内从0变为10。如图3-102所示,单击按钮“Cancel”,强制结束窗口。

图3-102 ProgressDialog
表3-28 主要控件说明
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 int num;//文件数目
14 private:
15 Ui::MainWindow *ui;
16 private slots://声明槽函数
17 void on_btnProgressDialog_clicked();
18 void on_btnProgressBar_clicked();
19 };
20 #endif // MAINWINDOW_H
声明一个变量num和两个槽函数。num是控件progressBar当前的值,两个槽函数分别对应两个按钮的clicked()信号。这两个槽函数都是通过右击控件→Go to slot生成的,所以不用在实现函数中写信号与槽的映射代码。 在主窗体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 }

3811 示例23:ProgressBar的应用(2) 在主窗体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 num=10;//初始化
8 }
在主窗体mainwindowcpp文件中添加QPushButton btnProgressBar的槽函数:
1 /
槽函数:进度条*/
2 void MainWindow::on_btnProgressBar_clicked()
3 {
4 ui->progressBar->setRange(0,num);//设置progressBar的取值范围
5 for(int i=1;i<=num;i++)
6 {
7 ui->progressBar->setValue(i);//给进度条赋值
8 sleep(1);

9 }
10 }
在主窗体mainwindowcpp文件中添加QPushButton btnProgressBarDialog的槽函数:
1 /槽函数:进度条对话框/
2 void MainWindow::on_btnProgressDialog_clicked()
3 {
4 QProgressDialog *progressDialog = new QProgressDialog(this);
5 QFont font("ZYSong18030",12); //定义字体
6 progressDialog->setFont(font);//设置字体
7 progressDialog->setWindowModality(QT::WindowModal);
8 progressDialog->setMinimumDuration(5);
9 progressDialog->setWindowTitle("Please Waiting");
10
11
12 progressDialog->setLabelText(tr("Copying"));
13 progressDialog->setCancelButtonText(tr("Cancel"));

14 progressDialog->setRange(0,num);//设置进度对话框的进度条的取值范围
15 for(int i=1;i<=num;i++)
16 {
17 progressDialog->setValue(i);//对进度对话框的进度条赋值
18 qApp->processEvents();
19 sleep(1);
20 if(progressDialog->wasCanceled())
21 return;
22 }
23 }
主文件maincpp没有进行任何更改,使用项目自动生成的即可。 4示例执行结果 示例执行结果如图3-103和图3-104所示。 图3-103 单击按钮“ProgressBar”的结果

图3-104 单击按钮“ProgressDialog”的结果
3812 Line控件
1控件位置 Display Widgets→Horizontal/Vertical Line 2控件介绍 Line控件(线条)的样式如图3-105所示,它是用来装饰界面的控件,在界面中适当添加Line控件可以使界面更加美观、清晰。 图3-105 Line控件
3控件设置选项 在Line控件的properties选项中,一般常对以下选项进行设置。
name:该控件对应源代码中的名称;

frameShadow:线条阴影,Qt Designer提供的选择有plain、raised、sunken; lineWidth:线条线宽; orientation:线条布局方向。 Line控件就是一个装饰控件,使用简便,在此不再进行详细介绍。

Linux环境下Qt4图形界面与MySQL编程3

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

Linux环境下Qt4图形界面与MySQL编程2

第一章 绪论
linux环境下qt4图形界面mysql编程》本书以“图形界面编程控件与数据库编程基础→简单易学的实例→实际工程项目开发与场景分析”为写作主线,以当前最新的qt47为依据,采用“深入分析控件+实例解析”的方式,并配合经典的实际工程项目,对linux操作系统下的Qt47与mysql编程技术进行了全面细致的讲解。本节为大家介绍图形界面设计的必要性。 本章目的: 了解图形界面设计的必要性 认识几种常用的图形化界面编程工具 认识几种常用的Linux数据库技术 图形界面与数据库综合编程
11 图形界面设计的必要性
在信息技术高速发展的今天,无论是PC应用软件还是嵌入式设备,人们对软件的友好支持性要求逐渐提高,因此出现了图形用户界面(Graphical User Interface,GUI)技术。它是一种综合了计算机技术、美学、心理学、行为学以及各商业领域需求分析的人机系统工程,强调“人—机—环境”三者作为一个系统进行总体设计。图形用户界面技术的出现,改变了传统的采用终端命令行显示与控制的方式,从可视化、交互性和友好性等方面带来了极大的优越性。 控件功能的可视化。在图形用户界面编程工具中,将不同的用户需求做成控件的形式,在编程时,可以从控件库中选择相应的控件进行设置,从而达到自己的功能需求。每个控件的功能都能直观地显示出来,具有良好的可视化效果。 图形用户界面建立了与用户的互动交流。采用终端作为控制,可操作性差。当程序执行时,与用户的交互性差。图形用户界面技术将用户与程序执行过程控制紧密结合起来,从而使用户的需求及时地在图形用户界面中得以实施并直观地显示出来。
用户界面友好性。图形用户界面的设计要考虑人的行为学和心理学特点,符合用户的习惯,并在美学方面达到和谐统一。使用户操作方便,给人以舒适的感觉。

12 Linux常用的图形化界面编程工具
本节介绍在Linux操作系统中编程时,常用的两种编程工具:Qt和GTK+。
121 Qt
Qt是一个跨平台的图形界面开发平台,最早由挪威的TrollTech公司于1992年进行开发。2008年6月,NOKIA公司获得了Qt的开发权,继续对Qt平台进行开发。Qt图形界面开发平台可进行嵌入式系统应用程序和桌面系统应用程序的开发,支持Windows、Linux/X11、Mac OS X等操作系统。Qt官方网页:http://qtnokiacom/,如图1-1所示。
Qt采用C++语言,包含了丰富的C++类,包括窗口界面设计的接口、IO控制接口、绘图接口、多媒体接口、数据库操作接口、网络通信接口、XML接口、模块测试接口等丰富的开发接口。软件开发人员通过使用这些接口,可以方便、高效地完成应用设计与程序开发。由于采用C++语言,Qt具有较高的执行效率。此不同平台间的Qt开发接口是相同的,因此,可以有效地降低Qt应用程序跨平台开发的移植成本。

Qt不仅仅是一个图形界面开发类库,而是一套拥有相对完整的开发环境的开发工具。Qt提供了丰富的开发工具,用来提高应用设计开发人员的编程效率。这些工具主要包括:界面设计工具Qt Designer、工程管理工具qmake等。在最新的Qt45及以上的版本中还加入了Qt程序开发的IDE环境Qt Creator,以及与其他开发工具的扩展插件,可以支持Visual Studio和Eclipse等常用开发工具。本书的实例都是基于使用Qt47的Creator集成开发环境而编写的。 NOKIA公司收购TrollTech公司后,推出了两个重要版本: Qt商业版:主要面向商业软件开发。这些软件用于商业用途时,需要支付一定的费用,并在有效的时间段内得到一定的技术支持。 Qt开源版:源码开放,遵循GNU通用公共许可证(General Public License,GPL),可以进行自由开发。
122 GTK+
GTK+来源于GNU Image Manipulation Program(GIMP)(这是一个GNU开放源码项目),由Peter Mattis和Spencer Kimball共同开发。
确切地说,GTK+是一个图形用户界面开发工具库。利用这个工具库可以创建基于图形用户界面的应用程序,也就是说,GTK+集成程序员编程时需要用的控件库,利用这些库可以创建用户所需要的图形界面。GTK+是从GTK中分离出来的,“+”代表了GTK+具有很好的扩展性和支持面向对象技术。关于GTK+的详细内容,感兴趣的读者可以参阅GTK+的官方网站:http://wwwgtkorg/,如图1-2所示,本书不作过多的讨论。

13 两种常用的Linux数据库
131 MySQL
MySQL由瑞典的MySQL AB公司开发,是一个中小型数据库管理系统。在2008年被Sun公司收购,成为Sun旗下的产品。2009年,Sun又被Oracle公司并购。目前,MySQL是Oracle公司的产品之一,其LOGO如图1-3所示。MySQL是一种关系数据库管理系统,它将数据保存在一个个数据表中,大大地提高了数据操作效率。MySQL支持SQL语言访问数据库系统,操作简便。MySQL源代码遵循GNU通用公共许可证。源代码是开放的,利于设计者根据不同的应用设计专用的解决方案。MySQL广泛地应用于Internet上的中小型网站和嵌入式数据库的开发。
132 SQLite
SQLite代码量特别小,大约3万行,是一个轻量级的小型数据库系统,占用资源少,处理速度快,最初是为嵌入式产品而设计的。其LOGO如图1-4所示。

图1-3 MySQL的LOGO 图1-4 SQLite的LOGO
SQLite能够在多个平台上运行,且使用方便,无须安装和管理配置。能够支持多种编程语言直接创建数据库,灵活自由。2000年5月,SQLite第一个版本诞生,从此其每一个版本几乎都应用在嵌入式产品开发中。经过近些年嵌入式开发者和自由软件爱好者的完善与改进,SQLite已经形成了功能相对齐全的嵌入式数据库系统,并在嵌入式产品中得以广泛应用。
14 图形界面与数据库综合编程技术
在当前的软件产品和嵌入式开发中,单一的图形界面开发和单一的数据库开发的案例已经很少了,一般都是图形界面配合数据库编程,以获得功能完善的产品设计方案。典型的软件产品开发分为两个部分:数据库管理员功能模块和用户应用程序模块。数据库管理员功能模块如图1-5所示,数据库中的数据由数据库管理工具通过数据库服务器进程来维护,数据库管理员可以利用数据库管理工具对数据库进行维护操作。

图1-5 数据库管理员功能模块
用户应用程序功能模块如图1-6所示,应用程序是基于图形界面开发工具类库开发的,数据库驱动程序将数据库服务器进程与开发工具类库联系在一起,使它们建立一定的通信机制,数据库服务器进程负责对数据库中的数据进行直接操作。因此,用户可以通过应用程序对数据库进行访问操作。
图1-
第2章 Qt4图形界面编程基础
本章目的: Qt Creator的简单介绍
Qt Creator的安装

Qt Creator的信号槽机制 Qt Creator的简单使用
21 Qt Creator
Qt Creator是一个基于Qt的进行用户界面设计的可视化集成开发环境,可以跨平台运行,支持Linux、Mac OS、Windows等操作系统。Qt Creator集成了Qt Designer的所有特性,方便用户进行界面设计。另外还集成了Qt Assistant、Qt Linguist、图形化的GDB调试前端、qmake构建工具等。Qt Creator还包括项目生成向导、高级的C++代码编辑器、浏览文件及类的工具。Qt Creator使开发人员能够更加便捷地完成开发任务,Qt Creator界面如图2-1所示。 (点击查看大图)图2-1 Qt Creator界面
22 安装Qt环境及Qt Creator(1)
本书的所有实例都是在Ubuntu环境下进行的,这里只介绍在Ubuntu下搭建环境的具体步骤,其他Liunx系统环境搭建与此相类似。

可以从Qt官方网站上直接下载安装Qt Creator,网址为:http://qtnokiacom/downloads,打开后的网页如图2-2所示,我们选择下载Qt SDK安装包,其中包含用于Windows、Linux/X11 32-bit、Linux/X11 64-bit和Mac OS的安装包,笔者系统为Linux/X11 64-bit,所以选择Linux/X11 64-bit的SDK安装包。Linux/X11 64-bit的SDK安装包分为在线安装包和本地安装包,根据网速选择,网速较快可选择在线安装。 (点击查看大图)图2-2 Qt Creator下载选择
下载完毕后,直接在终端运行安装包,出现图2-3所示的界面,单击“Next”按钮,出现图2-4所示界面。在图2-4所示窗口中设置安装路径,此处使用默认的安装路径,安装类型有两种,可以是默认的安装类型,也可以是用户自定义的安装类型,默认的安装类型安装的东西比较多,占用的空间大,建议初学者选择“Default”安装类型,此处笔者选择“Customer”安装类型,单击“Next”按钮,出现图2-5所示的界面。图2-5中是一些安装选项,此处将与“Symbian”相关的选项都去掉,单击“Next”按钮,出现图2-6所示的界面。图2-6是安装协议,选择接受安装协议选项,单击“Next”按钮,出现图2-7所示的界面,进行Qt Creator的安装。安装完成之后单击“Next”按钮,出现图2-8所示的界面,单击“Finish”按钮成功安装Qt Creator。此时在系统的“应用程序”选项中选择“编程”,可以看到Qt Creator选项,说明已成功安装Qt Creator(见图2-9)。下面将通过一个简单的实例说明Qt Creator的使用方法。

图2-3 Qt Creator安装第一步 图2-4 Qt Creator安装路径

图2-5 安装组件选择

安装Qt环境及Qt Creator(2) 图2-6 接受安装协议 图2-7 安装完成

图2-8 安装成功 图2-9 安装成功之后应用程序增加的选项

23 信号和槽机制
《Linux环境下Qt4图形界面与MySQL编程》本书以“图形界面编程控件与数据库编程基础→简单易学的实例→实际工程项目开发与场景分析”为写作主线,以当前最新的Qt47为依据,采用“深入分析控件+实例解析”的方式,并配合经典的实际工程项目,对Linux操作系统下的Qt47与MySQL编程技术进行了全面细致的讲解。本节为大家介绍信号和槽机制。
1概述 Qt采用了一种全新的对象和方法的关联与通信机制,称为信号和槽机制。信号和槽机制是独立于标准C++编译器的,在编译之前需要经过Qt的专门预处理工具MOC(Meta Object Compiler,元组件编译器)对代码进行预处理后才能进一步进行C++代码的编译。MOC会将Qt应用程序中特有的代码自动转化为相应的标准C++语法代码。 信号和槽的概念是Qt编程中最具代表性的特点之一。GUI编程中通常使用回调函数进行事件处理,而回调函数通常是一个函数指针,不同的事件、不同的对象都有着各自的回调函数。当事件到来时,系统会通过调用对应的回调函数来完成相应的处理。 Qt引入了信号和槽机制来取代回调函数。凡是继承自QObject的类都可以具有信号和槽成员,并可以使用它们。信号和槽的使用可以有效地减少函数指针的使用,使程序代码清晰简洁,对于事件响应管理更加容易。此外,信号和槽没有严格规定函数的类型,因此在调用过程中是安全的。 信号和槽的使用可以实现信息封装,增加程序的灵活性。信号和槽都采用函数作为存在形式。在Qt程序初始化或运行的过程中,可以静态或动态地将信号和槽相关联。当某一事件到来时,会发射信号,但是发射后,它并不需要关心信号的处理者是谁。当触发槽函数时,说明与其关联的信号被接收,但它不需要了解谁发出了信号,它只需要负责进行相应的处理即可。 2信号 信号是Qt中对事件的一种抽象,当一个事件到来时,会发射信号。所谓的发射信号,就是通过Qt中特有的通信机制,调用和信号相关的各个槽函数。因此当发射信号时,将执行与其相关联的槽函数。信号采用函数的形式,因此,当所有与信号关联的函数全部返回后,信号函数才会返回。信号函数在形式上与标准C++中的虚函数类似,信号函数只有头文件中函数的声明,而没有函数的定义(即函数体)。信号的声明形式如下:

1 signal:
2 void MySignal();
3 void MySignal(int x);
4 void MySignalParam(int x, int y);
对于信号的声明与普通的C++函数无异,它不限制参数的个数与类型,同时它还支持重载。不过信号的返回值只要求必须为void型,因为事件是一种中断,对于突发性的中断,不可能期望其有返回值。 3槽 槽是Qt中负责信号处理的实体,当有信号发射时,与信号关联的所有槽会依次执行。槽也采用函数的形式,不过槽需要有实际的函数定义,相当于在标准C++中对虚函数的多态实现。槽函数的声明形式如下:
1 public slot:
2 void MySlot();
3 void MySlot(int x);
4 void MySlotParam(int x, int y);
与信号相同,槽函数的定义同普通的C++函数无异,支持C++函数的一些特性。同时,槽函数可以采用标准C++函数的使用方式,在代码中直接调用。槽函数具有访问权限的标识,它们同C++类的成员函数的标识相同,分别为:public、protected、private。public说明该槽函数可以被其他类的信号所关联,protected说明只能被类本身和其子类的信号所关联,private说明该槽函数只能被类本身的信号所关联。 在Qt的基类QObject中有一个成员函数用来完成信号和槽的映射,函数的原型如下:
1 #include
2 static bool QObject::connect (const QObject *sender, const char *signal, const QObject *receiver, const char *member);
其中,sender和receiver分别指定了被关联的信号和槽的发送者和接收者。signal是信号,Qt要求必须使用宏SINGAL将信号函数指针转化为指定的类型。member是槽,Qt要求必须使用宏SLOT转化函数指针。宏SINGAL和SLOT的参数形式如下:
1 SIGNAL(funname(param_type_1, param_type_2, …))
2 SLOT(funname(param_type_1, param_type_2, …))
其中,funname是函数名,param_type_x是函数中对应参数的类型。

24 一个抛砖引玉的实例(1)
在介绍具体控件使用方式之前,先来了解一下用Qt Creator进行开发的总体步骤。下面将通过Hello实例来简单介绍用Qt Creator开发程序的基本过程。 1新建项目 运行Qt Creator,选择菜单栏中的“文件”选项,然后选择“新建文件或项目”,出现“项目类型”选择窗口,如图2-10所示,单击左上角的“项目”选项框中的“Qt控件项目”,然后选择右上角选项框中的“Qt Gui应用”,参考图2-10,单击“选择”按钮,出现新的窗口,如图2-11所示。图2-11所示的界面用于设置项目名和创建项目位置,设置结果如图2-11所示,单击“下一步”按钮,出现图2-12所示的界面。图2-12用于设置工程编译目标信息,取消有关Desktop编译的选项,保留Qt的调试和发布两部分,设置结果参考图2-12,单击“下一步”按钮。出现图2-13所示的界面信息,此界面是创建主界面类的名称及类型,保持不变,单击“下一步”按钮。最后出现图2-14所示的信息,单击“完成”按钮完成新项目的创建,此时该项目将包含以下文件:Hellopro、mainwindowh、mainwindowcpp、maincpp、mainwindowui。 图2-10 创建工程界面

图2-11 项目名及项目位置 (点击查看大图)图2-12 项目编译目标设置

图2-13 项目创建信息 图2-14 项目编译目标文件位置

24 一个抛砖引玉的实例(2) 2设计窗体 项目创建完毕后,开始设计窗体。Qt Creator创建项目自带的Main Window主窗体默认是包含一个QMenuBar、一个图2-15 Hello程序界面设计结果QToolBar和一个QStatusBar,Hello实例用不到这些控件,可以在窗体中删除这些自带控件。
在属性设置窗口中修改主界面的windowTitle属性的值为“Hello”。在主界面中添加一个QLabel控件和一个QPushButton控件,QLabel控件的属性不须更改,更改QPushButton控件的text属性为“OK”,设置结果如图2-15所示。 3建立信号和槽的映射 界面设计完毕之后,需要实现其功能:当单击“OK”按钮时,“TextLabel”变为“Hello World”。此时需要将对应的信号和槽函数连接,Qt Creator提供了三种建立信号和槽的方法。 第一种方法,自己定义槽函数和映射。 1)在文件mainwindowh的类MainWindow的定义中声明槽函数,代码如下:
1 public slots:
2 void on_pushButton_clicked();
2)定义槽函数体在mainwindowcpp文件中,代码如下:
1 void MainWindow:: on_pushButton_clicked ()
2 {
3 ui->label->setText("Hello World");
4 }

3)建立映射,在类MainWindow的构造函数中添加如下语句,以便将信号和槽函数进行连接:
1 connect(ui->pushbutton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));
第二种方法,右击“OK”按钮,选择“转到槽”选项,出现图2-16所示窗口,选择信号“clicked()”,单击“确定”按钮。系统自动生成槽函数的声明和定义,并建立内部映射,只须在槽函数体内编写槽函数的功能即可,添加语句参考第一种方法中的步骤2。 第三种方法,右击界面选择“改变信号/槽”选项,单击“+”添加新的槽函数,结果如图2-17所示,单击“确定”按钮完成槽函数的添加。在窗体编辑区的下方有信号和槽的映射窗口,单击左上角的加号,出现一行新的映射,在这里进行映射的编辑,编辑结果如图2-18所示。最后重复第一种方法中的步骤1和步骤2完成槽函数的声明及定义。 图2-16 建立映射 图2-17 槽函数的添加

图2-18 信号槽函数映射4编译执行
首先选择菜单栏中“构建”选项中的“构建项目”选项,进行项目的构建,构建成功之后,单击窗口左下角的运行按钮即可运行程序,结果如图2-19所示,单击“OK”按钮,结果如图2-20所示。 图2-19 Hello程序加载界面 图2-20 Hello程序单击 “OK”按钮之后的界面
第3章 Qt4控件与示例精讲
本章目的: Qt4界面编辑 Qt4控件功能介绍 Qt4控件简单实用举例

31 布局(Layouts)
窗体上的每个控件都需要有一个合适的尺寸和位置,从而设计出合理、美观的界面。Qt中有三种方式对窗体上的控件进行布局管理,分别是:绝对布局、手工布局和Qt布局管理器
311 绝对布局
绝对布局控件的位置是固定的,控件不会随着窗口大小的变化而变化。 示例:
1 QLabel *lb=new QLabel(this);
2 lb->setText("ID:");
3 lb->setGeometry(10,10,40,20);
4 QLineEdit *leID = new QLineEdit("zml",this);
5 leID->setGeometry(50,10,50,20); //定义leID的尺寸和位置
6 QLabel *lb1=new QLabel(this);
7 lb1->setText("psswd:");
8 lb1->setGeometry(10,40,40,20);//定义lb1的尺寸和位置
9 QLineEdit *lePwd = new QLineEdit("123456",this);
10 lePwd->setGeometry(50,40,50,20);//定义lePwd的尺寸和位置
11 QPushButton *btn = new QPushButton(QObject::tr("quit"),this);
12 btn->setGeometry(50,70,50,20);//定义btn的尺寸和位置 图3-1 绝对布局实例图
执行以上的布局代码,结果如图3-1所示。 绝对布局不足之处: 1)不能改变窗体的尺寸大小。

2)如果改变字体或者翻译成另一种语言,文本可能不能正常显示。 3)在一些样式下,控件的尺寸不容易控制。
312 手工布局
控件的位置是固定的,但是控件的尺寸会随着窗口的大小变化而变化,可以通过重写窗体控件的resizeEvent()实现对子控件的大小的设置。 示例:
1 setMinimumSize(265, 190);//窗体最小尺寸
2 resize(365, 240);//窗体默认大小
3 int w = width()- minimumWidth();
4
5
6
7 /*****************定义控件*********************************/
8 QLabel *nameLabel =new QLabel("Name:",this);
9 QLabel *pwLabel = new QLabel("Passwd:",this);
10 QLineEdit *nameLineEdit = new QLineEdit(this);
11 QLineEdit *pwLineEdit = new QLineEdit(this);
12 QPushButton *okButton = new QPushButton("OK",this);
13 QPushButton *cancelButton = new QPushButton("Cancel",this);
14
15 nameLabel->setGeometry(9, 9, 40, 25); //定义nameLabel的尺寸和位置
16 nameLineEdit->setGeometry(55, 9, 50 + w, 25);//定义nameLineEdit的尺寸和位置
17 pwLabel->setGeometry(9, 40, 40, 25);//定义pwLabel的尺寸和位置
18 pwLineEdit->setGeometry(55, 40, 50 + w, 25);//定义pwLineEdit的尺寸和位置
19 okButton->setGeometry(150 + w, 9, 85, 25);//定义okButton的尺寸和位置
20 cancelButton->setGeometry(150 + w, 40, 85, 25);//定义cancelButton的尺寸和位置
执行以上的布局代码,结果如图3-2所示。

绝对布局和手工布局都需要开发人员编写很多代码,也需要很多的常量计算。如果设计界面改变了,所有的常量都要重新计算一遍。每个开发人员都不会愿意过多地编写这样的代码。管理窗体上控件最简单的方法就是使用Qt的布局管理器。下面就具体介绍Qt布局管理器的具体用法。
313 Qt布局管理器
布局类能够给出所有类型控件的默认值,布局管理类能够得到控件的最大、最小尺寸,在窗口尺寸改变时自动调整控件。Qt Creator有4种布局组件,如图3-3所示,同时存在对应的工具栏,如图3-4所示。
Qt提供的布局管理类有QHBoxLayout、QVBoxLayout、QGridLayout、QStackLayout 4种,具体介绍如表3-1所示。

1垂直布局 从左边的控件栏里选择一个Vertical Layout(垂直布局管理器)放到中心面板,再从控件栏里选择三个PushButton放到垂直布局管理器上,效果如图3-5所示,可以看到控件按垂直方向排列,宽度随垂直布局管理器改变而改变,但是控件高度不变。 还可以先从控件栏里拖入控件,然后选中要布局的控件,单击工具栏中的垂直布局按钮即可,效果一样。如果对当前布局不是很满意,将布局管理器整体选中,单击上面工具栏上的“Break Layout”按钮,便可取消布局管理器。(也可以先将按钮移出,再按下【Delete】键将布局管理器删除。)各布局管理器之间差别不大,使用起来非常简单,其他布局管理器不做过多介绍。 2分裂器部件(QSplitter) 先将控件同时选中,再单击工具栏上的“Lay Out Vertically in Splitter”(垂直分裂器)按钮,效果如图3-6所示。可以看到控件的大小可以随分裂器的大小改变而改变,这就是分裂器和布局管理器的区别。

布局管理器还有一项重要的功能,使控件的大小随着窗口大小的改变而改变。例如我们使用的编辑软件Qt Creator,它的编辑栏都是随着窗口大小的变化而变化的。如果窗口变大,而编辑栏没有变化,整个窗体就会显得不协调、不美观。 示例: 先在主窗口的中心放置一个文本编辑器TextEdit,然后选中主窗口部件,在空白处单击鼠标右键,选择“Layout→Lay Out in a Grid”,使整个主窗口的中心区处于网格布局管理器中。任意拉伸窗口,TextEdit的大小都会随之改变,界面如图3-7所示。
32 间隔器(Spacers)
Qt Creator提供了水平间隔器和垂直间隔器,在控件栏中的位置如图3-8所示。 图3-8 Spacers

1控件位置 Spacers→Horizontal Spacer或者Vertical Spacer。 2控件介绍 Spacers控件(弹簧或间隔器)是一个用来填补空白的控件,方便布局,这里不做过多介绍。
33 按钮(Buttons)
Qt Creator有6种Buttons控件,比Qt Designer多了Command Link Button和Button Box两种控件,如图3-9所示。 图3-9 Buttons控件
Buttons控件的Qt类和名称如表3-2所示。 Qt Creator的基本控件的用法和Qt Designer类似,因为它们使用的类基本相同,属性和成员函数没有太大变化,下面就来介绍Qt Creator中按钮控件的具体用法。 表3-2 Buttons控件介绍

331 PushButton控件
1控件位置 Buttons→PushButton 图3-10 PushButton控件
2控件介绍 PushButton控件(推动按钮)继承自QButton类,样式如图3-10所示。通常用它来执行命令或触发事件。如果按钮具有焦点,就可以使用鼠标左键、【Enter】键或空格键触发该按钮的Click信号。习惯用一个标签来描述按钮的作用,标签显示内容为有下划线的字母或单词(在文本中它的前面被“&”标明),例如:
1 QPushButton *btn = new QPushButton("&OK",this);
在这个示例中加速键是【Alt+O】,并且文本标签将显示为“OK”。 3控件设置选项 在PushButton控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; text:该控件对应图形界面中所显示的名称; font:设置text的字体; enabled:该控件是否可用。 4常用成员函数

1 1) PushButton::QPushButton(const QString & text, QWidget *parent, const char *name = 0 )
构造一个名称为name、父对象为parent并且文本为text的推动按钮。
1 2) void QButton::clicked () [信号]
当单击该按钮时,发射这个信号。
1 3) void QButton::pressed () [信号]
当按下该按钮时,发射这个信号。
1 4) void QButton::released () [信号]
当释放该按钮时,发射这个信号。
1 5) void QButton::setText ( const QString & )
设置该按钮上显示的文本。
1 6) QString QButton::text () const
返回该按钮上显示的文本。
332 RadioButton控件
1控件位置 Buttons→RadioButton 2控件介绍 RadioButton控件(单选按钮)继承QButton类,样式如图3-11所示。单选按钮通常成组出现,用于提供两个或多个互斥选项,即在一组选项中只能选择一个。 图3-11 RadioButton控件
3控件设置选项 在RadioButton控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称;

text:该控件对应图形界面中所显示的名称; font:设置text的字体; enabled:该控件是否可用,可用时值为true,不可用时值为false; checked:用来设置或返回是否选中单选按钮,选中时值为true,没有选中时值为false。 4常用成员函数
1 1) QRadioButton::QRadioButton(const QString & text,QWidget *parent, const char *name = 0 )
构造一个名称为name、父对象为parent并且文本为text的单选按钮。
1 2) bool QRadioButton::isChecked () const
返回是否选中单选按钮,选中时返回true,没有选中时返回false。
1 3) void QButton::setText ( const QString & )
设置该按钮上显示的文本。
1 4) QString QButton::text () const
返回该按钮上显示的文本。
1 5) void QButton::stateChanged ( int state ) [signal]
当更改checked属性值时,将发射这个信号。
1 6) void QRadioButton::setChecked ( bool check ) [virtual slot]
设置单选按钮是否被选中为check。
33 CheckBox控件
1控件位置 Buttons→CheckBox 2控件介绍

CheckBox控件(复选框)继承自QButton类,样式如图3-12所示。CheckBox和RadioButton都是选项按钮,它们的区别是选择模式,单选框提供的是“多选一”的选择,而复选框提供的是“多选多”的选择。 图3-12 CheckBox控件
3控件设置选项 在CheckBox控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; text:该控件对应图形界面中所显示的名称; font:设置text的字体; enabled:该控件是否可用,可用时值为true,不可用时值为false; checked:设置复选框是否选中,选中时值为true,没有选中时值为false。 4常用成员函数
1 1) QCheckBox::QCheckBox ( const QString & text, QWidget *parent, const char *name = 0 )
构造一个名称为name、父对象为parent并且文本为text的复选框。
1 2) bool QCheckBox::isChecked () const
选中该复选框,返回true,否则返回false。
1 3) void QButton::setText ( const QString & )
设置该按钮上显示的文本。
1 4) QString QButton::text () const
返回该按钮上显示的文本。

1 5) void QButton::stateChanged ( int state ) [signal]
当更改checked属性时,将发射这个信号。
1 6) void QCheckBox::setChecked ( bool check ) [槽]
设置复选框是否选中,状态是check的值。
334 示例1:PushButton、RadioButton和CheckBox控件的综合应用(1)
在这个示例中,我们建立标准的Qt Gui Application项目,它包含了菜单栏、工具栏和状态栏,但是在这个示例中不需要它们,所以把它们都删除。运用31节所学到的有关Qt布局的知识,设计界面如图3-13所示。 图3-13 示例1界面
1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-3所示。 表3-3 示例1主要控件说明

2示例1说明 示例功能说明: 单击选中一个RadioButton时,label显示选中的RadioButton; 单击选中一个CheckBox时,label_2显示当前所有选中的CheckBox; 单击btn_RadioButton按钮时,RadioButton1被选中,label显示RadioButton1被选中; 单击btn_CheckBox按钮时,统计当前所有选中的CheckBox,label_2显示当前所有选中的CheckBox。 3示例实现 在这里我们使用Qt Creator自动生成的槽函数,不用写信号与槽函数的映射。(Qt Creator自动生成槽函数的方法:右击控件→Go to slot,选择槽函数所要对应的信号函数,确定后就会生成槽函数的声明和定义框架。)

图3-14 选择信号
右击控件radioButton,选中“Go to slot”选项,在信号窗口中选择信号,如图3-14所示。在本示例中我们用到的是clicked()信号,确定后就会跳转到槽函数的定义框架中,槽函数的声明已经自动生成,这一点和Winform差不多。然后只需要填充槽函数即可。 按照同样的方法为控件radioButton_2、radioButton_3、checkBox、checkBox_2、checkBox_3、btn_RadioButton和btn_CheckBox添加槽函数。 项目创建及相应的控件属性、信号、槽函数编译完成之后,接下来对相应文件进行编辑。 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 void displayCheckBox();
14 private:
15 Ui::MainWindow *ui;
16 private slots: //槽函数,自动添加
17 void on_checkBox_3_clicked();
18 void on_checkBox_2_clicked();

19 void on_checkBox_clicked();
20 void on_radioButton_3_clicked();
21 void on_radioButton_2_clicked();
22 void on_radioButton_clicked();
23 void on_btn_CheckBox_clicked();
24 void on_btn_RadioButton_clicked();
25 };
26 #endif // MAINWINDOW_H
334 示例1:PushButton、RadioButton和CheckBox控件的综合应用(2) 在主窗体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文件中添加槽函数on_btn_RadioButton_clicked():
1 /****槽函数:设置RadioButton1为选中状态****/
2 void MainWindow::on_btn_RadioButton_clicked()
3 {
4 ui->radioButton->setChecked(true); //设置radioButton为选中状态
5
6 /****设置label显示“RadioButton1 is Checked!”****/
7 ui->label->setText("RadioButton1 is Checked!");
8 }
在主窗体mainwindowcpp文件中添加槽函数on_btn_CheckBox_clicked():
1 /****槽函数:显示被选中的CheckBox****/
2 void MainWindow::on_btn_CheckBox_clicked()
3 {
4 QString str;
5 str ="";
6 ui->label_2->adjustSize();
7 if(ui->checkBox->isChecked())//checkBox是否选中

8 {
9 str += "checkBox1 is Checked;";
10 }
11 if(ui->checkBox_2->isChecked())//checkBox_2是否选中
12 {
13 str += "checkBox2 is Checked;";
14 }
15 if(ui->checkBox_3->isChecked())//checkBox_3是否选中
16 {
17 str +="checkBox3 is Checnked!";
18 }
19 ui->label_2->setText(str);
20 }
在主窗体mainwindowcpp文件中添加槽函数on_radioButton_clicked():
1 /****槽函数:选中RadioButton1****/
2 void MainWindow::on_radioButton_clicked()
3 {
4 ui->radioButton->setChecked(true); //设置radioButton为选中状态
5
6 /****设置label显示“RadioButton1 is Checked!”****/
7 ui->label->setText("RadioButton1 is Checked!");
8 }
在主窗体mainwindowcpp文件中添加槽函数on_radioButton_2_clicked():
1 /****槽函数:选中RadioButton2****/
2 void MainWindow::on_radioButton_2_clicked()
3 {
4 ui->radioButton_2->setChecked(true); //设置radioButton_2为选中状态
5
6 /****设置label显示“RadioButton2 is Checked!”****/
7 ui->label->setText("RadioButton2 is Checked!");
8 }
在主窗体mainwindowcpp文件中添加槽函数on_radioButton_3_clicked():
1 /****槽函数:选中RadioButton3****/
2 void MainWindow::on_radioButton_3_clicked()
3 {
4 ui->radioButton_3->setChecked(true); //设置radioButton_3为选中状态
5

6 /****设置label显示“RadioButton3 is Checked!”****/
7 ui->label->setText("RadioButton3 is Checked!");
334 示例1:PushButton、RadioButton和CheckBox控件的综合应用(3) 在主窗体mainwindowcpp文件中添加槽函数on_checkBox_clicked():
1 /****槽函数:选中CheckBox1****/
2 void MainWindow::on_checkBox_clicked()
3 {
4 if(ui->checkBox->isChecked()) //checkBox被选中
5 {
6 this->displayCheckBox();
7 }
8 else
9 {
10 this->displayCheckBox();
11 }
12 }
在主窗体mainwindowcpp文件中添加槽函数on_checkBox_2_clicked():
1 /****槽函数:选中CheckBox1****/
2 void MainWindow::on_checkBox_2_clicked()
3 {
4 if(ui->checkBox_2->isChecked())//checkBox_2被选中
5 {
6 this->displayCheckBox();
7 }
8 else
9 {
10 this->displayCheckBox();
11 }
12 }
在主窗体mainwindowcpp文件中添加槽函数on_checkBox_3_clicked():
1 /****槽函数:选中CheckBox1****/
2 void MainWindow::on_checkBox_3_clicked()
3 {
4 if(ui->checkBox_3->isChecked())//checkBox_3被选中
5 {
6 this->displayCheckBox();
7 }
8 else
9 {
10 this->displayCheckBox();

11 }
12 }
在主窗体mainwindowcpp文件中添加成员函数displayCheckBox():
1 /****成员函数:显示当前所有CheckBox的状态****/
2 void MainWindow::displayCheckBox()
3 {
4 QString str;
5 str ="";
6 if(ui->checkBox->isChecked()) //checkbox被选中
7 {
8 str += "checkBox1 is Checked;";
9 }
10 if(ui->checkBox_2->isChecked())//checkbox_2被选中
11 {
12 str += "checkBox2 is Checked;";
13 }
14
15
16 if(ui->checkBox_3->isChecked())//checkbox_3被选中
17 {
18 str +="checkBox3 is Checnked!";
19 }
20 ui->label_2->setText(str);
21 }
主文件maincpp采用项目自动生成的即可。 4示例执行结果 示例执行结果如图3-15所示。 (点击查看大图)图3-15 示例1执行结果

335 ToolButton控件
1控件位置 Buttons→ToolButton 2控件介绍 ToolButton控件(工具按钮)继承自QButton类,样式如图3-16所示。ToolButton是一种用于命令或者选项的可以快速访问的按钮,通常用在ToolBar里面。工具按钮和按钮不同,工具按钮通常显示的是图标,而不是文本标签,一般用于编辑工具栏。另外,ToolButton支持自动浮起。在自动浮起模式中,按钮只有在鼠标指向它的时候才绘制三维的框架。当按钮用在ToolBar里面的时候,Qt默认启用这种模式,也可以使用setAutoRaise()来改变它。 图3-16 ToolButton控件
3控件设置选项 在ToolButton控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; text:工具按钮标签文本; font:设置工具按钮标签的字体; autoRaise:自动浮起是否生效; iconSet:提供显示在按钮上的图标的图标集; on:工具按钮是否为开; textLabel:工具按钮自动提示文本;
usesTextLabel:自动提示文本textLabel是否工作,默认为false。

4常用成员函数
1 1) QToolButton::QToolButton ( QWidget *parent, const char *name = 0 )
构造一个名称为name、父对象为parent的ToolButton。
1 2) QToolButton::QToolButton(const QIconSet & iconSet, const QString & textLabel, const QString & grouptext, QObject *receiver, const char *slot, QToolBar *parent, const char *name = 0 )
构造一个名称为name,父对象为parent(必须为QToolBar)的工具按钮。工具按钮将显示iconSet,工具提示为textLabel,状态条信息为grouptext,同时会将工具按钮连接到receiver对象的槽函数。
1 3) QToolButton::QToolButton ( ArrowType type, QWidget *parent, const char *name = 0 )
此构造函数是把工具按钮构造成箭头按钮,type定义了箭头的方向,可用的值有LeftArrow、RightArrow、UpArrow和DownArrow。
1 4) void QToolButton::setAutoRaise ( bool enable )
根据参数enable值设置按钮是否可自动浮起。
1 5) void QToolButton::setIcon ( const QIconSet & )
设置显示在工具按钮上的图标。
1 6) void QToolButton::setOn ( bool enable ) [虚 槽]
设置按钮是否为开,enable等于true则设置为开,否则设置为关。
1 7) void QToolButton::setTextLabel ( const QString & ) [槽]
设置按钮的提示标签。
1 8) QString QToolButton::textLabel () const
返回按钮的提示标签。
336 示例2:ToolButton的应用(1)
ToolButton经常与ToolBar一起使用,首先建立标准的Qt Gui Application项目。Qt Gui Application项目会自动生成一个ToolBar,控件名称是mainToolBar。在这个示例中,由于用不到menuBar和statusBar,因此把项目自动生成的menuBar和statusBar删除。另外,我们还用到了一个TextEdit控件,设计界面如图3-17所示。

1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-4所示。 图3-17 示例2界面
表3-4 主要控件说明
2示例说明 在ToolBar中添加三个ToolButton,功能分别如下: 单击工具按钮buttonNew,文本编辑框textEdit显示“New”; 单击工具按钮buttonOpen,文本编辑框textEdit显示“Open”; 单击工具按钮buttonSave,文本编辑框textEdit显示“Save”。 3示例实现

由于Qt Creator的ToolBar不支持直接拖拽控件,因此我们不能通过拖曳方式在ToolBar中添加ToolButton。在本示例用到的三个ToolButton都是自定义的。详细代码实现如下。 头文件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 slotNew();
17 void slotOpen();
18 void slotSave();
19 };
20 #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 #include
2 在主窗体mainwindowcpp文件中构造函数:

3
4 /*************构造函数*********************/
5 MainWindow::MainWindow(QWidget parent) :
6 QMainWindow(parent),
7 ui(new Ui::MainWindow)
8 {
9 ui->setupUi(this);
10
11 /**********定义QToolButton************************/
12 QToolButton buttonNew = new QToolButton;//定义buttonNew控件
13
14
15 buttonNew->setText("New");
16 QToolButton buttonOpen= new QToolButton; //定义buttonOpen控件
17 buttonOpen->setText("Open");
18 QToolButton buttonSave = new QToolButton;//定义buttonSave控件
19 buttonSave->setText("Save");
20
21 /**********在mainToolBar中添加ToolButton**************/
22 ui->mainToolBar->addWidget(buttonNew);
23 ui->mainToolBar->addWidget(buttonOpen);
24 ui->mainToolBar->addWidget(buttonSave);
25
26 /**********信号和槽的映射*******************************/
27 connect(buttonNew,SIGNAL(clicked()),this,SLOT(slotNew()));
28 connect(buttonOpen,SIGNAL(clicked()),this,SLOT(slotOpen()));
29 connect(buttonSave,SIGNAL(clicked()),this,SLOT(slotSave()));
30 }
336 示例2:ToolButton的应用(2) 在主窗体mainwindowcpp文件中添加槽函数slotNew():
1 /
槽函数:设置textEdit显示“New”
**/
2 void MainWindow::slotNew()
3 {

4 ui->textEdit->setText("New"); //设置textEdit显示"New"
5 }
在主窗体mainwindowcpp文件中添加槽函数slotOpen():
1 /槽函数:设置textEdit显示“Open”/
2 void MainWindow::slotOpen()
3 {
4 ui->textEdit->setText("Open");//设置textEdit显示"Open"
5 }
在主窗体mainwindowcpp文件中添加槽函数slotSave():
1 /槽函数:设置textEdit显示“Save”/
2 void MainWindow::slotSave()
3 {
4 ui->textEdit->setText("Save");//设置textEdit显示"Save"
5 }
主文件maincpp采用项目自动生成的即可,不需任何更改。 4示例执行结果 示例执行结果如图3-18所示。 图3-18 示例2执行结果
337 CommandLinkButton控件
1控件位置 Buttons→CommandLinkButton

2控件介绍 CommandLinkButton控件(命令链接按钮)继承自QPushButton,样式如图3-19所示。CommandLinkButton控件是一种Windows Vista风格的命令链接按钮,它和RadioButton相似,都是用于在互斥选项中选择一项。表面上同平面按钮一样,但是CommandLinkButton除带有正常的按钮上的文字描述文本外,默认情况下,它也将携带一个箭头图标,表明按下按钮将打开另一个窗口或页面。 图3-19 CommandLinkButton控件
3控件设置选项 在CommandLinkButton控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; text:该控件对应图形界面中所显示的标签; font:设置text的字体; enabled:该控件是否可用; description:一个描述性的标签,以配合按钮上的文字。 4常用成员函数
1 1) QCommandLinkButton::QCommandLinkButton ( QWidget *parent = 0 )
构造一个父对象为parent的命令链接按钮。
1 2) QCommandLinkButton::QCommandLinkButton ( const QString & text, QWidget *parent = 0 )
构造一个父对象为parent、文本为text的命令链接按钮。

1 3) QCommandLinkButton::QCommandLinkButton (const QString & text,const QString & description,QWidget *parent = 0 )
构造一个父对象为parent、文本为text和描述文本为description的命令链接按钮。
1 4) void QButton::clicked () [信号]
当单击该按钮时,发射这个信号。
1 5) void QButton::pressed () [信号]
当按下该按钮时,发射这个信号。
1 6) void QButton::released () [信号]
当释放该按钮时,发射这个信号。
1 7) void QButton::setText ( const QString & )
设置该按钮上显示的文本。
1 8) QString QButton::text () const
返回该按钮上显示的文本。 图3-20 示例3界面
338 示例3:CommandLinkButton的应用(1)
首先建立标准的Qt Gui Application项目,把项目自动生成的toolBar、menuBar和statusBar删除,设计界面如图3-20所示。 1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-5所示。 表3-5 主要控件说明

2示例说明 界面布局设置好之后,添加资源文件。在该示例的项目目录下新建文件夹images,文件夹images中有5张图片,分别是:1jpg、2jpg、3jpg、4jpg和5jpg。然后在Qt Creator中右击该项目,在弹出的窗口中选择“Qt Resource file”,如图3-21所示,添加的资源文件名称为images,如图3-22所示,单击“Next”按钮,弹出如图3-23所示的窗口,保持默认设置,单击“Finish”按钮完成资源文件的添加。 图3-21 添加资源文件

图3-22 资源文件设置 图3-23 资源文件添加完成
打开新建的imagesqrc,选择“Add→Add Prefix”,如图3-24所示。 图3-24 imagesqrc文件

338 示例3:CommandLinkButton的应用(2) 在Prefix栏内添加“/”,添加后如图3-25所示。 然后单击“add→Add Files”,选中要添加的5张图片并确定,添加成功后如图3-26所示。 图3-25 添加“/” 图3-26 添加完成
示例功能说明:这个示例很简单,程序执行后,label显示1jpg,单击“Command Link Button”控件,显示下一张图片,循环显示。 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 QStringList list;//图片列表
16 int currentImage;//当前图片编号
17 private slots://私有槽函数
18 void on_commandLinkButtonNext_clicked();//槽函数
19 };
20 #endif // MAINWINDOW_H
这里只在Qt Gui Application项目自动生成的头文件mainwindowh里声明两个变量和一个槽函数。list用于保存图片,currentImage用于保存当前显示的图片编号。槽函数on_commandLinkButtonNext_clicked()对应commandLinkButtonNext的单击信号。因此此处的槽函数是通过右击控件→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 this->currentImage = 0;
8
9 /*************初始化图片列表list**********************8/
10 this->list<<":/images/1jpg"<<":/images/2jpg"<<":/images/3jpg"<<

11 ":/images/4jpg"<<":/images/5jpg";
12 ui->imageLabel->setBackgroundRole(QPalette::Base);
13 ui->imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
14 ui->imageLabel->setScaledContents(true);
15 resize(500, 400);//设置窗体尺寸
16 QString fileName = listat(this->currentImage);//获取当前图片
17 if(!fileNameisEmpty())//图片是否存在
18 {
19 QImage image(fileName);
20 if(imageisNull())
21 {
22 QMessageBox::information(this, tr("Image Viewer"),tr("Cannot load %1")arg(fileName));
23 return;
24 }
25 ui->imageLabel->setPixmap(QPixmap::fromImage(image));//用图片填充imageLabel
26 }
27 }
338 示例3:CommandLinkButton的应用(3) 在主窗体mainwindowcpp文件中添加槽函数on_commandLinkButtonNext_clicked():
1 /槽函数:实现图片循环展示/
2 void MainWindow::on_commandLinkButtonNext_clicked()
3 {
4 if(this->currentImage == 4) //实现图片循环展示
5 this->currentImage =0;
6 else
7 this->currentImage++;//更新当前图片
8 QString fileName = listat(this->currentImage);
9 if(!fileNameisEmpty())//图片是否存在
10 {
11 QImage image(fileName);
12 if(imageisNull())
13 {

14 QMessageBox::information(this, tr("Image Viewer"),tr("Cannot load %1")arg(fileName));
15 return;
16 }
17 ui->imageLabel->setPixmap(QPixmap::fromImage(image)); //显示图片
18 }
19 }
不需要更改主文件maincpp,使用工程自动生成的即可。 4示例执行结果 示例执行结果如图3-27所示。 图3-27 示例执行结果
339 ButtonBox控件
1控件位置
Buttons→ButtonBox

2控件介绍 ButtonBox控件(按钮盒)的样式如图3-28所示。ButtonBox控件是由QDialogButtonBox类包装成的。 图3-28 ButtonBox控件
3控件设置选项 在ButtonBox控件的properties选项中,一般常对以下选项进行设置。 name:该控件对应源代码中的名称; font:设置text的字体; enabled:该控件是否可用; centerButtons:ButtonBox中的按钮是否居中布局,默认值为false; orientation:按钮布局方向,Qt提供QT::Horizontal和QT::Vertical两种; standardButtons:标准按钮集合。 4常用成员函数
1 1) QDialogButtonBox::QDialogButtonBox ( QWidget *parent = 0 )
构造一个按钮盒,父对象为parent。
1 2) QDialogButtonBox::QDialogButtonBox ( QT::Orientation orientation, QWidget *parent = 0 )
构造一个按钮盒,父对象为parent,排列方向为orientation,并且包含buttons。
1 3) QDialogButtonBox::QDialogButtonBox(StandardButtons buttons, QT::Orientation orientation = QT::Horizontal, QWidget *parent = 0 )
构造一个按钮盒,父对象为parent,排列方向为orientation。
1 4) void QDialogButtonBox::accepted () [signal]

当单击按钮盒里的定义为AcceptRole和YesRole的按钮时,发射这个信号。
1 5) void QDialogButtonBox::addButton ( QAbstractButton *button, ButtonRole role )
向按钮盒里添加按钮button,定义按钮button的角色为role,如果role是无效的,则不添加按钮,如果按钮已添加,移除并再次添加为新角色。
1 6) QPushButton *QDialogButtonBox::addButton ( const QString & text, ButtonRole role )
创建一个按钮的文本为text,以指定角色添加到按钮盒,并返回相应的按钮,如果role是无效的,就不创建按钮,返回0。
1 7) QPushButton *QDialogButtonBox::addButton ( StandardButton button )
向按钮盒中添加一个标准按钮button,并返回标准按钮。如果按钮无效,不添加,返回0。
1 8) void QDialogButtonBox::clear ()
清空该按钮盒里的所有按钮。
1 9) void QDialogButtonBox::clicked ( QAbstractButton *button ) [signal]
当单击按钮盒里的按钮button时,发射这个信号。
1 10) void QDialogButtonBox::helpRequested () [signal]
当单击按钮盒里的定义为HelpRole的按钮时,发射这个信号。
1 11) void QDialogButtonBox::rejected () [signal]
当单击按钮盒里的定义为RejectRole和NoRole的按钮时,发射这个信号。
1 12) void QDialogButtonBox::removeButton ( QAbstractButton *button )
移出按钮盒里的按钮button,但是不删除,设置它的父母为0。
3310 示例4:ButtonBox的应用(1)
按钮盒(ButtonBox)可以很方便地快速布置一组按钮。它有水平和垂直两种样式。可以用以下函数创建水平或垂直按钮盒。下面通过示例来看看ButtonBox的用法。 首先建立标准的Qt Gui Application项目,把项目自动生成的toolBar、menuBar和statusBar删除,设计界面如图3-29所示。 1控件说明 在属性编辑窗口中对控件的属性进行修改,修改内容如表3-6所示。

图3-29 示例4界面
表3-6 主要控件说明
2示例说明 在buttonBox中添加PushButton与“OK”按钮组成按钮组,名称是Clear,按钮功能说明如下: 在lineEdit输入框中输入字符串内容,单击按钮组buttonBox中的“OK”按钮,lineEdit中的内容添加到textEdit中; 单击按钮组buttonBox中的“Clear”按钮,清空textEdit中的所有内容。 3示例实现 本示例通过添加自定义的“Clear”按钮,方便大家全面地掌握ButtonBox的用法。 头文件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 QPushButton Clear;
19 private slots:
20 void on_buttonBox_clicked(QAbstractButton button);
21 };
22 #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 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 Clear = new QPushButton; //new QPushButton
8 Clear->setText("Clear");//设置Clear的Text

9 ui->buttonBox->addButton(Clear,QDialogButtonBox::ActionRole);
3310 示例4:ButtonBox的应用(2) 在主窗体mainwindowcpp文件中添加槽函数on_buttonBox_clicked(QAbstractButtonbutton):
1 /
槽函数:处理buttonBox中的单击按钮事件/
2 void MainWindow::on_buttonBox_clicked(QAbstractButton
button)
3 {
4 QString str;
5 str = ui->textEdit->toPlainText();
6 if(button == ui->buttonBox->button(QDialogButtonBox::Ok))
7 {
8 if(!ui->lineEdit->text()isEmpty())
9 {
10 str += ui->lineEdit->text()+"\n";
11 ui->textEdit->setPlainText(str); //更新textEdit
12 }
13 }
14 else if(button == this->Clear)
15 {
16 ui->textEdit->setPlainText("");//清空textEdit
17 }
18 }
主文件maincpp不需任何更改,使用工程自动生成的即可。 4示例执行结果 示例执行结果如图3-30所示。

图3-30 示例4执行结果

Linux环境下Qt4图形界面与MySQL编程

linux环境下qt4图形界面mysql编程》
前言
第一章 绪论
11 图形界面设计的必要性
12 linux常用的图形化界面编程工具
121 qt
122 GTK+
13 两种常用的Linux数据库
131 mysql
132 SQLite
14 图形界面与数据库综合编程技术
第2章 Qt4图形界面编程基础
21 Qt Creator
22 安装Qt环境及Qt Creator(1)
23 信号和槽机制
24 一个抛砖引玉的实例(1)
第3章 Qt4控件与示例精讲
31 布局(Layouts)
311 绝对布局
312 手工布局
313 Qt布局管理器
32 间隔器(Spacers)
33 按钮(Buttons)
331 PushButton控件
332 RadioButton控件
333 CheckBox控件
334 示例1:PushButton、RadioButton和CheckBox控件的综合应用(1)
335 ToolButton控件
336 示例2:ToolButton的应用(1)
337 CommandLinkButton控件
338 示例3:CommandLinkButton的应用(1)
339 ButtonBox控件
3310 示例4:ButtonBox的应用(1)
34 单元视图(Item Views)
341 ListView控件
342 示例5:ListView的应用
343 TreeView控件(1)
343 TreeView控件(2)
344 示例6:TreeView的应用(1)
345 TableView控件(1)
346 示例7:TableView的应用

347 ColumnView控件
35 单元组件(Item Widgets)
351 ListWidget控件(1)
352 TreeWidget控件(1)
353 TableWidget控件(1)
354 示例8:TableWidget的示例
36 容器(Containers)
361 GroupBox控件
362 ScrollArea控件
363 示例9:GroupBox和ScrollArea的示例(1)
364 ToolBox控件
365 示例10:ToolBox的应用
366 TabWidget控件(1)
367 示例11:TabWidget的应用(1)
367 示例11:TabWidget的应用(2)
368 StackedWidget控件
369 示例12:StackedWidget的应用
3610 Frame控件
3611 Widget控件
3612 MdiArea控件
3613 示例13:MdiArea的应用(1)
3614 DockWidget控件
3615 示例14:DockWidget的示例
37 输入组件(Input Widgets)
371 ComboBox控件
372 Font ComboBox控件
373 LineEdit控件
374 TextEdit控件
375 PlainTextEdit控件
376 示例15:ComboBox、LineEdit和TextEdit的应用(1)
377 SpinBox控件
378 Double SpinBox控件
379 Slider控件
3710 示例16:SpinBox、Double SpinBox和Slider的应用(1)
3711 Dial控件
3712 示例17:Dial的应用
3713 ScrollBar控件
3714 DateEdit控件
3715 TimeEdit控件
3716 DateTimeEdit控件
3717 示例18:DateEdit、TimeEdit和DateTimeEdit的应用(1)
38 显示组件(Display Widgets)
381 Label控件
382 TextBrowser控件

383 示例19:TextBrower的应用
384 GraphicsView控件
385 示例20:GraphicsView的应用(1)
386 Calendar控件
387 示例21:Calendar的应用
388 LCDNumber控件
389 示例22:LCDNumber的应用
3810 ProgressBar控件
3811 示例23:ProgressBar的应用(1)
3812 Line控件

《Linux环境下Qt4图形界面与MySQL编程》
前言
Linux操作系统作为源码开放的自由软件,经过近20年的发展与壮大,越来越受到IT界的认可,在信息技术领域发挥着重要作用。图形界面是Linux走向成熟的重要支撑技术,备受众多开发者的重视。在每个工程项目中,几乎都离不开数据库技术。因此,稳定的OS、友好的图形界面和完善的数据库技术构成了一个完整的工程项目。 面对Linux操作系统图形界面与数据库编程,很多学习者不知道如何下手。本书正是在这种背景下编写的,紧紧围绕本书的写作主线“图形界面编程控件与数据库编程基础→简单易学的实例→实际工程项目开发与场景分析”,以当前最新的Qt47为依据,采用“深入分析控件+实例解析”的方式,并配合经典的实际工程项目,对Linux操作系统下的Qt47与MySQL编程技术进行了全面细致的讲解。本书主要分为以下三大部分: Linux图形界面编程基础。介绍Qt47的全部控件,并针对每个控件设计了一个简单易学的实例,抛砖引玉,加深读者对Qt47控件的认识和理解。 基于Linux操作系统的MySQL数据库设计基础。介绍MySQL基本操作,并针对每个操作设计了一个简单易学的实例,抛砖引玉,加深读者对MySQL操作的认识和理解。 基于Qt47与MySQL的经典的实际工程项目案例开发。在本书中设计了列车时刻表查询系统、酒店客房管理系统、房屋租赁系统、书店管理系统、学生上机考试系统、校园点菜系统、餐饮信息服务系统、视频音频播放器、桌面常用软件小助手、俄罗斯方块游戏和局域网聊天系统。这些案例给读者提供了实际工程项目开发参考。
在本书的编写过程中,参考和借鉴了很多资料,它们为本书的编写和实验例程的解决方案提供了重要的指导作用。本书中的范例源代码可以到华章网站(wwwhzbookcom)下载。 本书主要由邱铁、周玉、张民垒等完成编著任务。在此,感谢所有参与本书构思、解决方案、编辑和出版工作的同事、同行和为本书编写提供灵感的同志们,其中马利超参加了代码调试和部分文档整理,陈方疏、易磊、刘继伟、王革正、陈坚、宋莉莉、张涛、郝若男、刘晗、张晓彤、王宇辰、高凡等在课程设计中的构思被本书采纳,并被设计成典型案例,向他们表示感谢。
开源项目还在向前飞速发展,Qt与MySQL版本还在不断更新,书中难免存在错误和不妥之处,恳请读者批评指正,并将信息发送到openlinux2011@gmailcom,我们会尽力及时答复。——编者。

XML

XML

These classes are relevant to XML users.

QDomAttrRepresents one attribute of a QDomElement
QDomCDATASectionRepresents an XML CDATA section
QDomCharacterDataRepresents a generic string in the DOM
QDomCommentRepresents an XML comment
QDomDocumentRepresents an XML document
QDomDocumentFragmentTree of QDomNodes which is not usually a complete QDomDocument
QDomDocumentTypeThe representation of the DTD in the document tree
QDomElementRepresents one element in the DOM tree
QDomEntityRepresents an XML entity
QDomEntityReferenceRepresents an XML entity reference
QDomImplementationInformation about the features of the DOM implementation
QDomNamedNodeMapCollection of nodes that can be accessed by name
QDomNodeThe base class for all the nodes in a DOM tree
QDomNodeListList of QDomNode objects
QDomNotationRepresents an XML notation
QDomProcessingInstructionRepresents an XML processing instruction
QDomTextRepresents text data in the parsed XML document
QXmlAttributesXML attributes
QXmlContentHandlerInterface to report the logical content of XML data
QXmlDeclHandlerInterface to report declaration content of XML data
QXmlDefaultHandlerDefault implementation of all XML handler classes
QXmlDTDHandlerInterface to report DTD content of XML data
QXmlEntityResolverInterface to resolve external entities contained in XML data
QXmlErrorHandlerInterface to report errors in XML data
QXmlInputSourceThe input data for the QXmlReader subclasses
QXmlLexicalHandlerInterface to report the lexical content of XML data
QXmlLocatorThe XML handler classes with information about the parsing position within a file
QXmlNamespaceSupportHelper class for XML readers which want to include namespace support
QXmlParseExceptionUsed to report errors with the QXmlErrorHandler interface
QXmlReaderInterface for XML readers (i.e. parsers)
QXmlSimpleReaderImplementation of a simple XML reader (parser)