【Qt】窗口

目录

  • 一、概述
  • 二、菜单栏(QMenuBar)
  • 三、工具栏(QToolBar)
  • 四、状态栏(QStatusBar)
  • 五、浮动窗口
  • 六、对话框

一、概述

Qt窗口是通过QMainWindow类来实现的。
QMainWindow是一个为用户提供主窗口程序的类,继承自QWidget类,并且提供了一个预定义的布局。QMainWindow包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个浮动窗口(铆接部件) (dock widgets)、一个状态栏(status bar)和一个中心部件(central widget),它是许多应用程序的基础,如文本编辑器,图片编辑器等。如下图为QMainwindow中各组件所处的位置:
在这里插入图片描述

二、菜单栏(QMenuBar)

Qt中的菜单栏是通过QMenuBar这个类来实现的。一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。.

菜单栏中包含菜单.菜单中包含菜单项.

实例

代码实现菜单栏

需要注意的是,每个菜单栏选项被点击时,触发信号,QAction::triggred,我们可以用过槽函数实现我们想要的功能

请添加图片描述

效果

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<QMenuBar>
#include<QMenu>
#include<QAction>

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

    //创建一个菜单栏
    QMenuBar* menuBar = new QMenuBar();
    this->setMenuBar(menuBar);

    //创建菜单
    QMenu* menu_1 = new QMenu("文件");
    QMenu* menu_2 = new QMenu("编辑");
    QMenu* menu_3 = new QMenu("构建");

    //将菜单添加到菜单栏
    menuBar->addMenu(menu_1);
    menuBar->addMenu(menu_2);
    menuBar->addMenu(menu_3);

    //创建菜单栏选项
    QAction* action_1 = new QAction("新建文件");
    QAction* action_2 = new QAction("打开文件");
    QAction* action_3 = new QAction("保存文件");
    QAction* action_4 = new QAction("退出");

    //将菜单栏选项添加到菜单栏
    menu_1->addAction(action_1);
    menu_1->addAction(action_2);
    menu_1->addAction(action_3);
    menu_1->addAction(action_4);

    //给action添加信号槽函数
    connect(action_1,&QAction::triggered,this,&MainWindow::handle);
    connect(action_4,&QAction::triggered,this,&MainWindow::close);
}

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

void MainWindow::handle()
{
    qDebug()<<"new file";
}

代码实现菜单栏,给菜单设置快捷键

添加快捷键的方法很简单,只需要在创建菜单项的时候,菜单项的名字后面加个(&+添加的快捷键即可)

在这里插入图片描述

代码实现菜单栏,给菜单选项添加分割

在菜单项之间可以添加分割线。分割线如下图所示,添加分割线是通过QMenu 类提供的addSeparator()函数来实现;

在这里插入图片描述

代码实现菜单栏,给菜单选项添加分割

其实就是再一个菜单中使用addMenu继续添加菜单,像是往菜单栏中添加菜单一样

在这里插入图片描述

三、工具栏(QToolBar)

工具栏是应用程序中集成各种功能实现快捷键使用的一个区域 。可以有多个,也可以没有,它并不是应用程序中必须存在的组件。它是一个可移动的组件,它的元素可以是各种窗口组件,它的元素通常以图标按钮的方式存在。如下图为工具栏的示意图:
在这里插入图片描述
调用QMainWindow类的addToolBar()函数来创建工具栏,每增加一个工具栏都需要调用一次该函数。如添加一个工具栏并加入一个 QAction。

实例:

添加一个工具栏条目

在这里插入图片描述
将工具栏停靠左

可以在创建工具栏的同时指定停靠的位置,
也可以通过鼠标移动工具栏位置
通过QToolBar类提供的setAllowedAreas()函数来设置允许停靠的方式。

在创建工具栏的同时,也可以设置工具栏的位置,其默认位置是在窗口的最上面;如上述代码,默认在最上面显示。工具栏允许停靠的区域由QToolBar类提供的allowAreas()函数决定,其中可以设置的位置包括:

  • Qt::LeftToolBarArea停靠在左侧
  • Qt::RightToolBarArea停靠在右侧
  • Qt::TopToolBarArea停靠在顶部
  • Qt::BottomToolBarArea 停靠在底部
  • Qt::AllToolBarAreas 以上四个位置都可停靠

在这里插入图片描述
将一个action同时添加到菜单栏和工具栏

