《第一部分Qt基础课件.ppt》由会员分享,可在线阅读,更多相关《第一部分Qt基础课件.ppt(83页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Chapter 2 QT部件与事件处理部件与事件处理课程主要内容课程主要内容用户界面组件介绍用户界面组件介绍部件的布局管理部件的布局管理通用部件通用部件部件的尺寸策略部件的尺寸策略Qt Designer顶层窗体顶层窗体Qt 图标图标Qt 事件处理事件处理用户界面组件介绍用户界面组件用户界面组件用户界面由单个用户界面由单个部件(部件(widget)构成构成QLabelQPushButtonQLineEditQDoubleSpinBoxQScrollBar部件中的部件部件中的部件部件被分层次放置部件被分层次放置容器类容器类提供可视化结构,但同时也是具有一定功提供可视化结构,但同时也是具有一定功能化
2、的。能化的。如如 QRadioButton,需要用彼此间实现互斥,可以,需要用彼此间实现互斥,可以将多个将多个QRadioButton放到一个放到一个GroupBox中。中。QGroupBoxQTabWidget部件的特点部件的特点占据屏幕中一个占据屏幕中一个方形的区域方形的区域从输入设备从输入设备接收事件接收事件当部件产生变化时,当部件产生变化时,发出信号发出信号多个部件多个部件以层次式的方法以层次式的方法组合构建组合构建一个部件中可以包含其他部件一个部件中可以包含其他部件部件的布局管理一个对话框例子一个对话框例子部件被部件被放置在布局管理器中放置在布局管理器中使用户界面具有弹性使用户界面具
3、有弹性易伸缩易伸缩弹性好在哪里?弹性好在哪里?让让部件的大小适应内容部件的大小适应内容让部件适应翻译变化让部件适应翻译变化让部件适应用户设置,如字体设置等让部件适应用户设置,如字体设置等布局管理布局管理QGridLayoutQFormLayoutQVBoxLayoutQHBoxLayout几种几种可用的布局可用的布局布局管理器和部件布局管理器和部件“协商协商”各个部件大小与位各个部件大小与位置置弹簧弹簧可以用来填充空白处可以用来填充空白处一个对话框例子一个对话框例子对话框由多个层次的布局管理器和部件组成对话框由多个层次的布局管理器和部件组成对话框例子对话框例子 QVBoxLayout*oute
4、rLayout=new QVBoxLayout(this);QHBoxLayout*topLayout=new QHBoxLayout();topLayout-addWidget(new QLabel(Printer:);topLayout-addWidget(c=new QComboBox();outerLayout-addLayout(topLayout);QHBoxLayout*groupLayout=new QHBoxLayout();.outerLayout-addLayout(groupLayout);outerLayout-addSpacerItem(new QSpacerIte
5、m(.);QHBoxLayout*buttonLayout=new QHBoxLayout();buttonLayout-addSpacerItem(new QSpacerItem(.);buttonLayout-addWidget(new QPushButton(Print);buttonLayout-addWidget(new QPushButton(Cancel);outerLayout-addLayout(buttonLayout);对话框例子对话框例子QHBoxLayout*groupLayout=new QHBoxLayout();QGroupBox*orientationGrou
6、p=new QGroupBox();QVBoxLayout*orientationLayout=new QVBoxLayout(orientationGroup);orientationLayout-addWidget(new QRadioButton(Landscape);orientationLayout-addWidget(new QRadioButton(Portrait);groupLayout-addWidget(orientationGroup);QGroupBox*colorGroup=new QGroupBox();QVBoxLayout*colorLayout=new QV
7、BoxLayout(colorGroup);colorLayout-addWidget(new QRadioButton(Black and White);colorLayout-addWidget(new QRadioButton(Color);groupLayout-addWidget(colorGroup);Horizontal box,包含包含 group boxes,vertical boxes,radio buttons对话框例子对话框例子可以使用可以使用Qt设计器来建立同样的结构设计器来建立同样的结构通用部件通用部件通用部件Qt包含针对所有常见需求包含针对所有常见需求的的大量通用
8、部件大量通用部件Qt设计器设计器中为部件组提供中为部件组提供很好的概貌很好的概貌通用部件通用部件按钮按钮所有按钮所有按钮继承自继承自QAbstractButton这个基本类。这个基本类。信号信号clicked()当按钮被按下(并弹起后)发出。当按钮被按下(并弹起后)发出。toggled(bool)当按钮的状态发生改变时发出。当按钮的状态发生改变时发出。属性属性checkable 当按钮可检查时为真。使按钮激活。当按钮可检查时为真。使按钮激活。checked 当按钮被标记时为真。(用于复选或单选按钮)当按钮被标记时为真。(用于复选或单选按钮)text 按钮的文本。按钮的文本。icon 按钮的图标
9、(可以和文本同时显示)。按钮的图标(可以和文本同时显示)。QAbstractButtonQPushButtonQCheckBoxQRadioButton通用部件通用部件列表项部件列表项部件QListWidget用于显示列表项用于显示列表项添加项目添加项目addItem(QString)将项目附加到列表末端将项目附加到列表末端insertItem(int row,QString)将项目插入到指定行将项目插入到指定行选择项目选择项目selectedItems 返回返回QListWidgetItem的列表的列表,使用使用 QListWidgetItem:text来形成文本来形成文本信号信号itemS
10、electionChanged 当选择状态改变时发出当选择状态改变时发出QComboBox 以更紧密的格式展示一个单选的以更紧密的格式展示一个单选的项目列表。项目列表。QListWidgetQComboBox通用部件通用部件容器容器容器部件用来结构化用户界面容器部件用来结构化用户界面一个简单一个简单的的 QWidget 对象可当做容器对象可当做容器来来使用使用设计器:设计器:将部件放置在容器中并为容器将部件放置在容器中并为容器提供一个布局管理器提供一个布局管理器代码:为容器创建一个布局管理器并将代码:为容器创建一个布局管理器并将部件添加进布局管理器(布局管理器以部件添加进布局管理器(布局管理器
11、以容器为父对象)容器为父对象)QGroupBox*box=new QGroupBox();QVBoxLayout*layout=new QVBoxLayout(box);layout-addWidget(.);.QGroupBoxQTabWidgetQFrame通用部件通用部件输入部件输入部件使用使用QLineEdit 实现单行文本输入实现单行文本输入信号信号textChanged(QString)文本状态改变时发出文本状态改变时发出editingFinished()部件失去焦点时发出部件失去焦点时发出returnPressed()回车键被按下时发出回车键被按下时发出属性属性text 部件的文
12、本部件的文本maxLength 限定输入的最大长度限定输入的最大长度readOnly 设置为真时文本不可编辑(仍允许复制)设置为真时文本不可编辑(仍允许复制)QLineEdit通用部件通用部件输入部件输入部件使用使用QTextEdit 和和 QPlainTextEdit 实现多行文本输入实现多行文本输入SignalstextChanged()-文本状态改变时发出文本状态改变时发出属性属性plainText 无定义格式文本无定义格式文本html HTML格式文本格式文本readOnly 设置为真时文本不可编辑设置为真时文本不可编辑QComboBox 通过通过editable属性使其可编辑属性使其
13、可编辑SignalseditTextChanged(QString)当文本正被编辑时发出当文本正被编辑时发出属性属性currentText combo box的当前文本的当前文本QComboBoxQTextEdit通用部件通用部件输入部件输入部件编辑编辑整型数据整型数据有许多可选的输入部件有许多可选的输入部件也有许多用于也有许多用于double,time和和date类型的部件类型的部件信号信号valueChanged(int)当数值更新时发出当数值更新时发出属性属性value 当前值当前值maximum 最大值最大值minimum 最小值最小值QSliderQScrollBarQDialQSp
14、inBoxQAbstractSlider通用部件通用部件显示部件显示部件QLabel 部件显示文本或者图片部件显示文本或者图片属性属性text 标签文本标签文本pixmap 显示的图片显示的图片QLCDNumber 用于显示整形数值用于显示整形数值属性属性intValue 显示的数值显示的数值(使用使用display(int)函数进行函数进行设置设置)QLabelQLCDNumberQLabel通用部件通用部件属性属性所有部件有一系列继承自所有部件有一系列继承自QWidget类的共同属性类的共同属性enabled 用户交互可用或不可用用户交互可用或不可用visible 显示或不显示显示或不显示
15、(show 或或hide函数函数)这些属性这些属性同时影响到子部件同时影响到子部件 例如使一个容器部件不可用时:例如使一个容器部件不可用时:QMessageBox信息框是可以显示提示信息,并接受用户按钮输入的一种对话框信息框是可以显示提示信息,并接受用户按钮输入的一种对话框信息框使用方式一:信息框使用方式一:静态函数静态函数StandardButton QMessageBox:warning(QWidget*parent,const QString&title,const QString&text,StandardButtons buttons=Ok,StandardButton defaul
16、tButton=NoButton)Parent:父组件指针:父组件指针Title:标题:标题Text:提示文本:提示文本Buttons:提示框中的按钮,可用或(:提示框中的按钮,可用或(|)运算添加多个按钮)运算添加多个按钮defaultButton:默认选中的按钮:默认选中的按钮类似函数还有类似函数还有QMessageBox:information(),QMessageBox:critical(),QMessageBox:question(),QMessageBox:about(),QMessageBoxint ret=QMessageBox:warning(this,tr(My Appli
17、cation),tr(The document has been modified.n Do you want to save your changes?),QMessageBox:Save|QMessageBox:Discard|QMessageBox:Cancel,QMessageBox:Save);switch(ret)case QMessageBox:Save:/Save was clicked break;case QMessageBox:Discard:/Dont Save was clicked break;case QMessageBox:Cancel:/Cancel was
18、clicked break;default:/should never be reached break;QMessageBox信息框使用方式二:信息框使用方式二:构造函数构造函数QMessageBox:QMessageBox(Icon icon,const QString&title,const QString&text,StandardButtons buttons=NoButton,QWidget*parent=0,Qt:WindowFlags f=Qt:Dialog|Qt:MSWindowsFixedSizeDialogHint)icon:图标,可取值为:图标,可取值为MessageB
19、ox:NoIcon,QMessageBox:Question,QMessageBox:Information,QMessageBox:Warning,QMessageBox:CriticalTitle:标题:标题Text:提示文本:提示文本Buttons:提示框中的按钮,可用或(:提示框中的按钮,可用或(|)运算添加多个按钮)运算添加多个按钮parent:父组件指针:父组件指针F:窗口系统属性:窗口系统属性QMessageBoxQMessageBox message(QMessageBox:NoIcon,tr(My Application),tr(The document has been m
20、odified.n Do you want to save your changes?),QMessageBox:Save|QMessageBox:Discard|QMessageBox:Cancel);switch(message.exec()case QMessageBox:Save:/Save was clicked break;case QMessageBox:Discard:/Dont Save was clicked break;case QMessageBox:Cancel:/Cancel was clicked break;default:/should never be re
21、ached break;部件的尺寸策略尺寸(尺寸(size)的策略)的策略布局布局是在布局管理器和部件间是在布局管理器和部件间进行协调的过程进行协调的过程布局管理器布局管理器提供布局结构提供布局结构水平布局和垂直布局水平布局和垂直布局网格布局网格布局部件则提供部件则提供各个方向上的尺寸策略各个方向上的尺寸策略最大和最小尺寸最大和最小尺寸尺寸的策略尺寸的策略printerList-setSizePolicy(QSizePolicy:Expanding,QSizePolicy:Fixed)尺寸的策略尺寸的策略每一个部件都有一个尺寸大小的示意(每一个部件都有一个尺寸大小的示意(hint),给出水平)
22、,给出水平和垂直方向上的尺寸的策略和垂直方向上的尺寸的策略Fixed 规定了规定了widget的尺寸,固定大小(最严格)的尺寸,固定大小(最严格)Minimum 规定了可能的最小值,可增长规定了可能的最小值,可增长Maximum 规定可能的最大值,可缩小规定可能的最大值,可缩小Preferred 给出最佳值,但不是必须的,可增长可缩给出最佳值,但不是必须的,可增长可缩小小Expanding 同同preferred,但希望增长,但希望增长MinimumExpanding 同同minimum,但希望增长,但希望增长Ignored 忽略规定尺寸,忽略规定尺寸,widget得到尽量大的空间得到尽量大的
23、空间如果如果?2个个 preferred 相邻相邻1个个 preferred,1个个 expanding2个个 expanding 相邻相邻空间不足以放置空间不足以放置widget(fixed)关于尺寸的更多内容关于尺寸的更多内容可用最大和最小属性更好地控制所有部件的大小可用最大和最小属性更好地控制所有部件的大小maximumSize 最大可能尺寸最大可能尺寸minimumSize 最小可能尺寸最小可能尺寸ui-pushButton-setMinimumSize(100,150);ui-pushButton-setMaximumHeight(250);子类化QDialogFind对话框对话框F
24、inddialog.h1.#ifndef FINDDIALOG_H 2.#define FINDDIALOG_H 3.#include 4.class QCheckBox;5.class QLabel;6.class QLineEdit;7.class QPushButton;8.class FindDialog:public QDialog 9.10.Q_OBJECT 11.public:12.FindDialog(QWidget*parent=0);13.signals:14.void findNext(const QString&str,Qt:CaseSensitivity cs);15
25、.void findPrevious(const QString&str,Qt:CaseSensitivity cs);16.private slots:17.void findClicked();18.void enableFindButton(const QString&text);19.private:20.QLabel*label;21.QLineEdit*lineEdit;22.QCheckBox*caseCheckBox;23.QCheckBox*backwardCheckBox;24.QPushButton*findButton;25.QPushButton*closeButto
26、n;26.;27.#endifFinddialog.cpp1.#include 2.#include finddialog.h 3.FindDialog:FindDialog(QWidget*parent)4.:QDialog(parent)5.6.label=new QLabel(tr(Find&what:);7.lineEdit=new QLineEdit;8.label-setBuddy(lineEdit);9.caseCheckBox=new QCheckBox(tr(Match&case);10.backwardCheckBox=new QCheckBox(tr(Search&bac
27、kward);11.findButton=new QPushButton(tr(&Find);12.findButton-setDefault(true);13.findButton-setEnabled(false);14.closeButton=new QPushButton(tr(Close);15.connect(lineEdit,SIGNAL(textChanged(const QString&),16.this,SLOT(enableFindButton(const QString&);17.connect(findButton,SIGNAL(clicked(),18.this,S
28、LOT(findClicked();19.connect(closeButton,SIGNAL(clicked(),20.this,SLOT(close();21.QHBoxLayout*topLeftLayout=new QHBoxLayout;22.topLeftLayout-addWidget(label);23.topLeftLayout-addWidget(lineEdit);24.QVBoxLayout*leftLayout=new QVBoxLayout;25.leftLayout-addLayout(topLeftLayout);26.leftLayout-addWidget(
29、caseCheckBox);27.leftLayout-addWidget(backwardCheckBox);28.QVBoxLayout*rightLayout=new QVBoxLayout;29.rightLayout-addWidget(findButton);30.rightLayout-addWidget(closeButton);31.rightLayout-addStretch();32.QHBoxLayout*mainLayout=new QHBoxLayout;33.mainLayout-addLayout(leftLayout);34.mainLayout-addLay
30、out(rightLayout);35.setLayout(mainLayout);36.setWindowTitle(tr(Find);37.setFixedHeight(sizeHint().height();38.Find对话框的窗体布局对话框的窗体布局布局管理器的父子层次关系布局管理器的父子层次关系find对话框中所用到的槽对话框中所用到的槽39.void FindDialog:findClicked()40.41.QString text=lineEdit-text();42.Qt:CaseSensitivity cs=43.caseCheckBox-isChecked()?Qt:C
31、aseSensitive44.:Qt:CaseInsensitive;45.if(backwardCheckBox-isChecked()46.emit findPrevious(text,cs);47.else 48.emit findNext(text,cs);49.50.51.void FindDialog:enableFindButton(const QString&text)52.53.findButton-setEnabled(!text.isEmpty();54.创建创建main.cpp来测试这些文件来测试这些文件1.#include 2.#include finddialog.
32、h3.int main(int argc,char*argv)4.5.QApplication app(argc,argv);6.FindDialog*dialog=new FindDialog;7.dialog-show();8.return app.exec();9.Qt DesignerQt DesignerQt应用程序除了使用手工编写代码的方式外,还可以用应用程序除了使用手工编写代码的方式外,还可以用过过Qt Desinger来完成来完成Qt Designer曾是一个独立的曾是一个独立的Qt桌面工具,现在集成于桌面工具,现在集成于Qt Creator中中只需要拖动相应的控件只需要拖动相
33、应的控件输出为输出为.ui文件,内容其实就是文件,内容其实就是XMLUic编译器把编译器把.ui 文件转换成文件转换成.h文件文件myproject.ui-ui_myproject.h设计器介绍设计器介绍sources*.cppexecutablesobject files*.oheaders*.hgeneratedmoc_*.cppuser interfaces*.uiincludescompileslinkscompilesmocs设计器介绍设计器介绍sources*.cppexecutablesobject files*.oheaders*.hgeneratedmoc_*.cppgene
34、ratedui_*.huser interfaces*.uiincludescompileslinkscompilesmocsuic使用代码使用代码#ifndef WIDGET_H#define WIDGET_H#include namespace Ui class Widget;class Widget:public QWidget Q_OBJECTpublic:Widget(QWidget*parent=0);Widget();private:Ui:Widget*ui;#endif/WIDGET_HUi:Widget类的类的前置声明前置声明一个一个 Ui:Widget 类指针类指针ui,指
35、向所有部件指向所有部件基本上是一个标基本上是一个标准的准的 QWidget 派生类派生类使用代码使用代码#include widget.h#include ui_widget.hWidget:Widget(QWidget*parent):QWidget(parent),ui(new Ui:Widget)ui-setupUi(this);Widget:Widget()delete ui;实例化类实例化类Ui:Widget 为为 ui删除删除 ui对象对象调用函数调用函数 setupUi,生成所生成所有父窗体有父窗体(this)的的子窗体部件子窗体部件使用设计器使用设计器基本工作流程基本工作流程粗
36、略地放置部件在窗体上粗略地放置部件在窗体上从里到外进行布局,添加必要的弹簧从里到外进行布局,添加必要的弹簧进行信号连接进行信号连接在代码中使用在代码中使用在整个过程中不断修改编辑属性在整个过程中不断修改编辑属性实践创造完美实践创造完美!使用设计器使用设计器在代码中使用在代码中使用通过通过ui类成员使用访问其所有子部件类成员使用访问其所有子部件classWidget:publicQWidget.private:Ui:Widget*ui;voidWidget:memberFunction()ui-pushButton-setText(.);54快速设计对话框快速设计对话框Qt设计师的界面设计师的界
37、面直接拖放所需要的部件直接拖放所需要的部件为窗体设置一些属性为窗体设置一些属性带布局的窗体带布局的窗体设置窗体的设置窗体的Tab建顺序建顺序保存和使用窗体保存和使用窗体把对话框保存到把对话框保存到gotocell目录下,另存为目录下,另存为gotocelldialog.ui,然后使用一个文本编辑器在同,然后使用一个文本编辑器在同意目录下创建一个意目录下创建一个main.cpp接下来运行接下来运行qmake生成生成pro文件,文件,qmake会自动加会自动加入入ui文件在工程中文件在工程中Qmake非常智能,它会自动生成适当的非常智能,它会自动生成适当的makefile规则来调用规则来调用Qt用
38、户界面编译器(用户界面编译器(uic)Uic工具会将工具会将ui文件转化为文件转化为*.h文件以供调用文件以供调用Main.cpp1.#include 2.#include 3.#include ui_gotocelldialog.h4.int main(int argc,char*argv)5.6.QApplication app(argc,argv);7.Ui:GoToCellDialog ui;8.QDialog*dialog=new QDialog;9.ui.setupUi(dialog);10.dialog-show();11.return app.exec();12.Uic生成的对
39、话框文件生成的对话框文件1.class Ui:GoToCellDialog2.3.public:4.QLabel*label;5.QLineEdit*lineEdit;6.QSpacerItem*spacerItem;7.QPushButton*okButton;8.QPushButton*cancelButton;9.10.void setupUi(QWidget*widget)11.12.13.;改变形状的对话框改变形状的对话框我们已看到了如何创建对话框,但是这些对话框我们已看到了如何创建对话框,但是这些对话框永远只会显示一些相同的窗口部件。在某些情况永远只会显示一些相同的窗口部件。在某些
40、情况下,人们非常希望能够有一些可以变形的对话框下,人们非常希望能够有一些可以变形的对话框最常见的变形对话框有两种:最常见的变形对话框有两种:拓展对话框拓展对话框多页对话框多页对话框拓展对话框的例子拓展对话框的例子不带布局的群组框不带布局的群组框带布局的群组框带布局的群组框把窗体的各个子对象摆放到网格中把窗体的各个子对象摆放到网格中布局前布局前布局后布局后重新命名窗体中的各个部件重新命名窗体中的各个部件连接窗体的信号和槽连接窗体的信号和槽槽选项对话框槽选项对话框动态对话框动态对话框动态对话框就是在程序运行时候使用的从动态对话框就是在程序运行时候使用的从Qt设计设计师的。师的。Ui文件创建而来的那
41、些对话框。文件创建而来的那些对话框。动态对话框不需要通过动态对话框不需要通过uic把把Ui文件转换成文件转换成c+代代码,相反,它是在程序运行的时候使用码,相反,它是在程序运行的时候使用QuiLoader类载入该文件的类载入该文件的QUiLoader类载入该文件,就像下面这类载入该文件,就像下面这种方式种方式1.QUiLoader uiLoader;2.QFile file(sortdialog.ui);3.QWidget*sortDialog=uiLoader.load(&file);4.if(sortDialog)5.6.7.QComboBox*primaryColumnCombo=8.sortDialog-findChild(primaryColumnCombo);9.if(primaryColumnCombo)10.11.常用内置的窗口部件类和对话框类常用内置的窗口部件类和对话框类单页容器部件单页容器部件多页容器部件多页容器部件项视图窗口部件项视图窗口部件Qt的显示部件的显示部件QT的输入窗口部件的输入窗口部件QT的反馈对话框的反馈对话框QT的的Qwizard对话框对话框谢谢!
限制150内