【QT】Qt窗口(上)

在这里插入图片描述

个人主页~


Qt窗口

  • 一、菜单栏
  • 二、工具栏
  • 三、状态栏
  • 四、浮动窗口
  • 五、对话框
    • 1、简介
      • (1)模态对话框
      • (2)非模态对话框
      • (3)混合属性对话框

Qt窗口是通过QMainWindow类来实现的,我们之前的学习是通过QWidget类实现的

QMainWindow包含一个菜单栏Menu Bar②,多个工具栏Tool Bars③,多个浮动窗口Dock Widgets,一个状态栏Status Bar⑤和一个中心部件Central Widget④
①是Window Title

在这里插入图片描述

一、菜单栏

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //设置窗口名
    this->setWindowTitle("我的word文件");
	//创建菜单栏,将菜单栏设置到窗口当中
    QMenuBar* mb = new QMenuBar(this);
    this->setMenuBar(mb);
	//设置菜单名,将菜单设置到菜单栏中
    QMenu* m = new QMenu("文件");
    mb->addMenu(m);
	//设置菜单项,将菜单项设置到菜单当中
    QAction* a1 = new QAction("打开");
    QAction* a2 = new QAction("保存");
    QAction* a3 = new QAction("关闭");
    m->addAction(a1);
    m->addAction(a2);
    m->addAction(a3);
	//设置中心部件
    QTextEdit* te = new QTextEdit(this);
    this->setCentralWidget(te);
    te->setPlaceholderText("请输入");
}

menubar

让我们加上对应的功能

    connect(a1,&QAction::triggered,this,&MainWindow::load);
    connect(a2,&QAction::triggered,this,&MainWindow::save);
    connect(a3,&QAction::triggered,this,&MainWindow::quit);
void MainWindow::save()
{
	//创建文件对话框
    QFileDialog* dg = new QFileDialog(this);
	//根据文件名创建文本文件
    QString filename = dg->getSaveFileName(this,"保存文件","C:/Users/14725/Desktop");
    qDebug() << filename;
    //将filename转换成一个标准C字符串,然后使用这个路径来创建一个std::ofstream对象file,以便打开并写入文件
    std::ofstream file(filename.toStdString().c_str());
    if(!file.is_open())
    {
        qDebug() << "文件保存失败";
        return;
    }
    //将textedit中的内容通过普通文本存放在text中
    const QString& text = te->toPlainText();
    //通过流输入到file文件
    file << text.toStdString();
    //关闭文件
    file.close();
}

void MainWindow::load()
{
	//创建文件对话框
    QFileDialog* d = new QFileDialog(this);
    //获取到指定位置的文件名
    QString filename = d->getOpenFileName(this,"加载文件","C:/Users/14725/Desktop");
    //将filename转换成一个标准C字符串,然后使用这个路径来创建一个std::ifstream对象file,以便加载文件
    std::ifstream file(filename.toStdString().c_str());
    if(!file.is_open())
    {
        qDebug() << "文件加载失败";
        return;
    }
    //创建两个字符串
    std::string content;
    std::string line;
    //一行一行从文件中扫描输入到content
    while (std::getline(file, line))
    {
        content += line;
        content += "\n";
    }
    //关闭文件
    file.close();
    //获取到content内容,呈现到textedit当中
    QString text = QString::fromStdString(content);
    te->setPlainText(text);
}

menubar_2

二、工具栏

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
	//创建工具栏,将其添加到右侧区域
    QToolBar* tb = new QToolBar(this);
    addToolBar(Qt::RightToolBarArea,tb);
	//设置工具栏停留的位置只能为最左侧和最右侧
    tb->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
	//设置是否可以作为一个独立的窗口被拖拽
    tb->setFloatable(false);
	//设置是否可以移动工具栏
    tb->setMovable(true);
	//设置工具栏内容
    QAction* openAction = new QAction("open",this);
    QAction* newAction = new QAction("new",this);
	
    tb->addAction(openAction);
    tb->addSeparator();
    tb->addAction(newAction);
	//在工具栏中添加控件
    QLabel* label = new QLabel("super little monster",this);
    tb->addWidget(label);
}

