【qt】多窗口开发

多窗口开发

  • 一.应用场景
  • 二.嵌入的窗口
    • 1.设计Widget窗口
    • 2.创建窗口
    • 3.添加窗口
    • 4.总代码
  • 三.独立的窗口
    • 1.创建窗口
    • 2.显示窗口
  • 四.总结

一.应用场景

多窗口,顾名思义,有多个窗口可以供我们进行操作!
截个小图,你应该就知道了
在这里插入图片描述
OK,话不多说,直接开干,先来设计我们的主窗口
在这里插入图片描述
需要蔬菜的可以dd我…
运行结果:
在这里插入图片描述
运行结果有点拉,我们来把tabWidget设置为中心组件.

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->tabWidget->clear();//清空页
    setCentralWidget(ui->tabWidget);
    setWindowState(Qt::WindowMaximized);//一运行就是最大化
    ui->tabWidget->setTabsClosable(true);//对tab添加一个关闭按钮

}

MainWindow::~MainWindow()
{
    delete ui;
}

运行结果:
在这里插入图片描述

但是刚刚我们添加的关闭按钮不能真正的进行关闭,当点击X的时候,会发出一个信号
可以去tabWidget里面去找!
在这里插入图片描述
现在我们可以去添加一个槽函数,来实现真正的关闭功能

private slots:
    //按照转到槽的格式 on_发送者_信号 的格式来写会自动的关联,不用我们手动的关联
    void on_tabWidget_tabCloseRequested(int index);

槽函数的实现:

void MainWindow::on_tabWidget_tabCloseRequested(int index)
{
    QWidget* widget=ui->tabWidget->widget(index);//拿到widget
    widget->close();//进行关闭
}

当我们后面进行添加了窗口,再来测试这个关闭功能.

二.嵌入的窗口

1.设计Widget窗口

在这里插入图片描述
然后添加好action
在这里插入图片描述
因为这是widget不是mainwindow所有不能添加工具栏,但是我们可以通过代理来进行添加,代码是万能的!

#include "formwidget.h"
#include "ui_formwidget.h"
#include <QToolBar>//工具栏
#include <QVBoxLayout>//水平布局

FormWidget::FormWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FormWidget)
{
    ui->setupUi(this);

    QToolBar *Bar=new QToolBar(this);
    Bar->addAction(ui->actionOpen);
    Bar->addSeparator();//添加分割线
    Bar->addAction(ui->actionFont);
    Bar->addAction(ui->actionCut);
    Bar->addAction(ui->actionCopy);
    Bar->addAction(ui->actionPaste);
    Bar->addAction(ui->actionRepeal);
    Bar->addAction(ui->actionRewire);
    Bar->addSeparator();
    Bar->addAction(ui->actionEXIT);
    Bar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);//字体显示在下
    //设置布局
    QVBoxLayout *vLayout=new QVBoxLayout(this);
    vLayout->addWidget(Bar);
    vLayout->addWidget(ui->plainTextEdit);
    this->setLayout(vLayout);//为窗口添加布局

}

FormWidget::~FormWidget()
{
    delete ui;
}

2.创建窗口

注意添加头文件

    FormWidget *form=new FormWidget(this);
    form->setAttribute(Qt::WA_DeleteOnClose);//关闭的时候同时销毁

3.添加窗口

//为tabWidget添加页面
    int ret=ui->tabWidget->addTab(form,QString::asprintf("窗口%d",ui->tabWidget->count()+1));
    ui->tabWidget->setCurrentIndex(ret);//设置为添加的页面窗口

4.总代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "formwidget.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->tabWidget->clear();
    setCentralWidget(ui->tabWidget);
    setWindowState(Qt::WindowMaximized);//一运行就是最大化
    ui->tabWidget->setTabsClosable(true);//对tab添加一个关闭按钮

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_tabWidget_tabCloseRequested(int index)
{
    QWidget* widget=ui->tabWidget->widget(index);//拿到widget
    widget->close();//进行关闭
}

void MainWindow::on_action_Widget_triggered()
{
    FormWidget *form=new FormWidget(this);
    form->setAttribute(Qt::WA_DeleteOnClose);//关闭的时候同时销毁

    //为tabWidget添加页面
    int ret=ui->tabWidget->addTab(form,QString::asprintf("窗口%d",ui->tabWidget->count()+1));
    ui->tabWidget->setCurrentIndex(ret);//设置为添加的页面窗口
}

运行结果;
在这里插入图片描述
里面具体的功能不做实现,我们主要是演示多窗口的用法!

三.独立的窗口