请添加图片描述

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<QToolBar>
#include<QMenuBar>

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

    //创建一个菜单栏
    QMenuBar* menu = this->menuBar();
    this->setMenuBar(menu);
    QMenu* menu_1 = new QMenu("文件(&F)");
    menu->addMenu(menu_1);

    //创建一个工具栏
    QToolBar* toolbar = new QToolBar();
    this->addToolBar(toolbar);

    QAction* action_1  = new QAction("保存");
    action_1->setIcon(QIcon(":/new/prefix1/save.png"));
    //将选项添加到工具栏
    toolbar->addAction(action_1);
    //将选项添加到菜单栏
    menu_1->addAction(action_1);
}
MainWindow::~MainWindow()
{
    delete ui;
}

四、状态栏(QStatusBar)

状态栏和菜单栏一样,如果创建项目的时候勾选了创建 ui 界面,那么就会自动生成一个状态栏。

在这里插入图片描述

代码:

在这里插入图片描述

实例

在状态栏中左侧添加一个控件

在这里插入图片描述
在状态栏中右侧添加一个控件

在这里插入图片描述

五、浮动窗口

在Qt中,浮动窗口也称之为铆接部件。浮动窗口是通过QDockWidget类来实现浮动的功能。浮动窗口一般是位于核心部件的周围,可以有多个。

要想给浮动窗口内部添加一些控件,需要创建一个单独的 QWidget ,把要添加的控件加入到 QWidget 中,然后再把这个 QWidget 设置dockWidget 中。

在这里插入图片描述

六、对话框

对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。Qt常用的内置对话框有: QFiledialog (文件对话框)、QColorDialog (颜色对话框)、QFontDialog(字体对话框)、QInputDialog (输入对话框) 和QMessageBox (消息框)

实例

在主窗口中点击按钮弹出对话框

在ui中添加一个按钮,设置对应的槽函数

void MainWindow::on_pushButton_clicked()
{
    //创建一个对话框
    QDialog* dialog = new QDialog(this);
    //调整对话框大小
    dialog->resize(400,300);
    //设置对话框标题
    dialog->setWindowTitle("对话框");
    //显示对话框
    dialog->show();

    //dialog随此Widget生命周期,如果频繁调用此接口,则频繁生成QDialog,会造成内存泄露
    dialog->setAttribute(Qt::WA_DeleteOnClose);
}

请添加图片描述
在主窗口中点击按钮弹出对话框,在对话框中添加一些控件

通过代码方式实现

需要自己实现一个类,在继承QDialog的基础上继续进行扩展
在这里插入图片描述
让该类继承QDialog
在这里插入图片描述
继续在其构造函数中添加一些控件
在这里插入图片描述
效果

请添加图片描述

通过代码+UI实现

第一步新建文件中点击,一路下一步
在这里插入图片描述
生成对应的类和ui文件
在这里插入图片描述
在dialog的ui中添加控件
在这里插入图片描述
在mainwindow的ui中添加控件
在这里插入图片描述

给对应的按钮添加槽函数
在这里插入图片描述
效果
请添加图片描述
模态和非模态

模态对话框指的是:显示后无法与父窗口进行交互,是一种阻塞式的对话框。使用QDialog::exec()函数调用。
模态对话框适用于必须依赖用户选择的场合,比如消息显示,文件选择,打印设置等。

非模态对话框显示后独立存在,可以同时与父窗口进行交互,是一种非阻塞式对话框,使用
QDialog:show()函数调用。

将上述代码的 show 函数改成 exec 函数,就是模态对话框。
运行程序,当窗口弹出后,无法操作父窗口

实例

模态
请添加图片描述
内置对话框

Qt提供了多种可复用的对话框类型,即Qt标准对话框。Qt 标准对话框全部继承于QDialog类。常用标准对话框如下:
在这里插入图片描述
1.消息对话框
消息对话框是应用程序中最常用的界面元素。消息对话框主要用于为用户提示重要信息,强制用户进行选择操作。
QMessageBox类中定义了静态成员函数,可以直接调用创建不同风格的消息对话框,其中包括:

在这里插入图片描述
实例

void MainWindow::on_pushButton_clicked()
{
    QMessageBox* messagebox = new QMessageBox(this);
    messagebox->setWindowTitle("提示");
    messagebox->setText("这是提示信息");
    messagebox->setIcon(QMessageBox::Warning);

    messagebox->setStandardButtons(QMessageBox::Ok|QMessageBox::Cancel);

    //添加按钮
    //QPushButton* button_1 = new QPushButton(this);
    //messagebox->addButton(button_1,QMessageBox::AcceptRole);

    //通过exec返回值,可以获取用户点击的
    int result =messagebox->exec();
    messagebox->setAttribute(Qt::WA_DeleteOnClose);
}

请添加图片描述

exec 函数是设定对话框是模态对话框,同时它也有一个返回值,返回值就是对话框被选中了哪个按钮的值。

