精华内容
下载资源
问答
  • 对话框模式和mdi模式
    千次阅读
    2017-03-12 22:21:38

    MDI程序和SDI程序的主要不同前者支持多个文档、多个文档类型。

    区别如下:

    1.MDI允许用户同时打开多个文档,SDI只能打开一个文档。

    2.MDI可支持多种文档类型,如word不仅支持.doc文件,同时可打开web页面文件.html。

    3.MDI通常包含一个windows菜单,可用来切换显示不同文档。

    4.SDI仅有一个框架窗口,而MDI有两个:一个是顶层框架窗口,一个是文档窗口。后者用来包含打开文档的视图。

    5.SDI通常仅有一个菜单,而MDI通常有两个,一个在没有文档打开时显示,一个在有文档打开时显示。

    结构上的区别:

    1.MDI程序的框架窗口从CMDIFrameWnd类派生,而SDI程序框架窗口从CFrameWnd类中派生。

    2.MDI程序包含文档窗口视图的子窗口由CMDIChildWnd派生,而SDI程序无子框架窗口。

    3.MDI程序和SDI程序的文档模板类不同。MDI程序中使用CMultDocTemplate类对象,而SDI程序使用CSingleDocTemplate类对象。

    4.MDI程序至少含有两个菜单资源,而SDI程序只有一个。


    更多相关内容
  • 2、对话框种类分类:模式对话框和模式对话框; 3、对话框启动参与的消息包括:WM_CREATEWM_INITDIALOG等; 4、对话框启动参与的消息包括:WM_SYSCOMMAND、WM_CLOSE、OnCancel回调函数以及WM_DESTROY等等;
  • 例如:记事本画笔等。2、MDI(Multiple Document Interface):多文档界面,一个主框架窗口下可以同时编辑多份文档。例如:VC++6.0,Photoshop等软件。3、基于对话框的软件模型:主窗口是通过...

    一、根据主窗口类型,MFC软件工程可以分为以下几种架构模型:

    1、SDI(Single Document Interface):单文档界面,一个主框架窗口下只能编辑一份文档。

    例如:记事本和画笔等。
    2、MDI(Multiple Document Interface):多文档界面,一个主框架窗口下可以同时编辑多份文档。
    例如:VC++6.0,Photoshop等软件。
    3、基于对话框的软件模型:主窗口是通过资源管理器,在对话框模板内摆放控件编辑而成的。
    多数用于开发小规模软件,例如:任务管理器。
    4、其他自定义窗口做主窗口:主窗口既不是框架也不是对话框,而是直接开发通用窗口类CWnd而成。

    例如:输入法窗口、QQ和360软件等,有时这类软件也都可以使用框架或对话框模式来代替开发而成。

    对话框主要分为两个类型:模式对话框和非模式对话框。当模式对话框弹出后,无法操作它的父窗口或者上一级窗口,直到关闭该对话框为止。例如:大部分软件的“关于…”对话框,都是属于模式对话框。当非模式对话框弹出后,不影响对它的父窗口或者上一级窗口的操作。例如:QQ的聊天框或者编辑软件中的文字查找对话框等等。
    1、模式对话框的特点是:
    a)在关闭模式对话框前,无法操作背景窗口,除非自身就是主窗口;
    b)使用CDialog::DoModal函数弹出模式对话框,该函数执行过程是阻塞函数; 
    c)因此在栈内或者堆内申请对话框类的对象都可以的,申请栈内变量开发和运行效率高一些。
    2、非模式对话框的特点是:
    a)在非模式对话框运行时可以操作背景窗口;

    b)使用CDialog::Create函数和CWnd::ShowWindow弹出模式对话框,该函数执行过程是非阻塞函数; 

    c)不能在栈内或者堆内申请对话框类的临时对象,需要申请堆内变量或者使用全局变量、成员变量等生命期较长的对象。

    类结构图:


    模式对话框效果图:


    非模式对话框效果图:


    我在主对话框上面设置了两个button,分别弹出模式对话框和非模式对话框。

    代码实现:

    void CMFCDlg::OnButton1() 
    {
    	//模式对话框:在栈内生成一个临时变量,阻塞型对话框。DoModal产生的对话框,不能操作对话框后面的对话框
    	CAboutDlg dlg;
    	dlg.DoModal();
    }
    
    void CMFCDlg::OnButton2() 
    {
    	//非模式对话框:必须在堆内申请对象、或者在成员变量内申请对象
    	CChatDlg* pDlg = new CChatDlg;
    	//pDlg->Create(IDD_CHAT_DLG);//父窗口是m_pMainWnd所指定的对象
    	pDlg->Create(IDD_CHAT_DLG, GetDesktopWindow());//不依赖与其他窗口,独立的窗口
    	pDlg->ShowWindow(SW_SHOW);
    }

    展开全文
  • 演示了在内存中具有随机访问权限的标准DBF文件的读取,写入创建过程,而不是对虚拟模式下CListCtrl类的后代的典型MFC应用程序进行序列化。
  • 想在一个formview里弹出一个非模式对话框时没...我想达到的目的就是弹出非模式对话框要随formveiew移动关闭,不能移动出formview外! [img=https://img-bbs.csdn.net/upload/201602/23/1456185625_136509.png][/img]
  • 对话框与多窗体设计

    2020-09-15 17:03:37
    本章介绍对话框和多窗体设计,调用方式,数据传递等问题 - Qt提供的标准对话框的式样 - 自定义对话框的设计调用 - 在一个应用程序中如何设计多种窗体,基于QDialog, QWidget, QMainWindow创建的窗体的调用方式 - ...

    对话框与多窗体设计

    本章介绍对话框和多窗体设计,调用方式,数据传递等问题
    - 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()
    // Qt::MSWindowsFixedSizeDialogHint
    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的常量
    	Qt::NonModal									无模态,不会阻止其他窗口的输入
    	Qt::WindowModal									窗口对于其父窗口,
    													所有的上级父窗口都是模态的
    	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的两个信号
    tabCloseRequested(...),在单击分页的关闭图标时发射
    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
    // QLineEdit::Password
    void setEchoMode(...)	
    
    QDialog
    // Qt::SplashScreen
    // Qt::FramelessWindowHint
    void setWindowFlags(...)
    

    应用程序设置的存储

    QSettings
    QVarient value(...)
    void setValue(...)
    
    QVarient
    bool toBool()
    QString toString()
    
    创建QSettings对象时,需传递organization和appName
    注册表参数以"键-键值"来保存
    

    字符串加密

    QCryptographicHash只提供了加密功能,没提供解密功能
    QCryptographicHash
    // QCryptographicHash::Md5
    QCryptographicHash(...)
    void addData(...)
    QByteArray result()
    
    QByteArray
    void append(...)
    QString toHex()
    

    用户名和密码输入判断

    QLineEdit
    QString text()
    
    QString
    QString trimmed()
    

    窗口拖动功能的实现

    QMouseEvent
    // Qt::LeftButton
    ? button()
    QPoint globalPos()
    
    QPoint
    // QApplication::startDragDistance
    ? manhattanLength()
    

    Splash登录窗口的使用

    QDialog
    // QDialog::Accepted
    // ...
    ? exec() 
    
    展开全文
  • MDI多窗体组件,主要用于设计多文档界面应用程序,该组件具备有多种窗体展示...MDI窗体控件类似于画布,该控件只具备展示窗体的功能,无法实现生成窗体,所以我们需要在项目中手动增加自定义的Dialog对话框,并对该...

    MDI多窗体组件,主要用于设计多文档界面应用程序,该组件具备有多种窗体展示风格,其实现了在父窗体中内嵌多种子窗体的功能,使用MDI组件需要在UI界面中增加mdiArea控件容器,我们所有的窗体创建与操作都在这个容器内进行,如下我们将具体介绍该组件的常用使用技巧。

    MDI窗体控件类似于画布,该控件只具备展示窗体的功能,无法实现生成窗体,所以我们需要在项目中手动增加自定义的Dialog对话框,并对该对话框进行一定的定制。

    这个Dialog对话框我们只增加两个功能,一个Dialog::currentFileName()获取窗体标题,另一个Dialog::SetData(QString data)设置数据到编辑框,代码实现如下.

    #include "dialog.h"
    #include "ui_dialog.h"
    
    Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
    {
        ui->setupUi(this);
    
        this->setWindowTitle("New Doc <By: LyShark >");           // 窗口标题
        this->setAttribute(Qt::WA_DeleteOnClose);  // 关闭时自动删除
        this->setFixedSize(200,100);               // 设置窗体大小
        // this->setWindowIcon(QIcon(":/image/1.ico"));
    }
    
    Dialog::~Dialog()
    {
        delete ui;
    }
    
    // 获取窗体标题
    // By: LyShark
    QString Dialog::currentFileName()
    {
        QString title = this->windowTitle();
        return title;
    }
    
    // 设置编辑框内容
    // https://www.cnblogs.com/lyshark
    void Dialog::SetData(QString data)
    {
        ui->lineEdit->setText(data);
    }

    接着我们开始绘制这个程序的主界面,在toolBar中增加相应的菜单栏,并在主窗体中放入mdiArea容器组件。

    窗体中的顶部菜单栏,我们需要手动定义一下他们所具备的功能名称等。

    当程序启动后,程序调用MainWindow初始化这个窗体,初始化代码如下:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "dialog.h"
    #include <iostream>
    #include <QCloseEvent>
    
    // 如果直接关闭,则清空所有对话框
    // https://www.cnblogs.com/lyshark
    void MainWindow::closeEvent(QCloseEvent *event)
    {
        ui->mdiArea->closeAllSubWindows();
        event->accept();
    }
    
    // By: LyShark
    MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        this->setCentralWidget(ui->mdiArea);
        //this->setWindowState(Qt::WindowMaximized); //窗口最大化显示
        ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
        ui->mdiArea->setViewMode(QMdiArea::SubWindowView); //子窗口模式
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }

    代码运行效果如下:

    用户新建窗体执行MainWindow::on_actionOpen_triggered()事件,关闭窗体时则执行MainWindow::on_actionClose_triggered()事件。

    // 新建窗体
    void MainWindow::on_actionOpen_triggered()
    {
        Dialog *formDoc = new Dialog(this); //
        ui->mdiArea->addSubWindow(formDoc); //文档窗口添加到MDI
        formDoc->show(); //在单独的窗口中显示
    }
    // 关闭全部
    void MainWindow::on_actionClose_triggered()
    {
        ui->mdiArea->closeAllSubWindows(); //关闭所有子窗口
    }

    代码运行效果如下:

    当用户点击MDI模式时,我们则执行以下代码,将所有已存在的窗体合并为一个类似于TabWidget的窗体组件。

    // 转为MID模式
    void MainWindow::on_actionMID_triggered(bool checked)
    {
        // Tab多页显示模式
        if (checked)
        {
            ui->mdiArea->setViewMode(QMdiArea::TabbedView); // Tab多页显示模式
            ui->mdiArea->setTabsClosable(true);             // 页面可关闭
            ui->actionLine->setEnabled(false);
            ui->actionTile->setEnabled(false);
        }
        // 子窗口模式
        else
        {
            ui->mdiArea->setViewMode(QMdiArea::SubWindowView); // 子窗口模式
            ui->actionLine->setEnabled(true);
            ui->actionTile->setEnabled(true);
        }
    }

    代码运行效果如下:

    窗体级联模式则是将窗体并排排列在一起,我们只需要调用ui->mdiArea->cascadeSubWindows();方法即可实现.

    // 级联模式
    void MainWindow::on_actionLine_triggered()
    {
        ui->mdiArea->cascadeSubWindows();
    }

    代码运行效果如下:

    平铺模式同样使用ui->mdiArea->tileSubWindows();即可实现转换。

    // 平铺模式
    void MainWindow::on_actionTile_triggered()
    {
        ui->mdiArea->tileSubWindows();
    }

    代码运行效果如下:

    最后一个功能是主窗体发送数据到子窗体,该功能的实现需要两个函数。

    • on_mdiArea_subWindowActivated 实现设置主窗体名字到自身
    • on_actionSendMsg_triggered 实现主窗体发送消息到子窗体内
    // 当子窗体打开时获取到其窗体标题
    // By: LyShark
    void MainWindow::on_mdiArea_subWindowActivated(QMdiSubWindow *arg1)
    {
        Q_UNUSED(arg1);
    
        // 若子窗口个数为零,则将statusBar置空
        if (ui->mdiArea->subWindowList().count()==0)
        {
            ui->statusBar->clearMessage();
        }
        else
        {
            // 如果不为0则显示主窗口的文件名
            Dialog *formDoc=static_cast<Dialog*>(ui->mdiArea->activeSubWindow()->widget());
            ui->statusBar->showMessage(formDoc->currentFileName());
        }
    }
    
    // 对选中窗体发送数据
    // https://www.cnblogs.com/lyshark
    void MainWindow::on_actionSendMsg_triggered()
    {
        // 先获取当前MDI子窗口
        Dialog *formDoc;
    
        // 如果打开则获取活动窗体
        if (ui->mdiArea->subWindowList().count() > 0)
        {
            formDoc=(Dialog*)ui->mdiArea->activeSubWindow()->widget();
            // 对活动窗体设置数据
            formDoc->SetData("hello lyshark");
        }
    }

    代码运行效果如下:

    展开全文
  • 目前已经创建完我们需要的框架视图,下面的工作是把CmyFrameCmyView进行连接。在CmyFrame中添加成员变量CMyView *m_pMyView;然后在OnCreate成员函数中加入以下内容: CRect rect; GetClientRect(&rect); ...
  • 传统的应用程序设计中有多文档界面(Multi-document Interface,MDI)应用程序,Qt为设计 MDI 应用程序提供了支持。 目录 运行效果如下: qformdoc.ui界面如下: qwmainwindow.ui界面如下: ​ main.cpp ...
  • 项目中的单例模式

    2022-07-12 23:23:52
    在开发C#项目的时候往往会遇到这样的场景:整个系统都最小化到托盘,然后用户想要双击托盘显示出主界面,而此时你需要在显示主界面的时候弹出一个验证用户信息的对话框,要求用户输入密码等来验证。这样的场景就意味...
  • 概述 标准对话框 自定义对话框及其应用 多窗体应用程序设计 MDI应用程序设计 Splash与登陆窗口
  • 传统的应用程序设计中有多文档界面(Multi-document Interface,MDI)应用程序,Qt 为设计 MDI 应用程序提供了支持。本节的实例 samp6_4 是一个 MDI 应用程序,程序运行效果如图 1 所示。图 1 MDI 应用程序实例 samp6_...
  • MDI应用程序设计

    2022-07-04 17:07:27
    } void QWMainWindow::on_actDoc_Open_triggered() {//打开文件 //必须先获取当前MDI子窗口,再使用打开文件对话框,否则无法获得活动的子窗口 bool needNew=false;// 是否需要新建子窗口 QFormDoc *formDoc; if ...
  • 传统的应用程序设计中有多文档界面(Multi-document Interface,MDI)应用程序,Qt 为设计 MDI 应用程序提供了支持。 本节的实例 samp6_4 是一个 MDI 应用程序,程序运行效果如图 1 所示。 图 1 MDI 应用程序实例 ...
  • Qt MDI及其使用方法

    2020-02-14 10:56:51
    传统的应用程序设计中有多文档界面(Multi-document Interface,MDI)应用程序,Qt为设计 MDI 应用程序提供了支持。 本节的实例 samp6_4 是一个 MDI 应用程序,程序运行效果如图 1 所示。 图 1 MDI 应用程序实例 ...
  • 21、MDI应用程序设计

    2022-05-01 13:50:00
    } void QWMainWindow::on_actViewMode_triggered(bool checked) {//MDI 显示模式 if (checked) //Tab多页显示模式 { ui->mdiArea->setViewMode(QMdiArea::TabbedView); //Tab多页显示模式 ui->mdiArea->...
  • 第一眼看对话框窗口框摘要本文介绍了对话框框架体系结构组件。 概述对话框框架类树对话框框架类定义 容器 窗口框栏菜单组件 指标控件以触发操作控件设置选项输入或选择文本或值的控件菜单项引用概述您将在下面...
  • 标准对话框 QString curPath=QDir::currentPath();//获取系统当前目录 //QString curPath=QCoreApplication::applicationDirPath(); //获取应用程序的路径 QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif...
  • QT MDI

    2020-02-22 16:31:41
    传统的应用程序设计中有多文档界面(Multi-document Interface,MDI)应用程序,Qt 为设计 MDI 应用程序提供了支持。 本节的实例 samp6_4 是一个 MDI 应用程序,程序运行效果如图 1 所示。 图 1 MDI 应用程序实例 ...
  • 如果您将C#用于桌面开发项目,您可能知道Win32打开保存文件对话框的默认C#包装类的强大功能。它们易于使用,您将始终拥有正确的Windows风格。 但也存在一些问题,其中一些问题在本文中进行了讨论。背景一旦开发...
  • 这篇文章介绍了对话框的框架结构组件 1.总览 2.对话框框架结构树 3.对话框框架类定义 容器:窗口,盒子,Bars,菜单 组件:indicators,control 触发行为,controls设置选项,controls进入选择文本或者值 菜单项目 ...
  • 4.对话框程序

    2019-04-07 15:13:00
    讲解模式对话框和模式对话框的区别调用方法,介绍对话框的关闭过程常用回调函数。总体介绍MFC类库内容,讲解其中最重要的两大类库内部成员函数的功能。 一、根据主窗口类型,MFC软件工程可以分为以下几种...
  • 对话框的数据交换

    2017-07-09 22:55:31
    MFC为了简化这些操作,以CDataExchange类一些数据交换函数为基础,提供了一套数据交换校验的机制。 数据交换的方法 首先,定义保存数据的内存变量──给对话框添加成员变量,每个控制窗口可以...
  • MDI Jade6.5安装教程-附安装包

    千次阅读 2021-06-17 10:28:19
    安装软件前,请退出360、腾讯电脑管家等安全杀毒软件。 1.双击setup.exe 2.选择是 3.下一步 4.同意许可协议,下一步 5.下一步(默认不要改),如果需要更改,希望只更改盘符,也就更改到D:\Program Files ...
  • MFC在很多的对话框操作中,我们经常要用到在一个对话框中调用另一个对话框的函数或变量.可以用如下方法来解决.  HWND hWnd=::FindWindow(NULL,_T("Sphere")); //得到对话框的句柄  C***Dialog* pWnd= (C...
  • 注:以下代码以一个名为CTest6Dlg的对话框类为例 --------------------------------------------------------------...1. 在任务栏隐藏对话框  ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); ---------
  • 在VS中开发VC++应用程序 ,最常用就是MFC应用,它下在又分为常规应用程序、ActiveX控件DLL程序,那么常规的应用程序根据应用模式又分为Dialog对话框程序、SDI单文档、MDI多文档以及多顶级文档几类,下面我们分别...
  • 第六章:模式对话框和Windows通用控件1. DoDataExchange、DDX_(交换)DDV_(确认)函数都具有双向性.如果调用UpdataData时传给他的参数为FALSE,那么这些函数就会将数据成员中的值传递给对话框中的控件.否则为TRUE时,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,934
精华内容 1,973
热门标签
关键字:

对话框模式和mdi模式