toolbar

三、状态栏

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
	//创建和设置状态栏,因为一个窗口创建默认有状态栏,
	//这里是直接把新创建的状态栏参数设置到已有的状态栏当中
    QStatusBar* sb = statusBar();
    setStatusBar(sb);
	//状态栏的显示内容和时间
    sb->showMessage("super_little_monster",2000);
	//设置一个label设置到右下角永久显示,左下角永久显示就是用addWidget
    QLabel* label = new QLabel("我在右下角",this);
    sb->addPermanentWidget(label);
}

statusbar

四、浮动窗口

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
	//创建浮动窗口并将其设置在当前窗口中
    QDockWidget* dw = new QDockWidget("浮动窗口",this);
    addDockWidget(Qt::BottomDockWidgetArea,dw);
	//设置浮动窗口四个位置都可停靠,还有四个选项,分别是上下左右:
	//Qt::TopDockWidgetArea
	//Qt::BottomDockWidgetArea
	//Qt::LeftDockWidgetArea
	//Qt::RightDockWidgetArea
    dw->setAllowedAreas(Qt::AllDockWidgetAreas);
}

dockwidget

五、对话框

1、简介

通常是一个顶层窗口,出现在屏幕最上层,用于实现短期任务或者简洁的用户交互,分为模态对话框和非模态对话框

(1)模态对话框

显示后无法与父窗口进行交互的的对话框叫做模态对话框,一般用作消息显示,文件选择等,当模态对话框出现时,我们就不能操作父窗口了,例如word文档,当我们输入内容点击关闭时,弹出的对话框就是模态对话框,必须先对对话框进行交互才能进行下一步动作,不然父窗口是不能再编辑的
一般用QDialog::exec()函数调用,建立在栈区,因为该函数有阻塞作用,程序就会一直阻塞在这里不进行下一步
在这里插入图片描述

dialog

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
	//新建一个工具栏,将打开工具设置到工具栏中
    QToolBar* tb = new QToolBar(this);
    QAction* a = new QAction("打开");
    tb->addAction(a);
	//将点击打开按钮发送的信号与拉姆达表达式connect,实现弹出对话框效果
    connect(a,&QAction::triggered,[=]()
    {
        QDialog dg(this);
        dg.resize(300,400);
        dg.exec();
        //exec阻塞程序,在与对话框交互完成后程序继续执行,有点类似于stm32中的中断哈
    });
}

(2)非模态对话框

非模态对话框显示后独立存在,可以同时与父窗口进行交互,一般建立在堆区,因为其不影响父窗口的特性,也就是无阻塞,如果建立在栈区往往会一闪而过
一般用QDialog::show()函数调用

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
	//新建一个工具栏,将打开工具设置到工具栏中
    QToolBar* tb = new QToolBar(this);
    QAction* a = new QAction("打开");
    tb->addAction(a);
	//将点击打开按钮发送的信号与拉姆达表达式connect,实现弹出对话框效果
    connect(a,&QAction::triggered,[=](){
        QDialog* dialog = new QDialog(this);
        dialog->resize(300,400);
        dialog->setAttribute(Qt::WA_DeleteOnClose);
        //QT内部的方法,当关闭窗口时释放窗口内存
        dialog->show();
        //show不阻塞程序,所以我们要将dialog建在堆上
    });

}

dialog_2

(3)混合属性对话框

混合属性对话框在生成和销毁上具有非模态对话框属性,在功能上具有模态对话框属性

使用QDialog::setModal(bool)函数来创建

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

    QToolBar* tb = new QToolBar(this);
    QAction* a = new QAction("打开");
    tb->addAction(a);

    connect(a,&QAction::triggered,[=](){
        QDialog* dialog = new QDialog(this);
        dialog->resize(300,400);
        dialog->setAttribute(Qt::WA_DeleteOnClose);
        dialog->setModal(true);//注意,与上方的程序相比我只添加了这一行代码
        dialog->show();
    });
}