在这里插入图片描述
2.颜色对话框

颜色对话框的功能是允许用户选择颜色。继承自QDialog类。

在这里插入图片描述
实例

void MainWindow::on_pushButton_clicked()
{
//这个函数静态函数,不必创建对话框对象就可直接使用
    QColor color = QColorDialog::getColor(QColor(255,0,0),this,"选择颜色");
    qDebug() << color;//这里只是简单答应,可以实现更为复杂的操作
}

在这里插入图片描述

3.文件对话框

文件对话框用于应用程序中需要打开一个外部文件或需要将当前内容存储到指定的外部文件。

使用 getOpenFileName 打开文件,getSaveFileName 保存文件。
此处的打开 / 保存的功能是需要我们额外去实现的,这里只是简单介绍一下。

实例

在这里插入图片描述
4.字体对话框

Qt中提供了预定义的字体对话框类QFontDialog,用于提供选择字体的对话框部件。
使用 getFont 函数弹出字体对话框

实例

在ui中添加一个button,添加槽函数

void MainWindow::on_pushButton_clicked()
{
    bool ok = false;
    //静态函数
    QFont font = QFontDialog::getFont(&ok);
    qDebug()<<"ok = "<<ok;
    //输出字体格式
    qDebug()<<font.family();
    qDebug()<<font.pointSize();
    qDebug()<<font.bold();

    ui->pushButton->setFont(font);
}

请添加图片描述

5.输入对话框

Qt中提供了预定义的输入对话框类: QInputDialog, 用于进行临时数据输入的场合。

有 getInt 函数输入一个整数,getDouble 函数输入一个浮点数,getItem 函数输入一个条目,可提前添加条目进行选择

实例

在ui中添加三个button,实现槽函数,该案例只是将获取到数据进行打印,也可实现更复杂的操作

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QInputDialog>
#include<QDebug>

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

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


void MainWindow::on_pushButton_clicked()
{
    int result = QInputDialog::getInt(this,"整数对话框","请输入一个整数");
    qDebug()<<result;
}

void MainWindow::on_pushButton_2_clicked()
{
    double result = QInputDialog::getDouble(this,"浮点数对话框","请输入一个浮点数");
    qDebug()<<result;
}

void MainWindow::on_pushButton_3_clicked()
{
    QStringList items;
    items.push_back("1");
    items.push_back("2");
    items.push_back("3");
    QInputDialog::getItem(this,"条目对话框","请输入条目",items);
    qDebug()<<items;
}

请添加图片描述

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

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

相关文章

用1/10的成本为节点运营者启用零认证下载

在Sui网络上运行的验证节点和完整节点需要具有最高水平的可靠性和运行时间&#xff0c;以便提供高吞吐量及区块链的可扩展性。可靠地运行有状态应用的关键部分&#xff0c;确保可以相对轻松地进行硬件故障转移。如果磁盘故障或其他类型的故障影响到运行验证节点的机器&#xff…

最新2024年增强现实(AR)营销指南(完整版)

AR营销是新的最好的东西&#xff0c;就像元宇宙和VR营销一样。利用AR技术开展营销活动可以带来广泛的利润优势。更不用说&#xff0c;客户也喜欢AR营销&#xff01; 如果企业使用AR&#xff0c;71%的买家会更多地购物。40%的购物者准备在他们可以在AR定制的产品上花更多的钱。…

记录实现水平垂直居中的5种方法

记录块级元素实现水平垂直居中的方法&#xff0c;效果如图。 <div class"parent"><div class"child">居中元素</div> </div><style> .parent {position: relative;width: 600px;height: 300px;background-color: #679389; …

每日一练 找无重复字符的最长子串

我们来看下这个题目&#xff0c;我们要统计的是不重复的子串&#xff0c;我们可以使用“滑动窗口法”&#xff0c;其实我们很容易就能想到思路。 我们的左窗代表我们目前遍历的开始&#xff0c;即我们遍历的子串的开头&#xff0c;右窗从左窗开始进行遍历&#xff0c;每次遍历…

【Redis持久化】RDB、ROB介绍和使用

RDB、ROB介绍和使用 引言ROB介绍配置指令介绍使用指令&#xff1a;dump文件修复指令快照禁用 AOF工作流程&#xff1a;文件重写&#xff1a;三种写回策略&#xff1a; 混合使用 引言 持久化的目的&#xff0c;其实就是在Redis重启或者中途崩溃的时候能够依靠自身恢复数据&…

Electron 读取本地配置 增加缩放功能(ctrl+scroll)

