对话框与多窗体设计
本章介绍对话框和多窗体设计,调用方式,数据传递等问题
Qt
提供的标准对话框的式样- 自定义对话框的设计和调用
- 在一个应用程序中如何设计多种窗体,基于
QDialog, QWidget, QMainWindow
创建的窗体的调用方式 - 创建一个在多页组件中管理的多窗体应用,子窗体与主窗体的交互
- 创建
MDI
程序 - 创建带启动界面和登录界面窗体,保存和读取应用参数
标准对话框
概述
对话框 | 常用静态函数 | 功能 |
---|---|---|
QFileDialog | QString getOpenFileName(…) | 选择打开一个文件 |
QStringList getOpenFilleNames(…) | 选择打开多个文件 | |
QString getSaveFileName(…) | 选择保存一个文件 | |
QString getExistingDirectory(…) | 选择一个已有的目录 | |
QUrl getOpenFileUrl(…) | 选择打开一个文件,可选择远程网络文件 | |
QColorDialog | QColor getColor(…) | 选择颜色 |
QFontDialog | QFont getFont(…) | 选择字体 |
QInputDialog | QString getText(…) | 输入单行文字 |
int getInt(…) | 输入整数 | |
double getDouble(…) | 输入浮点数 | |
QString getItem(…) | 从一个下拉列表框中选择输入 | |
QString getMultiLineText(…) | 输入多行字符串 | |
QMessageBox | StandardButton information(…) | 信息提示对话框 |
StandardButton question(…) | 询问并获取是否确认的对话框 | |
StandardButton warning(…) | 警告信息提示对话框 | |
StandardButton critical(…) | 错误信息提示对话框 | |
void about(…) | 设置自定义信息的关于对话框 | |
void aboutQt(…) | 关于Qt的对话框 |
QFileDialog
选择打开一个文件
对QString,QDir
支持QString currentPath()
对QFileDialog
支持QString getOpenFileName(...)
参数4
,三组
每组间用两个分号隔开
同一组内不同后缀间用空格隔开
返回的是完整文件名[含路径],取消选择时,返回字符串为空.
选择打开多个文件
对QFileDialog
支持QStringList getOpenFileNames(...)
返回一个字符串列表,列表的每一行是选择的一个文件
选择已有目录
对QFileDialog
支持QString getExistingDirectory(...)
参数4
为一个选项,一般为QFileDialog::ShowDirsOnly
返回值是选择的目录名称字符串
QCoreApplication::applicationDirPath(...)
返回应用程序可执行文件所在的目录
选择保存文件名
对QFileDialog
支持QString getSaveFileName(...)
若选择的是一个已经存在的文件,会提示是否覆盖现有的文件,
如提示覆盖,则返回为选择的文件
对文件的删除操作需在选择文件后编码实现
QColorDialog
选择颜色对话框
对QColorDialog
支持QColor getColor(...)
对QPalette
支持QColor color(...),void setColor(...)
对QPlainTextEdit
支持QPalette palette(),void setPalette(...)
对QColor
支持bool isValid()
QFontDialog
对QPlainTextEdit
支持QFont font(),void setFont(...)
对QFontDialog
支持QFont getFont(...)
QInputDialog
输入文件
对QInputDialog
支持QString getText(...)
参数4
为QLineEdit::EchoMode
输入整数
对QInputDialog
支持int getInt(...)
参数7
为整数调节单位
对QPlainTextEdit
支持QFont font(),void setFont(...)
对QFont
支持int pointSize(),void setPointSize(...)
输入浮点数
对QInputDialog
支持float getDouble(...)
参数7
为小数点位数
对QString
支持QString asprintf(...)
下拉列表选择输入
对QStringList
支持QStringList& operator<<(...),QInputDialog,QString getItem(...)
参数6
表示显示行是否可编辑
对QPlainTextEdit
支持void appendPlainText(...)
QMessageBox
简单信息提示
对QMessageBox
支持StandardButton warning(...)
参数4
来设置对话框提供的按钮
参数5
设置缺省选择的按钮
StandardButton
是各种按钮的定义,如QMessageBox::OK, QMessageBox::Yes, QMessageBox::No, QMessageBox::Cancel
等
如:void information(...),void warning(...),void critical(...),void about(...)
确认选择对话框
对QMessageBox
支持StandardButton question(...)
对StandardButtons(Yes | No | ...)
自定义对话框及其调用
对话框的不同调用方式
自定义对话框的设计一般从QDialog
继承
且可采用UI
设计器可视化地设计对话框
对话框的调用一般包括创建对话框,传递数据给对话框,显示对话框获取输入,判断对话框单击按钮的返回类型,获取对话框输入数据等
主窗口采用QTabView
和QStandardItemModel,QItemSelectionModel
- 设置表格行列数对话框
模态对话框 - 设置标题标题对话框
以模态方式显示,关闭后只隐藏,不删除 - 单元格定位与文字设置对话框
非模态对话框
可与主窗口交互
对话框QWDialogSize的创建和使用
创建对话框QWDialogSize
File-->New File or Project-->Qt Designer From Class
创建可视化设计的对话框类
窗口模板为Dialog without Buttons
设置自定义对话框的类名
QWDialogSize
对话框的界面设计在UI
设计器进行
对话框的调用和返回值
设计QWDialogSize
对话框界面时,上面放置放置QPushButton
按钮
将按钮clicked()
信号与槽关联[对话框的槽有accept()/reject()
]
对话框的accept()
,会关闭对话框,返回QDialog::Accepted
作为exec()
函数的返回值[默认下,对话框只隐藏,不删除]
对话框的reject()
,会关闭对话框,返回QDialog::Rejected
作为exec()
函数的返回值
主窗口的设置行数列数工具栏按钮的响应代码,
用于创建,显示对话框,
读取对话框上设置的行数,列数
对QDialog
支持Qt::WindowFlags windowFlags(),void setWindowFlags(...)
new QDialog(...)
// 以模态显示的方式显示对话框
// 用户只能在对话框上操作,主程序在此等待exec函数的返回结果
int exec();
用new
分配的对话框对象,使用完毕,需用delete
删除对话框对象,释放内存
对话框QWDialogHeaders的创建和使用
对话框的生存期
指它从创建到删除的存续区间
QWDialogHeaders的定义和实现
QWDialogHeaders对话框的使用
对QStringList
支持int count(),void append(...)
对QStandardItemModel
支持int columnCount(),QVariant headerData(...),void setHorizontalHeaderLabels(...)
对QVariant
支持QString toString()
对QDialog
:
new QDialog(...)
// 以模态方式显示对话框窗口
int exec()
对话框QWDialogLocate的创建与使用
非模态对话框
QDialog::exec()
用模态方式显示对话框,模态显示的对话框不允许鼠标再去单击其他窗口,直到对话框退出
使用QDialog::show()
,能以非模态方式显示对话框
对话框类QWDialogLocate
有如下功能
- 主窗口每次调用此对话框时,创建此对话框对象,以
StayOnTop
方式显示,对话框关闭时,自动删除 - 在对话框中可操作主窗口
- 在主窗口操作时,对话框相应更新以反映操作
- 主窗口上某按钮用于调用对话框,调用后,按钮禁用,对话框关闭时,按钮使能
对话框的创建与调用
对QDialog
// Qt::WA_DeleteOnClose 窗口关闭时,自动删除对话框对象
void setAttribute(...)
Qt::WindowFlags windowFlags()
void setWindowFlags(...)
// 以非模态方式显示对话框
void show()
对QItemSelectionModel
支持QModelIndex currentIndex()
对QModelIndex
支持bool isValid()
对话框中操作主窗口
对QDialog
支持QWidget* parentWidget()
对QStandardItemModel
支持QModelIndex index(...),void setData(...)
对QItemSelectionModel
支持void clearSelection(),void setCurrentIndex(...)
主窗口中操作对话框
窗口的CloseEvent事件
对话框关闭时,将主窗口的actTab_Locate
重新设置为使能
将主窗口的指向对话框的指针dlgLocate
重新设为NULL
事件是由窗口系统产生了由某些操作触发的特殊函数:如鼠标操作,键盘操作,窗口显示,关闭,绘制,...
从QWidget
继承的窗口部件常用的事件函数有
closeEvent()
窗口关闭时触发showEvent()
窗口显示时触发paintEvent()
窗口绘制时触发mouseMoveEvent()
鼠标移动mousePressEvent()
鼠标按下mouseReleaseEvent()
鼠标释放keyPressEvent()
键盘按键按下keyReleaseEvent()
键盘按键释放
直接在需要对事件处理时,重载类的事件函数即可
利用信号-槽实现交互操作
前面设计QWDialogLocate
对话框与主窗口间的交互采用互相引用的方式
另外一种实现方式是利用Qt
的信号与槽机制,设计相应的信号和槽,将信号与槽关联起来,在进行某个操作时发射信号,槽函数自动响应
对QStandardItemModel
支持QModelIndex index(...),void setData(...)
对QItemSelectionModel
支持void clearSelection(),void setCurrentIndex(...)
发射信号:
在类定义头文件
signals:
信号函数声明
在发射信号处
emit 信号函数调用;
定义信号:
在类定义头文件
权限修饰 slots:
槽函数声明
在类的cpp
槽函数定义
在合适地方建立信号与槽的关联,一般在对象初始化处
多窗体应用程序设计
主要的窗体类及其用途
常见的窗体基类是QWidget, QDialog, QMainWindow
创建GUI
应用程序时选择窗体基类就是从这3个类中选择
QObject
直接派生了QWidget
和QWindow
QWidget
直接派生了QDialog, QMainWindow, QSplashScreen, QMidSubWindow, QDesktopWidget
这些窗体类的主要特点和用途
QWidget
没有指定父容器时,可作为独立的窗口
指定父容器后可作为容器的内部组件QDialog
用于设计对话框,以独立窗口显示QMainWindow
用于设计带有菜单栏,工具栏,状态栏的主窗口,一般以独立窗口显示QSplashScreen
用作应用程序启动时的splash窗口,没有边框QMidSubWindow
用于为QMidArea
提供一个子窗体,用于MDI
[多文档]应用程序的设计QDesktopWidget
具有多个显卡和多个显示器的系统有多个桌面,
这个类型提供用户桌面信息,如屏幕个数,每个屏幕大小等QWindow
通过底层的窗口系统表示一个窗口的类
一般作为一个父容器的嵌入式窗体,不作为独立窗体
窗体类重要特性的设置
窗体显示或运行的一些特性可通过QWidget
的一些函数设置
对QDialog
支持void setAttribute(...),Qt::WindowFlags windowFlags(),void setWindowFlags(...)
QWidget
类中用于窗体属性设置的几个主要函数的功能
setAttribute
对QWidget
// Qt::WidgetAttribute
void setAttribute(...)
枚举类型Qt::WidgetAttribute定义了窗体的一些属性,可打开或关闭这些属性
枚举类型Qt::WidgetAttribute常用的常量及其意义
Qt::WidgetAttribute常用常量
Qt::WA_AcceptDrops 允许窗体接收拖放来的组件
Qt::WA_DeleteOnClose 窗体关闭时删除自己,释放内存
Qt::WA_Hover 鼠标进入或移出窗体时产生paint事件
Qt::WA_AcceptTouchEvents 窗体是否接受触屏事件
setWindowFlags
对QWidget
// Qt::WindowFlags是枚举类型Qt::WindowType的值的组合,用于同时设置多个标记
void setWindowFlags(...)
// Qt::WindowType用于一次设置一个标记
void setWindowFlag(...)
枚举类型Qt::WindowType常用的值
表示窗体类型的常量
类型 | 描述 |
---|---|
Qt::Widget | 这是QWidget类的缺省类型.这种类型的窗体,如有父窗体,就作为父窗体的子窗体否则,作为一个独立的窗口 |
Qt::Window | 这个窗体是一个窗口,有窗口的边框,标题栏,不管它是否有父窗体 |
Qt::Dialog | 表明这个窗体是一个窗口且要显示为对话框是QDialog类的缺省类型 |
Qt::Popup | 表明这个窗体是用作弹出式菜单的窗体 |
Qt::Tool | 表明这个窗体是工具窗体,有更小的标题栏和关闭按钮,通常作为工具栏的窗体 |
Qt::ToolTip | 表明这是用于Tooltip消息提示的窗体 |
Qt::SplashScreen | 表明窗体是splash屏幕,QSplashScreen类的缺省类型 |
Qt::Desktop | 表明窗体是桌面,是QDesktopWidget类的类型 |
Qt::SubWindow | 表明窗体是子窗体,如QMdiSubWindow就是这种类型.控制窗体显示效果的常量 |
Qt::MSWindowsFixedSizeDialogHint | 在Windows平台上,使窗口有更窄的边框,用于固定大小对话框 |
Qt::FramelessWindowHint | 创建无边框窗口 |
定制窗体外观的变量,要定义窗体外观,要先设置Qt::CustomizeWindowHint
类别 | 描述 |
---|---|
Qt::CustomizeWindowHint | 关闭缺省的窗口标题栏 |
Qt::WindowTitleHint | 窗口有标题栏 |
Qt::WindowSystemMenuHint | 有窗口系统菜单 |
Qt::WindowMinimizeButtonHint | 有最小化按钮 |
Qt::WindowMaximizeButtonHint | 有最大化按钮 |
Qt::WindowMinMaxButtonsHint | 有最小化,最大化按钮 |
Qt::WindowCloseButtonHint | 有关闭按钮 |
Qt::WindowContextHelpButtonHint | 有上下文帮助按钮 |
Qt::WindowStaysOnTopHint | 窗口总是处于最上层 |
Qt::WindowStaysOnBottomHint | 窗口总是处于最下层 |
Qt::WindowTransparentForInput | 窗口只作为输出,不接受输入 |
Qt::Widget, Qt::Window
等表示窗体类型的常量可使窗体有缺省的外观设置
如设置为Qt::Dialog
类型,则窗体具有对话框等缺省外观
setWindowState
对QWidget
// Qt::WindowStates
void setWindowState(...)
枚举类型Qt::WindowState
表示了窗体的状态,取值见下:
类别 | 描述 |
---|---|
Qt::WindowNoState | 正常状态 |
Qt::WindowMinimized | 窗口最小化 |
Qt::WindowMaximized | 窗口最大化 |
Qt::WindowFullScreen | 窗口填充整个屏幕,且没有边框 |
Qt::WindowActive | 变为活动的窗口,例如可接收键盘输入 |
setWindowModality
setWindowModality
用于设置窗口的模态
QWidget
// Qt::WindowModality
void setWindowModality(...)
Qt::WindowModality
的常量:
(1). Qt::NonModal
无模态,不会阻止其他窗口的输入
(2). Qt::WindowModal
窗口对于其父窗口,所有的上级父窗口都是模态的
(3). Qt::ApplicationModal
窗口对整个应用程序是模态的,阻止所有窗口的输入
setWindowOpacity
设置窗口的透明度
QWidget
// qreal 1.0为完全不透明,0.0为完全透明
void setWindowOpacity(...)
多窗口应用程序设计
主窗口设计
对QMainWindow
支持void setCentralWidget(...),void setWindowState(...),void paintEvent(QPaintEvent*)
对QPainter
支持void drawPixmap(...)
对QPixmap
支持new QPixmap(...)
对QTabWidget
支持void setVisible(...),void clear(),void setTabsClosable()
QFormDoc
继承于QWidget
可视化设计的窗体QFormTable
继承于QMainWindow
可视化设计的窗体QWDialogSize
和QWDialogHeaders
QFormDoc类设计
对File->New File or Project-->Qt Designer Form Class
对QToolBar
支持void addAction(...),void addSeparator(...),void setToolButtonStyle(...)
对QVBoxLayout
支持new QVBoxLayout(),void addWidget(...),void setContentsMargins(...),void setSpacing(...)
对QWidget
支持void setLayout(...)
QFormDoc类的使用
对QWidget
支持void setAttribute(...),void setWindowTitle(...),void setWindowFlag(...),void setWindowOpacity(...),void setWindowModality(...),void show()
对QTabWidget
支持void addTab(...),void setCurrentIndex(...),void setVisible(...)
对QString
支持QString asprintf(...)
父亲窗口关闭时,所有子窗口自动关闭和删除
QFormTable类的设计
如:QMainWindow,QStandardItemModel,QTableView
QFormTable类的使用
计算是从QMainWindow
继承的窗口类,也可在其他界面组件里嵌入式显示
QTabWidget类的控制
QTabWidget
的两个信号
(1). tabCloseRequested(...)
,在单击分页的关闭图标时发射
(2). currentChanged(...)
,删除一个分页或切换页面时,会发射
对QTabWidget
支持QWidget* widget(...),int count(),void setVisible(...)
对QWidget
支持void close()
MDI应用程序设计
MDI简介
Qt
为MDI
应用程序提供了支持
MDI
即为在主窗口里创建多个同类型的MDI
子窗口
这些MDI
子窗口在主窗口里显示,共享主窗口的工具栏,菜单等操作功能
主窗口上的操作都针对当前活动的MDI
子窗口进行
设计MDI
应用程序需在主窗口工作区放置一个QMdiArea
作为子窗体的容器
文档窗口类QFormDoc的设计
以可视化方式创建一个基于QWidget
的类QFormDoc
对QFile
支持bool open(...),void close()
对QTextStream
支持new QTextStream(...),? readAll()
对QFileInfo
支持QString filename()
对QPlainTextEdit
支持void clear(),void setPlainText(...),QFont font(),void setFont(...),void cut(),void copy(),void paste()
对QFontDialog
支持QFont getFont(...)
作为MDI
子窗口,不管其是否设置为关闭时删除
在主窗口里关闭一个MDI
子窗口时,会删除子窗口对象
MDI主窗口设计与子窗口的使用
主窗口界面设计
要在主窗口实现MDI
功能
只需在主窗口的工作区放置一个QMdiArea
组件
对QMainWindow
支持void setCentralWidget(...)
对QToolBar
支持void setToolButtonStyle(...)
MDI子窗口的创建与加入
对QMdiArea
支持void addSubWindow(...),? subWindowList(),? activeSubWindow()
对QDir
支持QString currentPath()
对QFileDialog
支持QString getOpenFileName(...)
对QString
支持bool isEmpty()
对QWidget
支持void setEnabled(...)
QMdiArea常用功能函数
对QMidArea
支持void cascadeSubWindows(),void tileSubWindows(),void closeAllSubWindows(),void setViewMode(...),void setTabsClosable(...)
MDI
视图模式用setViewMode
QMdiArea::SubWindowView
传统子窗口模式QMidArea::TabbedView
是多页显示模式,类似QTabView
MDI的信号
QMdiArea
有一个信号subWindowActivated(QMdiSubWindow*)
,在当前活动窗口切换时发射
用此信号可在活动窗口切换时进行一些处理
Splash与登录窗口
QSplashScreen
,提供了载入图片,自动设置窗口无边框效果等功能
Splash
窗口和登录界面实质都是对话框
在程序启动时,显示
- 如何实现
Splash
特点的无边框对话框 - 如何设计用鼠标拖动无边框的对话框
- 如何使用
QSettings
类存储用户名,密码等信息 - 如何用
QCryptographicHash
类进行字符串加密 - 如何根据登录输入状况确定启动主窗口或终止程序运行
对话框界面设计和类设计
采用新建Qt Designer Form Class
的方法创建启动登录对话框,从QDialog
继承而来
对QPoint,QString
支持void mousePressEvent(QMouseEvent*),void mouseMoveEvent(QMouseEvent*),void mouseReleaseEvent(QMouseEvent*)
QDlgLogin类功能实现
构造函数里的初始化
对QLineEdit
支持void setEchoMode(...)
对QDialog
支持void setWindowFlags(...)
应用程序设置的存储
对QSettings
支持QVarient value(...),void setValue(...)
对QVarient
支持bool toBool(),QString toString()
创建QSettings
对象时,需传递organization
和appName
注册表参数以"键-键值"
来保存
字符串加密
QCryptographicHash
只提供了加密功能,没提供解密功能
对QCryptographicHash
支持QCryptographicHash(...),void addData(...),QByteArray result()
对QByteArray
支持void append(...),QString toHex()
用户名和密码输入判断
对QLineEdit
支持QString text()
对QString
支持QString trimmed()
窗口拖动功能的实现
对QMouseEvent
支持? button(),QPoint globalPos()
对QPoint
支持? manhattanLength()
Splash登录窗口的使用
对QDialog
支持? exec()