【QT】多窗体应用程序设计

目录

1主要的窗体类及其用途

2 窗体类重要特性的设置

2.1 setAttribute()函数

2.2 setWindowFlags()函数

2.3 setWindowState()函数

2.4 setWindowModality()函数

2.5 setWindowOpacity()函数

3 多窗口应用程序的设计

3.1 主窗口设计

3.2 QFormDoc类的设计

3.3 QFormDoc类的使用

3.4 QFormTable类的设计

3.5 QFormTable类的使用

3.6 QTabWidget类的控制

1主要的窗体类及其用途

        常用的窗体基类是QWidget、QDialog和QMainWindow,在创建GUI应用程序时选择窗体基 类就是从这 3 个类中选择。 QWidget 直接继承于 QObject, 是 QDialog 和 QMainWindow 的父类, 其他继承于 QWidget 的窗体类还有 QSplashScreen 、 QMdiSubWindow 和 QDesktopWidget 。另外还 有一个类 QWindow ,它同时从 QObject 和 Qsurface 继承。这些类的继承关系如图 6-9 所示。
这些窗体类的主要特点和用途如下。
  • QWidget:在没有指定父容器时可作为独立的窗口,指定父容器后可以作为容器的内部组件。
  • QDialog:用于设计对话框,以独立窗口显示。
  • QMainWindow:用于设计带有菜单栏、工具栏、状态栏的主窗口,一般以独立窗口显示。
  • QSplashScreen:用作应用程序启动时的splash窗口,没有边框。
  • QMdiSubWindow:用于为QMdiArea提供一个子窗体,用于MDI(多文档)应用程序的
  • QDesktopWidget:具有多个显卡和多个显示器的系统具有多个桌面,这个类提供用户桌面
  • 信息,如屏幕个数、每个屏幕的大小等。
  • QWindow:通过底层的窗囗系统表示一个窗口的类,一般作为一个父容器的嵌入式窗体, 不作为独立窗体。

2 窗体类重要特性的设置

       下面介绍QWidget类中用于窗体属性设置的几个主要函数的功能。

2.1 setAttribute()函数

        setAttribute()函数用于设置窗体的一些属性,其函数原型为:
void QWidget::setAttribute(Qt::WidgetAttribute attribute,bool on = true)
        枚举类型Qt::WidgetAttribute定义了窗体的一些属性,可以打开或关闭这些属性。枚举类型 Qt:: WidgetAttribute 常用的常量及其意义见表 6-2 。

2.2 setWindowFlags()函数

        setWindowFlags()函数用于设置窗体标记,其函数原型是:
void QWidget::setWindowFlags(Qt::WindowFlags type)
        参数type是枚举类型Qt::WindowType的值的组合,用于同时设置多个标记。
        另外一个函数setWindowFlag()用于一次设置一个标记,其函数原型为:
void QWidget::setWindowFlag(Qt::WindowType flag,bool on=true)
        可单独打开或关闭某个属性。枚举类型Qt::WindowType常用的常量值见表6-3。
        Qt::Widget、Qt::Window等表示窗体类型的常量可以使窗体具有缺省的外观设置,如果设置 为Qt::Dialog类型,则窗体具有对话框的缺省外观,例如标题栏没有最小化、最大化按钮。
        控制窗体显示效果和外观的设置项可定制窗体的外观,例如设置一个窗体只有最小化最大化 按钮,没有关闭按钮。

2.3 setWindowState()函数

setWindowState()函数使窗口处于最小化、最大化等状态,其函数原型是:
void QWidget::setWindowState(Qt::WindowStates windowState)
枚举类型Qt::WindowState表示了窗体的状态,其取值见表6-4。

2.4 setWindowModality()函数

        setWindowModality()函数用于设置窗口的模态,只对窗口类型有用。其函数原型为:
void setWindowModality(Qt::WindowModality winndowModality)
        枚举类型Qt::WindowModality的取值意义见表6-5。

2.5 setWindowOpacity()函数

        setWindowOpacity()函数用于设置窗口的透明度,其函数原型如下:
void QWidget::setWindowOpacity(qreal level)
        参数level是1.0(完全不透明)至0.0(完全透明)之间的数。窗口透明度缺省值是1.0,即 完全不透明。

3 多窗口应用程序的设计

3.1 主窗口设计

        本节以实例samp6_3演示多窗口应用程序的设计,实例主窗口如图6-10所示。
图6-10 实例samp6_3的主窗口
        程序的主窗口类是QWMainWindow,从QMainWindow继承。主窗口有一个工具栏,4个创 建窗体的按钮以不同方式创建和使用窗体。主窗体工作区绘制一个背景图片,有一个tabWidget 组件,作为创建窗体的父窗体。没有子窗体时,tabWidget不显示。
        下面是QWMainWindow的构造函数和绘制背景图片的代码。
QWMainWindow::QWMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::QWMainWindow)
{
    ui->setupUi(this);
    ui->tabWidget->setVisible(false);
    ui->tabWidget->clear();//清除所有页面
    ui->tabWidget->tabsClosable(); //Page有关闭按钮,可被关闭

    this->setCentralWidget(ui->tabWidget);
    this->setWindowState(Qt::WindowMaximized); //窗口最大化显示
    this->setAutoFillBackground(true);//设置窗体自动填充背景
}

void QWMainWindow::paintEvent(QPaintEvent *event)
{ //绘制窗口背景图片
    Q_UNUSED(event);
    QPainter painter(this);
    painter.drawPixmap(0,ui->mainToolBar->height(),this->width(),
                       this->height()-ui->mainToolBar->height()-
                       ui->statusBar->height(),                                                    QPixmap(":/images/images/back2.jpg"));
}

       在构造函数中,将tabWidget组件设置为不可见,并且页面可关闭,这样每个页面标题部分都会出现一个关闭按钮,单击可以关闭页面。

        背景图片绘制使用窗体的paintEvent()事件,获取主窗口的画笔之后,将资源文件里的一个图片绘制在主窗口的工作区。绘图的内容在第8章详细介绍。

实例除了主窗口之外,还有两个窗口和两个对话框。

  • QFormDoc:是继承于QWidget可视化设计的窗体,主窗口工具栏上的“嵌入式Widget"和“独立Widget窗口"按钮将以两种方式使用QFormDoc类。

  • QFormTable:是继承于QMainWindow可视化设计的窗体,主窗口工具栏上的“嵌入式MainWindow”和“独立MainWindow窗口”按钮将以两种方式使用QFormTable类。

  • QWDialogSize和QWDialogHeaders就是实例samp6_2中设计的对话框类,由QFormTable调用进行表格组件设置。

3.2 QFormDoc类的设计

        在QtCreator单击"File”->“NewFileorProject”菜单项,在出现的对话框里选择创建Qt Designer Form Class,并且在向导中选择基类为QWidget,将创建的新类命名为QFormDoc。

        在QFormDoc的窗口上只放置一个QPlainTextEdit组件。由于QFormDoc是从QWidget继承而来的,在UI设计器里不能直接为QFormDoc设计工具栏,但是可以创建Action,然后在窗体创建时用代码创建工具栏。图6-11是设计的Action除了actOpen和actFont之外,其他编辑操作的Action都和QPlainTextEdit相关槽函数关联,actClose与窗口的close()槽函数关联。

图6-11 QFormDoc窗口设计的Action

        actOpen用于打开文件,actFont用于设置文档字体。

        在QFormDoc的构造函数里用代码创建工具栏和布局,也可以在析构函数里增加一个消息显示的对话框,以便观察窗体是何时被删除的。代码如下:

QFormDoc::QFormDoc(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::QFormDoc)
{
    ui->setupUi(this);
//使用UI设计的Actions设计工具栏
    QToolBar* locToolBar = new QToolBar(tr("文档"),this); //创建工具栏
    locToolBar->addAction(ui->actOpen);
    locToolBar->addAction(ui->actFont);
    locToolBar->addSeparator();
    locToolBar->addAction(ui->actCut);
    locToolBar->addAction(ui->actCopy);
    locToolBar->addAction(ui->actPaste);
    locToolBar->addAction(ui->actUndo);
    locToolBar->addAction(ui->actRedo);
    locToolBar->addSeparator();
    locToolBar->addAction(ui->actClose);
    locToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

    QVBoxLayout *Layout = new QVBoxLayout();
    Layout->addWidget(locToolBar); //设置工具栏和编辑器上下布局
    Layout->addWidget(ui->plainTextEdit);
    Layout->setContentsMargins(2,2,2,2); //减小边框的宽度
    Layout->setSpacing(2);
    this->setLayout(Layout); //设置布局
}

QFormDoc::~QFormDoc()
{
    QMessageBox::information(this, "消息", "QFormDoc对象被删除和释放");
    delete ui;
}

3.3 QFormDoc类的使用

        主窗口工具栏上的“嵌入式Widget”按钮的响应代码如下:
void QWMainWindow::on_actWidgetInsite_triggered()
{ //创建QFormDoc窗体,并在tabWidget中显示
    QFormDoc *formDoc = new QFormDoc(this); //不指定父窗口,单独用show()方法显示
    formDoc->setAttribute(Qt::WA_DeleteOnClose); //关闭时自动删除
//    formDoc->setWindowFlag(Qt::Widget,true);
//    formDoc->setWindowFlag(Qt::CustomizeWindowHint,true);
//    formDoc->setWindowFlag(Qt::WindowMinMaxButtonsHint,false);

//    formDoc->setWindowState(Qt::WindowMaximized);
//    formDoc->setWindowOpacity(0.5);
//    formDoc->setWindowModality(Qt::WindowModal);

//    formDoc->show(); //在单独的窗口中显示
//    formDoc->setWindowTitle("基于QWidget的窗口,无父窗口,关闭时删除");
    int cur=ui->tabWidget->addTab(formDoc,
            QString::asprintf("Doc %d",ui->tabWidget->count()));
    ui->tabWidget->setCurrentIndex(cur);
    ui->tabWidget->setVisible(true);
}

 这段代码动态创建一个QFormDoc类对象formDoc,并设置其为关闭时删除。然后使用QTabWidget的addTab()函数,为主窗口上的tabWidget新建一个页面,作为formDoc的父窗体组件,formDoc就在新建的页面里显示,我们称这种窗体显示方式为“嵌入式”。

        主窗口工具栏上的“独立Widget窗口”按钮响应代码如下:

void QWMainWindow::on_actWidget_triggered()
{
    QFormDoc *formDoc = new QFormDoc(); //不指定父窗口,用show()显示
    formDoc->setAttribute(Qt::WA_DeleteOnClose); //关闭时自动删除
    formDoc->setWindowTitle("基于QWidget的窗体,无父窗口,关闭时删除");

    formDoc->setWindowFlag(Qt::Window,true);

//    formDoc->setWindowFlag(Qt::CustomizeWindowHint,true);
//    formDoc->setWindowFlag(Qt::WindowMinMaxButtonsHint,true);
//    formDoc->setWindowFlag(Qt::WindowCloseButtonHint,true);
//    formDoc->setWindowFlag(Qt::WindowStaysOnTopHint,true);

//    formDoc->setWindowState(Qt::WindowMaximized);
    formDoc->setWindowOpacity(0.9);
//    formDoc->setWindowModality(Qt::WindowModal);

    formDoc->show(); //在单独的窗口中显示
}
        这里在创建formDoc对象时,并没有指定父窗口,创建窗口的代码是:
QFormDOC *formDoc = new QFormDoc();
    使用setWindowFlag()函数,设置其为Qt::Window类型,并用show()函数显示窗口。这样创 建的是一个单独显示的窗口,并且在windows的任务栏上会有显示。若有文档窗口打开,则关闭 主窗口,而文档窗口依然存在,实际上这时候主窗口是隐藏了。若关闭所有文档窗口,主窗口自
动删除并释放,才完全关闭应用程序。
        如果创建formDoc时指定主窗口为父窗口,即:
QFormDoc *formDoc = new QFormDoc(this);
        则formDoc不会在windows的任务栏上显示,关闭主窗口时,所有文档窗口自动删除。
        图6-12是嵌入式和独立的QFormDoc窗体的显示效果,在创建独立的显示窗口时,还可以尝 试使用setWindowFlag()函数设置不同的属性,观察这些属性的控制效果。
图6-12 嵌入式和独立的QFormDoc窗体显示效果

3.4 QFormTable类的设计

        表格窗口类QFormTable是基于QMainWindow的可视窗口类,其功能与实例samp6_2主窗口 类似,使用QStandardItemModel模型和QTableView组件构成Model/View结构的表格数据编辑器, 并且可以调用QWDialogSize和QWDialogHeaders对话框进行表格大小设置和表头设置。 为了观察窗口删除的时机,在析构函数里增加一个信息显示对话框。
QFormTable::~QFormTable()
{
    QMessageBox::information(this, "消息", "FormTable窗口被删除和释放");
    delete ui;
}

3.5 QFormTable类的使用

        主窗口工具栏上的“嵌入式MainWindow”按钮的响应代码如下:

void QWMainWindow::on_actWindowInsite_triggered()
{
    QFormTable *formTable = new QFormTable(this);
    formTable->setAttribute(Qt::WA_DeleteOnClose); //关闭时自动删除
    //    aTable->setWindowTitle("基于QWidget的窗口,无父窗口,关闭时删除");
    int cur=ui->tabWidget->addTab(formTable,
              QString::asprintf("Table %d",ui->tabWidget->count()));
    ui->tabWidget->setCurrentIndex(cur);
    ui->tabWidget->setVisible(true);
}

     代码功能是创建一个QFormTable对象formTable,并在主窗口的tabWidget组件里新增一个页面,将formTable显示在新增页面里。所以,即使是从QMainWindow继承的窗口类,也是可以在其他界面组件里嵌入式显示的。

        主窗口工具栏上的“独立MainWindow窗口”按钮响应代码如下:

void QWMainWindow::on_actWindow_triggered()
{
    QFormTable* formTable = new QFormTable(this);
//    formChart = new QFormTable(); //无父窗体,在windows任务栏上有显示
    formTable->setAttribute(Qt::WA_DeleteOnClose); //对话框关闭时自动删除对话框对象,用于不需要读取返回值的对话框
    formTable->setWindowTitle("基于QMainWindow的窗口,指定父窗口,关闭时删除");
//    formChart->setWindowTitle("多实例窗口,指定父窗口");
    formTable->show();
}
     这样创建的formTable以独立窗口显示,关闭时自动删除。它指定了主窗口为父窗口,主窗 口关闭时,所有QFormTable类窗口自动删除。
无论是嵌入式的,还是独立的QFormTable窗口,都可以调用QWDialogSize和QWDialogHeaders 对话框进行表格大小和表头文字设置。创建QFormTable嵌 入式窗体和独立窗口的运行效果如图6-13所示。

3.6 QTabWidget类的控制

        现在,单击tabWidget中嵌入的QFormDoc或QFormTable窗体工具栏上的“关闭”按钮,都 可以关闭窗体并且删除分页。但是单击分页上的关闭图标,并不能关闭窗口。而且,关闭所有分 页后,tabWidget并没有隐藏,无法显示背景图片。
        为此,需要对tabWidget的两个信号编写槽函数,tabCloseRequested()和currentChanged()信号 的槽函数代码如下:
void QWMainWindow::on_tabWidget_tabCloseRequested(int index)
{//关闭Tab
    if (index<0)
        return;
    QWidget* aForm=ui->tabWidget->widget(index);
    aForm->close();
}