dialog_3


今日分享到此结束~
在这里插入图片描述

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

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

相关文章

第二十章 Vue组件通信之父子通信

目录 一、引言 二、组件关系分类 三、组件通信的解决方案 3.1. 父子通信流程图 3.2. 父组件通过 props 将数据传递给子组件 3.2.1. 代码App.vue 3.2.2. 代码MySon.vue 3.3. 子组件利用 $emit 通知父组件修改更新 ​编辑3.3.1. 代码App.vue 3.3.2. 代码MySon.vue 3…

用ChatGPT提升工作效率:从理论到实际应用

伴人工智能技术的迅速演进&#xff0c;像ChatGPT这类语言模型已成为提升工作效率的关键工具。这类模型不仅具备处理海量数据的能力&#xff0c;还能自动化许多日常任务&#xff0c;从而提高决策的准确性。本文将深入探讨如何在工作中利用ChatGPT等AI工具提升效率&#xff0c;涵…

golang 服务注册与服务发现框架 入门与实践

Go语言中服务注册与发现的应用 在Go微服务架构中&#xff0c;服务注册与服务发现是实现服务间通信和解耦的关键。随着服务数量的增长&#xff0c;手动管理服务之间的依赖关系变得异常复杂且容易出错。因此&#xff0c;自动化服务注册与发现机制变得尤为重要。当一个Go微服务启…

1.STM32之定时器TIM---第一部分(基本定时器)(功能最强大结构最复杂的一个外设)(实验基本定时功能)-----定时器定时中断(利用内部时钟72M)

定时器TIM是STM32外设中功能最强大结构最复杂的一个外设&#xff01;Whappy STM32F103C8T6总共由一个高级定时器3个通用定时器 #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include &quo…

无人机救援系统基本组成

无人机救援系统基本组成 1. 源由2. 组成2.1 无人机载具2.1.1 多旋翼2.1.2 垂起固定翼2.1.3 智能避障2.1.4 物资投递 2.2 智能吊舱2.2.1 云台2.2.2 高清摄像2.2.3 红外热成像2.2.4 激光测距2.2.5 目标跟踪 2.3 通讯链路2.3.1 超长距离通信2.3.2 长距离通信2.3.3 中等距离通信 2.…

CSS 复习

复杂选择器可以通过&#xff08;id的个数&#xff0c;class的个数&#xff0c;标签的个数&#xff09;的形式&#xff0c;计算权重。 如果我们需要将某个选择器的某条属性提升权重&#xff0c;可以在属性后面写!important&#xff1b;注意!importent要写在;前面 很多公司不允许…

uniapp一键打包

1.先安装python环境&#xff0c; 2.复制这几个文件到uniapp项目里面 3.修改自己证书路径&#xff0c;配置文件路径什么的 4.在文件夹页面双击buildController.py或者cmd直接输入buildController.py 5.python报错&#xff0c;哪个依赖缺少安装哪个依赖 6.执行不动的话&…

SINAMICS V90 在汽车行业中的应用-天拓四方

随着生活水平的提高&#xff0c;平均每家每户都配有一辆代步用的小汽车&#xff0c;汽车行业也正处于蓬勃的发展中&#xff0c;尤其是新能源汽车&#xff0c;带来了新一轮的汽车生产热潮。生产一辆汽车&#xff0c;从零配件的加工&#xff0c;到整车的组装&#xff0c;基本已经…

C++算法第五天

本篇文章继续和大家一起刷算法题 第一题 题目链接 . - 力扣&#xff08;LeetCode&#xff09; 题目解析 题目要求&#xff1a; 这是一个连续的子数组 计算子数组内元素的和&#xff0c;若数组内元素的和符合 > target的值并且该子数组的长度是最短的&#xff0c;则返回…

【电机控制器】以STC8H1K系列举例——持续更新