最近&#xff0c;一个之前做的electron桌面应用&#xff0c;需要增加两个功能&#xff1b;第一是读取本地的配置文件&#xff0c;然后记载配置文件中的ip地址&#xff1b;第二就是增加缩放功能&#xff1b; 第一&#xff0c;配置本地文件 首先需要在vue工程根目录中&#xff0…

蓝桥杯 本质上升序列

题目描述: 小蓝特别喜欢单调递增的事物。 在一个字符串中&#xff0c;如果取出若干个字符&#xff0c;将这些字符按照在字符串中的顺序排列后是单调递增的&#xff0c;则成为这个字符串中的一个单调递增子序列。 例如&#xff0c;在字符串 lanqiao 中&#xff0c;如果取出字符…

二维码门楼牌管理应用平台建设:构建智慧社区新生态

文章目录 前言一、二维码门楼牌管理应用平台概述二、公益报名功能的实现方式三、二维码门楼牌管理应用平台在智慧社区建设中的作用四、结论与展望 前言 随着科技的快速发展&#xff0c;智慧城市建设已成为现代城市管理的重要方向。二维码门楼牌管理应用平台作为智慧社区建设的…

算法系列--动态规划--特殊的状态表示--分析重复子问题

&#x1f495;"轻舟已过万重山!"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–算法系列–动态规划–特殊的状态表示–分析重复子问题 大家好,今天为大家带来的是算法系列--动态规划--特殊的状态表示--分析重复子问题 一.组合总数IV 链接…

Mybatis的动态SQL~

MyBatis有一个强大特性就是它的动态SQL。在实际项目开发中&#xff0c;经常需要根据不同条件拼接SQL语句&#xff0c;拼接时还要确保不能忘了必要的空格&#xff0c;有时候还要注意省掉列名列表最后的逗号...等等。在使用JDBC 或其他类似持久层框架操作数据库时&#xff0c;处理…

探索----------------阿里云

目录 一、阿里云四大件 1、云服务器ECS 2、云数据库RDS 3、负载均衡SLB 4、对象存储OSS 5、其他的云计算产品 1&#xff09;内容分发网络CDN 2&#xff09;专有网络 VPC 二、linux发行版本 三、你平时对系统会怎么优化&#xff08;五大负载&#xff09; 1、cpu 使用率…

记一次对Codis的无知引起的逻辑变更

先提前说明&#xff0c;对Codis的无知是因为Codis不支持一些Redis的命令&#xff0c;而这次的逻辑变更&#xff0c;就是因为使用了PUBLISH&#xff0c;而Codis又不支持PUBLISH导致的。 1. 前言 前段时间的一次需求中&#xff0c;因为设计到多个服务的注册问题&#xff0c;在项…

算法整理:排序

快速排序 首先不妨以第一个数为基准数&#xff0c;在一轮遍历后&#xff0c;使基准数左边的数都小于基准数&#xff0c;基准数右边的数都大于基准数。 当然也可以取中间的数为基准数。 void quick_sort(int q[],int l,int r){if(l>r)return;int i l;int j r;int xq[(lr)/…

类的函数成员(二):析构函数

一.定义 析构函数(destructor) 与构造函数相反&#xff0c;当对象结束其生命周期&#xff0c;如对象所在的函数已调用完毕时&#xff0c;系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作。 例如&#xff0c;在建立对象时用new开辟了一片内存空间&#xff0c;dele…

【LeetCode】三月题解

文章目录 [2369. 检查数组是否存在有效划分](https://leetcode.cn/problems/check-if-there-is-a-valid-partition-for-the-array/)思路&#xff1a;代码&#xff1a; [1976. 到达目的地的方案数](https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/) 思路…

005 高并发内存池_CentralCache设计

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;高并发内存池 &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 前言本文重点一、构建CentralCache结构二、运用慢开始反馈调节算法三、完成向CentralCache中心缓存申请四…

【讲解下Gitea】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

2024.3.30学习笔记

今日学习韩顺平java0200_韩顺平Java_对象机制练习_哔哩哔哩_bilibili 今日学习p295-p314 super关键字 super代表父类的引用&#xff0c;用于访问父类的属性、方法、构造器 super细节和语法 访问父类的属性&#xff0c;但不能访问父类的private属性 super.属性名 访问父类的…

STM32学习笔记(10_2)- I2C通信协议MPU6050简介

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 本期开…

【Java八股学习】Redis持久化 思维导图

说明 文章内容通过学习小林Coding内的优质文章后整理而来&#xff0c;整理成思维导图的方式是为了帮助自己理解、记忆和复习。如若侵权请联系删除&#xff0c;再次对小林Coding内的优质文章表示感谢。参考文章如下&#xff1a; AOF 持久化是怎么实现的&#xff1f;RDB 快照是…