1.创建窗口

FormWidget *form=new FormWidget(this);
    form->setAttribute(Qt::WA_DeleteOnClose);//关闭的时候同时销毁

2.显示窗口

void MainWindow::on_action_WidgetIndent_triggered()
{
    FormWidget *form=new FormWidget(this);
    form->setAttribute(Qt::WA_DeleteOnClose);//关闭的时候同时销毁
    
    form->show();//以非模态的方式显示
}

运行结果:
在这里插入图片描述
这样会出现问题,所以我们要对widget窗口设置标记,使其有对话框的摸样.

void MainWindow::on_action_WidgetIndent_triggered()
{
    FormWidget *form=new FormWidget(this);
    form->setAttribute(Qt::WA_DeleteOnClose);//关闭的时候同时销毁
    form->setWindowFlag(Qt::Window,true);
    form->setWindowTitle("基于widget的独立窗口");

    form->show();//以非模态的方式显示
}

运行结果:
在这里插入图片描述

四.总结

多窗口其实是比较简单的,主要是设计好,显示的方式确定好,就可以了!
小彩蛋:
在这里插入图片描述
有没有点熊猫烧香的感觉,这就是多窗口在这里插入图片描述

没什么好的句子,哈哈

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

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

相关文章

Mysql基础教程(13):GROUP BY

MySQL GROUP BY 【 GROUP BY】 子句用于将结果集根据指定的字段或者表达式进行分组。 有时候&#xff0c;我们需要将结果集按照某个维度进行汇总。这在统计数据的时候经常用到&#xff0c;考虑以下的场景&#xff1a; 按班级求取平均成绩。按学生汇总某个人的总分。按年或者…

如何让Google收录网站?

Google收录网站的前提条件是确保网站可以公开访问&#xff0c;并且页面加载速度需要快&#xff0c;这样Google爬虫才可以访问到你的网站&#xff0c;并且索引你网站中的内容。实现了上面的前提条件&#xff0c;可以通过优化数据结构、创建站点地图、使用Google Search Console、…

postgressql——PGPROC XLOG(6)

PGPROC相关结构 在共享内存中,核心数据结构围绕PROC_HDR指向的两个list:PROC和XACT PRCO内存连续,维护链表结构方便申请释放,对应每个后台服务进程,PID为OS标识、PGPROCNO为内部标识 XACT内存连续,维护快照需要的xmin和xid,XACT从PROC拆出来是为了更高的cache line命中…

华为诺亚等发布MagicDrive3D:自动驾驶街景中任意视图渲染的可控3D生成

文章链接&#xff1a;https://arxiv.org/pdf/2405.14475 项目链接&#xff1a;https://flymin.github.io/magicdrive3d 虽然可控生成模型在图像和视频方面取得了显著成功&#xff0c;但在自动驾驶等无限场景中&#xff0c;高质量的3D场景生成模型仍然发展不足&#xff0c;主…

排序算法之直接选择排序【图文详解】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

配置arduino和ESP8266

首先准备好arduino 的IDE和ESP8266的驱动以及板子 1.安装驱动&#xff0c;双击x64的版本驱动&#xff0c;安装好以后&#xff0c;在资源管理器检查端口&#xff0c;比如下下图出现的COM4就是esp8266所使用的端口 2.安装好arduino最好不要在路径中存在中文符号&#xff0c;打开…

计量校准和检定的联系是什么?它们有什么区别?

计量中&#xff0c;计量校准和检定一直形影不离&#xff0c;很多人也会经常搞混两者的定义&#xff0c;不清楚二者的区别&#xff0c;计量校准和检定有什么联系也不明白&#xff0c;因此有时候经常在需要做校准的时候&#xff0c;去花大价钱检定&#xff0c;在需要检定的时候&a…

重生奇迹MU召唤师如何学习狂暴术?

一、了解狂暴术的基本信息 狂暴术是一种非常强大的技能&#xff0c;可以让召唤师的攻击力和防御力大幅度提高&#xff0c;但同时也会增加自身的伤害。在使用狂暴术之前&#xff0c;召唤师需要仔细考虑自己的状态和对手的情况。 二、学习狂暴术的方法 1.通过任务学习 在游戏…

NKCTF 2024 webshell_pro