void QWMainWindow::on_tabWidget_currentChanged(int index)
{
    bool  en=ui->tabWidget->count()>0; //再无页面时,actions禁用
    ui->tabWidget->setVisible(en);
}
图6-13嵌入式和独立的QFormDoc窗体显示效果
        tabCloseRequested()信号在单击分页的关闭图标时发射,传递来的参数index表示页面的编号。 QTabWidget::widget()返回TabWidget组件中某个页面的窗体组件。获取页面的QWidget组件后, 调用close()函数关闭窗体。
        删除一个分页或切换页面时,会发射currentChanged()信号,在此信号的槽函数里判断分页个 数是否为零,以控制tabWidget是否可见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/329609.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python_PySide6学习笔记(三十一)】基于PySide6实现自定义串口设备连接界面类:可实现串口连接断开、定时发送等功能

基于PySide6实现自定义串口设备连接界面类:可实现串口连接关闭、定时发送等功能 基于PySide6实现自定义串口设备连接界面类:可实现串口连接关闭、定时发送等功能前言一、界面布局二、串口相关功能实现三、完整代码四、调用方法五、实现效果基于PySide6实现自定义串口设备连接…

入门指南:使用STM32微控制器进行ADC数据采集

使用STM32微控制器进行ADC&#xff08;模数转换器&#xff09;数据采集是嵌入式系统开发中常见的任务。本文将介绍如何通过STM32CubeMX和HAL库函数进行ADC数据采集&#xff0c;并提供相应的代码示例。 1. STM32CubeMX配置 首先&#xff0c;使用STM32CubeMX工具配置STM32微控制…

纸黄金实战投资技巧:避免亏损的有效策略

在纸黄金交易的实战中&#xff0c;避免亏损是每位投资者都追求的目标。虽然任何投资都存在一定的风险&#xff0c;但采取一些有效的策略可以帮助投资者最大限度地减少亏损的可能性。以下是一些在纸黄金交易中避免亏损的实战技巧&#xff1a; 一、设定止损点是避免亏损的关键 止…

【Java封装Jar包】将自己的代码封装为一个jar包⭐️以便在别的项目可以直接引用使用

哎&#xff0c;有了&#xff0c;搞一个Jar包给你&#xff01; 目录 前言 一、新建一个Java项目&#xff0c;样例为新建一个Springboot项目&#xff0c;引入了下面两个依赖 二、新建一个测试工具类 三、封装为Jar包 四、项目引入Jar包 五、测试下Jar包 小伙伴们大家好&…

接口测试需求分析

测试接口的时候&#xff0c;可能很多人都会想&#xff0c;按着研发给的接口协议文档来测&#xff0c;不就好了吗&#xff1f; 其实&#xff0c;对于接口的测试&#xff0c;还需要有点深度的需求分析&#xff0c;然后再进行对应的测试。对于接口测试&#xff0c;这里有个不太详…

数字电源简介

数字电源简介 定义主要应用场景数字电源的基本组成常见算法常见电源拓扑PFCLLC 数字电源与模拟电源对比参考链接 定义 常见定义有以下四种&#xff1a; 通过数字接口控制的开关电源&#xff0c;强调的是数字电源的“通信”功能。可通过I2C或类似的数字总线来对数字信号进行控…

MongoDB-数据库文档操作(2)

任务描述 文档数据在 MongoDB 中的查询和删除。 相关知识 本文将教你掌握&#xff1a; 查询文档命令&#xff1b;删除文档命令。 查询文档 我们先插入文档到集合 stu1 &#xff1a; document([{ name:张小华, sex:男, age:20, phone:12356986594, hobbies:[打篮球,踢足球…

【GCC】6 接收端实现:周期构造RTCP反馈包

基于m98代码。GCC涉及的代码,可能位于:webrtc/modules/remote_bitrate_estimator webrtc/modules/congestion_controller webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.cc webrtc 之 RemoteEstimatorProxy 对 remote_bitrate_estimator 的 RemoteEstimato…

腾讯云主机优惠价格表(2024新版报价)

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

好消息,Linux Kernel 6.7正式发布!

据有关资料显示&#xff0c;该版本是有史以来合并数最多的版本之一&#xff0c;包含 17k 个非合并 commit&#xff0c;实际合并的超过1K个。 那么该版本主要有哪边变化呢&#xff1f;下面我来一一列举一下&#xff1a; Bcachefs文件系统已被合并到主线内核&#xff0c;这是一款…

