对话框与多窗体设计

对话框与多窗体设计

本章介绍对话框和多窗体设计,调用方式,数据传递等问题

  • Qt提供的标准对话框的式样
  • 自定义对话框的设计和调用
  • 在一个应用程序中如何设计多种窗体,基于QDialog, QWidget, QMainWindow创建的窗体的调用方式
  • 创建一个在多页组件中管理的多窗体应用,子窗体与主窗体的交互
  • 创建MDI程序
  • 创建带启动界面和登录界面窗体,保存和读取应用参数

标准对话框

概述

对话框常用静态函数功能
QFileDialogQString getOpenFileName(…)选择打开一个文件
QStringList getOpenFilleNames(…)选择打开多个文件
QString getSaveFileName(…)选择保存一个文件
QString getExistingDirectory(…)选择一个已有的目录
QUrl getOpenFileUrl(…)选择打开一个文件,可选择远程网络文件
QColorDialogQColor getColor(…)选择颜色
QFontDialogQFont getFont(…)选择字体
QInputDialogQString getText(…)输入单行文字
int getInt(…)输入整数
double getDouble(…)输入浮点数
QString getItem(…)从一个下拉列表框中选择输入
QString getMultiLineText(…)输入多行字符串
QMessageBoxStandardButton information(…)信息提示对话框
StandardButton question(…)询问并获取是否确认的对话框
StandardButton warning(…)警告信息提示对话框
StandardButton critical(…)错误信息提示对话框
void about(…)设置自定义信息的关于对话框
void aboutQt(…)关于Qt的对话框

QFileDialog

选择打开一个文件

QString,QDir支持QString currentPath()
QFileDialog支持QString getOpenFileName(...)
参数,三组
每组间用两个分号隔开
同一组内不同后缀间用空格隔开
返回的是完整文件名[含路径],取消选择时,返回字符串为空.

选择打开多个文件

QFileDialog支持QStringList getOpenFileNames(...)
返回一个字符串列表,列表的每一行是选择的一个文件

选择已有目录

QFileDialog支持QString getExistingDirectory(...)
参数为一个选项,一般为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(...)
参数QLineEdit::EchoMode

输入整数

QInputDialog支持int getInt(...)
参数为整数调节单位

QPlainTextEdit支持QFont font(),void setFont(...)
QFont支持int pointSize(),void setPointSize(...)

输入浮点数

QInputDialog支持float getDouble(...)
参数为小数点位数
QString支持QString asprintf(...)

下拉列表选择输入

QStringList支持QStringList& operator<<(...),QInputDialog,QString getItem(...)
参数表示显示行是否可编辑

QPlainTextEdit支持void appendPlainText(...)

QMessageBox

简单信息提示

QMessageBox支持StandardButton warning(...)
参数来设置对话框提供的按钮
参数设置缺省选择的按钮
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设计器可视化地设计对话框

对话框的调用一般包括创建对话框,传递数据给对话框,显示对话框获取输入,判断对话框单击按钮的返回类型,获取对话框输入数据等
主窗口采用QTabViewQStandardItemModel,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直接派生了QWidgetQWindow
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可视化设计的窗体
  • QWDialogSizeQWDialogHeaders
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简介

QtMDI应用程序提供了支持
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对象时,需传递organizationappName
注册表参数以"键-键值"来保存

字符串加密

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()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

raindayinrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值