还是正常的HTTP流量 既然是webshell一定是看POST流量 对每一个进行追踪tcp流 最终发现 在 流9 (tcp.stream eq 9)存在 base32 -->base64的流量的加密逻辑 import base64import libnum from Crypto.PublicKey import RSApubkey """-----BEGIN PUBLIC KEY…

LeeCode热题100(两数之和)

本文纯干货&#xff0c;看不懂来打我&#xff01; 自己先去看一下第一题的题目两数之和&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 简单来说就是让你在一个数组里面找两个数&#xff0c;这两个数的和必须满足等于目标值target才行。 我认为你要是没有思路的话&a…

骨传导耳机哪一款比较值得入手?年度精选好用骨传导耳机推荐

现在很多年轻人都会选择用骨传导耳机&#xff0c;因为骨传导耳机更加方便&#xff0c;不用入耳&#xff0c;不会伤害到耳朵&#xff0c;对耳膜也没有什么伤害。同时&#xff0c;因为骨传导耳机的结构也比较简单&#xff0c;所以佩戴也会更加舒适。接下来就给大家推荐几款口碑不…

【Python内功心法】:深挖内置函数,释放语言潜能

文章目录 &#x1f680;一、常见内置函数&#x1f308;二、高级内置函数⭐1. enumerate函数&#x1f44a;2. eval函数❤️3. exec函数&#x1f4a5;4. eval与exec 中 globals与locals如何用☔4-1 globals 参数&#x1f3ac;4-2 locals 参数 ❤️5. filter函数&#x1f44a;6. z…

【机器学习】智能选择的艺术:决策树在机器学习中的深度剖析

在机器学习的分类和回归问题中&#xff0c;决策树是一种广泛使用的算法。决策树模型因其直观性、易于理解和实现&#xff0c;以及处理分类和数值特征的能力而备受欢迎。本文将解释决策树算法的概念、原理、应用、优化方法以及未来的发展方向。 &#x1f680;时空传送门 &#x…

解决Windows 10通过SSH连接Ubuntu 20.04时的“Permission Denied”错误

在使用SSH连接远程服务器时&#xff0c;我们经常可能遇到各种连接错误&#xff0c;其中“Permission denied, please try again”是较为常见的一种。本文将分享一次实际案例的解决过程&#xff0c;帮助你理解如何排查并解决这类问题。 问题描述 在尝试从Windows 10系统通过SS…

如何设置手机的DNS

DNS 服务器 IP 地址 苹果 华为 小米 OPPO VIVO DNS 服务器 IP 地址 中国大陆部分地区会被运营商屏蔽网络导致无法访问&#xff0c;可修改手机DNS解决。 推荐 阿里的DNS (223.5.5.5&#xff09;或 114 (114.114.114.114和114.114.115.115) 更多公开DNS参考&#xff1a; 苹果…

一个浏览器插件,绕过限制,登录微信网页版!

摘要 早在2017年开始&#xff0c;微信网页版就已经住逐渐开始停止登录&#xff0c;以为了保障你的账号安全为由引导你使用电脑版微信。具体如下&#xff1a; 当然这个影响并不是所有账号&#xff0c;还是有一些账号不明觉厉地没有被影响到&#xff0c;我自己有2个号都还是可以…

记一次服务器数据库被攻击勒索

如图&#xff0c;早上一起来就发现&#xff0c;我的MongoDB数据库里面的信息全部没有了&#xff0c;只留下一段话。 大致意思就是&#xff1a;我的数据库的数据被他们备份然后全部删掉了&#xff0c;我必须要支付0.0059的bitcoin&#xff08;折合400美刀&#xff09;来赎回我的…

自动化桌面整理新时代:Llama 3驱动的智能文件管理系统

在信息爆炸的时代,个人和企业用户的电脑桌面常常被海量文件占据,导致查找特定文件如同大海捞针。为了解决这一痛点,Llama 3应运而生——一个集成了先进多模态AI技术的智能文件管家,旨在将杂乱无章的文件世界变得井然有序。本文将深入探讨Llama 3如何利用其创新功能,不仅自…

详解生成式人工智能的开发过程

回到机器学习的“古老”时代&#xff0c;在您可以使用大型语言模型&#xff08;LLM&#xff09;作为调优模型的基础之前&#xff0c;您基本上必须在所有数据上训练每个可能的机器学习模型&#xff0c;以找到最佳&#xff08;或最不糟糕&#xff09;的拟合。 开发生成式人工智能…

代码随想录算法训练营第36期DAY44

DAY44 闫氏DP 2 01背包问题 用滚动数组来优化空间&#xff0c;从后向前&#xff08;大到小&#xff09;遍历j #include<iostream>using namespace std;const int N1010;int n,m;int v[N],w[N];int f[N][N];//所有只考虑前i个物品&#xff0c;**且总体积不超过j**的选法…