Template Engine-05-模板引擎 Thymeleaf 入门介绍

拓展阅读 java 表达式引擎 logstash 日志加工处理-08-表达式执行引擎 AviatorScriptMVELOGNLSpELJEXLJUELJanino QLExpress 阿里表达式引擎系统学习 Thymeleaf简介 1.1 什么是Thymeleaf&#xff1f; Thymeleaf是一款现代的服务器端Java模板引擎&#xff0c;适用于Web和独…

表的增删改查 进阶(一)

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;MySql&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 数据库约束 约束类型 NOT NUll 约束 UNIQUE 约束 D…

【FPGA Modsim】 抢答器设计

实验题目&#xff1a; 抢答器设计 实验目的&#xff1a; 掌握应用数字逻辑设计集成开发环境进行抢答器设计的方法&#xff1b;掌握时序逻辑电路设计的过程。 实验内容&#xff1a; 1、设计支持3名参赛者的…

IPv6自动隧道

自动隧道原理 IPv6自动隧道、即边界设备可以自动获得隧道终点的IPv4地址,所以不需要手工配置终点的IPv4地址,一般的做法是隧道的两个接口的IPv6地址采用内嵌IPv4地址的特殊IPv6地址形式,这样路由设备可以从IPv6报文中的目的IPv6地址中提取出IPv4地址。 IPv6OverIPv4自动隧…

vscode安装和基本设置

目录 vscode安装和基本设置1.HTML标签2.标签属性3.HTML基本结构4.安装vscode5.安装Live Server插件6.HTML注释7.文档说明8.HTML字符编码9.HTML设置语言10.HTML标准结构 vscode安装和基本设置 1.HTML标签 标签 又称 元素&#xff0c;是HTML的基本组成单位。标签分为&#xff1…

易懂的方式讲解ARM中断原理以及中断嵌套方法

ARM有七种模式&#xff0c;我们这里只讨论SVC、IRQ和FIQ模式。 我们可以假设ARM核心有两根中断引脚&#xff08;实际上是看不见的&#xff09;&#xff0c;一根叫 irq pin, 一根叫fiq pin。在ARM的cpsr中&#xff0c;有一个I位和一个F位&#xff0c;分别用来禁止IRQ和FIQ。 先…

SC20-EVB ubuntu14.04 Andriod 5.1 SDK编译下载

1.ubuntu14.04安装环境配置 vi /etc/profile to add export JAVA_HOME/usr/lib/jvm/java-7-openjdk-amd64 export JRE_HOME J A V A H O M E / j r e e x p o r t C L A S S P A T H . : {JAVA_HOME}/jre export CLASSPATH.: JAVAH​OME/jreexportCLASSPATH.:{JAVA_HOME}/lib…

numpy中数组的操作

目录 一&#xff1a;数组的属性 二&#xff1a;翻转数组 三&#xff1a;数组的计算 一&#xff1a;数组的属性 NumPy 数组&#xff08;通常称为 ndarray&#xff09;有许多有用的属性&#xff0c;这些属性可以帮助你了解数组的各个方面。以下是一些主要的属性&#xff1a; …

银行数据仓库体系实践(2)--系统架构

UML对系统架构的定义是&#xff1a;系统的组织结构&#xff0c;包括系统分解的组成部分&#xff0c;它们的关联性&#xff0c;交互&#xff0c;机制和指导原则&#xff0c;例如对系统群就是定义各子系统的功能和职责&#xff0c;如贷款系统群可能分为进件申请、核额、交易账务、…

修炼内功——简略分析C程序编译与链接

目录 前言 1. 翻译环境和运行环境 2. 翻译环境&#xff1a;预编译编译汇编链接 2.1 预处理&#xff08;预编译&#xff09; 2.2 编译 2.2.1 词法分析&#xff1a; 2.2.2 语法分析 2.2.3 语义分析 2.3 汇编 2.4 链接 3. 运行环境 总结 前言 编译和链接的内容&#…
最新文章