【电机控制器】以STC8H1K08 举例——持续更新 文章目录 [TOC](文章目录) 前言一、代填二、参考资料总结 前言 使用工具&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、代填 二、参考资料 STC8H1K系列数据手册 梁工——BLDC, 三相无…

如何快速给word文件里的文字加拼音?请看详细步骤

怎么快速给word文件里的文字加拼音&#xff1f;在日常的文字处理工作中&#xff0c;很多人可能会遇到一个问题&#xff1a;如何在Word文档中为文字添加注音。尤其是对于一些需要帮助读音的文本&#xff0c;比如中文学习材料、教材或儿童读物&#xff0c;注音可以帮助读者更好地…

AI跟踪报道第62期-本周AI新闻: 微软推出Copilot的AI Agent和Computer Control

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

C++学习:类和对象(一)

一、面向过程与面向对象编程 1. 什么是面向过程编程&#xff1f; 面向过程编程&#xff08;Procedural Programming&#xff09;是一种以过程&#xff08;或函数&#xff09;为中心的编程范式。程序被视为一系列按顺序执行的步骤&#xff0c;主要通过函数对数据进行操作 特点…

mac|maven项目在idea中连接redis

安装maven brew install maven idea-setting导入redis插件 idea新建maven项目 构建系统选择maven 项目右侧数据库图标导入redis 新建一个数据库&#xff0c;名称必须为数字&#xff0c;测试一下是否可以连接&#xff0c;连接成功后选择确定 pom.xml导入redis <depende…

开发了一个成人学位英语助考微信小程序

微信小程序名称&#xff1a;石榴英语 全称&#xff1a;石榴英语真题助手 功能定位 北京成人学士学位英语辅助学习工具&#xff0c;包含记高频单词&#xff0c;高频词组&#xff0c;专项练习&#xff0c;模拟考试等功能。 开发背景 个人工作需要提高学习英文水平&#xff…

GitLab代码仓管理安装配置使用

Gitlab介绍 GitLab是一个基于Git的开源项目管理工具&#xff0c;它集成了版本控制、代码审查、持续集成&#xff08;CI&#xff09;/持续部署&#xff08;CD&#xff09;、自动化测试等多种功能&#xff0c;是一个完整的DevOps平台。以下是对GitLab的详细介绍&#xff1a; 一…

C# Retry库

比如网络访问或硬件参数设置需要重试&#xff0c;可引用gunet上的Polly库。 同步方式&#xff08;每次重试有不同的时间间隔&#xff09; var polly Policy.Handle<Exception>().WaitAndRetry(new[] { new TimeSpan(0, 0, 1), new TimeSpan(0, 0, 2), new TimeSpan(0, …

[论文阅读] Improved Baselines with Visual Instruction Tuning

启发&#xff1a; 1、LLaVA-1.5和LLaVA以及其他大模型相比&#xff0c;做出了哪些改进&#xff1f; &#xff08;1&#xff09;使用CLIP-ViT-L-336px作为视觉编码器&#xff0c;使模型能处理336px的高分辨率图像&#xff0c;这使得模型能从图像中提取出更多细节信息。此外&am…

动态规划,就这几个问题最高频!

目录 前言 什么是动态规划 连续子数组最大和 连续子数组最大乘积 最长递增子序列 最长公共子序列 最长公共子串 不同子序列 结语 【摘要】 前言大家好&#xff0c;我是bigsai&#xff0c;好久不见&#xff0c;甚是想念(天天想念)&#xff01;很久前就有小伙伴被动态规划…

迭代加深搜索、启发式搜索、A*、IDA

目录 回顾/本期梗概 一、迭代加深搜索&#xff08;IDDFS&#xff09; 1、IDDFS基础知识 1&#xff09;什么是迭代加深搜索 2)迭代加深的基本结构 3)IDDFS和BFS比较优势是什么 4&#xff09;IDDFS中的复杂计算问题 二、A*算法 1、A*算法基础知识 1.什么是A*算法 2.A*算法的核心…