[Qt的学习日常]--窗口

前言

作者:小蜗牛向前冲

名言:我可以接受失败,但我不能接受放弃

  如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正

目录

 一、窗口的分类

二、菜单栏 

1、菜单栏基本知识

2、实战案例

 三、工具栏

1、基础知识

2、实战案例

四、 状态栏

五、浮动窗口

六、对话框 

1、简单介绍

2、二种自定义对话框的方式 

2.1、纯代码实现

2.2、图形化界面实现

3、 Qt内置对话框

3.1、 消息对话框 QMessageBox

 3.2、颜⾊对话框 QColorDialog

3.3、⽂件对话框QFileDialog

3.4、 字体对话框QFontDialog

​3.5、输⼊对话框QInputDialog


 本期学习:几中窗口属性:菜单栏,工具栏,状态栏,浮动窗口,对话框,在对话框中又细分了五种对话框

 一、窗口的分类

在前面学习QT的过程中,我们学习的都是用QWidget类来实现的,今天要要学习的窗口部件都是围绕的QMainWindow类来实现的。

下面将是我们要学习的重点组件

 QMainWindow是⼀个为用户提供主窗⼝程序的类,继承⾃QWidget类,并且提供了⼀个预定义的布局。QMainWindow包含⼀个菜单栏(menubar)、多个⼯具栏(toolbars)、多个浮动窗⼝(铆
接部件)(dockwidgets)、⼀个状态栏(statusbar)和⼀个中⼼部件(centralwidget),它是许多应
⽤程序的基础,如⽂本编辑器,图⽚编辑器等。如下图为QMainwindow中各组件所处的位置:

二、菜单栏 

1、菜单栏基本知识

Qt中的菜单栏是通过QMenuBar这个类来实现的⼀个主窗⼝最多只有⼀个菜单栏。位于主窗⼝顶部、主窗⼝标题栏下⾯。菜单栏中包含菜单.菜单中包含菜单项.

对于一个常用的操作是,我们先要通过QMenuBar的类来创建菜单栏

在堆上创建 

 

在通过 setMenuBar把菜单放入大窗口中。

 有需要的话我们还用通过addMenu函数来给菜单栏添加菜单。

 

添加好菜单后,一个菜单中可能存在多个选项,这个时候,我们通过QAction类抽出公众的动作,在进行菜单选项的添加。

 这里的QAction既可以给菜单栏用也可以给状态栏用。

 为了更好的区分菜单选项我们可以给菜单选择添加分割线,addSeparator函数实现。

 

2、实战案例

这里我们简单的创建一个菜单栏,在mainwindow.cpp中

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//设置标题this->setWindowTitle("记事本");//创建菜单栏
//    QMenuBar* menuBar = new QMenuBar(this);//这种写法如果,我们在最初勾选ui自动生成会出现内存泄露//更规范的写法QMenuBar* menuBar = this->menuBar();//这里表示如果QMenuBar存在就直接返回获取,不存在在创建新的在返回this->setMenuBar(menuBar);//创建菜单QMenu* menu = new QMenu("文件");menuBar->addMenu(menu);//创建菜单选项QAction* action1 = new QAction("保存(&a)");//这里文件(&a)是对这个菜单选项添加快捷键alt+aQAction* action2 = new QAction("加载(&b)");menu->addAction(action1);menu->addAction(action2);//创建中央控件
//    edit = new QTextEdit(this);
//    this->setCentralWidget(edit);
//    edit->setPlaceholderText("这里编写文本");}

 其中我们也可以给菜单选项添加快捷键都是通过&实现的

 三、工具栏

1、基础知识

工具栏是应⽤程序中集成各种功能实现快捷键使⽤的⼀个区域可以有多个,也可以没有,它并不是应⽤程序中必须存在的组件。它是⼀个可移动的组件,它的元素可以是各种窗⼝组件,它的元素通常以图标按钮的⽅式存在。如下图为⼯具栏的⽰意图

我们可以通过addToolBar函数来创建一个工具栏,每次创建工具栏都需要调用该函数

 工具栏不像菜单栏一般出现在窗口的顶部,他往往可以自己选择出现的位置。

有二种实现方式:
方式1:创建⼯具栏的同时指定其停靠的位置

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

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

方式2: 使⽤QToolBar类提供的setAllowedAreas()函数设置停靠位置。

这里简单区分一下:

第一种方式是默认工具栏所在的位置,当然在程序运行后,我们可以拖动改变。

第二种方式则运行停靠的位置 ,程序运行后,不可以拖动到不允许的地方。

如果我们不想让工具栏在程序运行后可以进行移动,通过设置⼯具栏的移动属性QToolBar类提供的setMovable()函数来设置。setMovable()函数原型为
 

void setMovable(bool movable)

  其中ture是移动,false是不移动.

当我们如果想把状态栏脱离父窗口,我们就要甚至浮动,可以通过QToolBar类提供的setFloatable()函数来设置。setFloatable()函数原型为:

void setFloatable(bool floatable)

 其中ture是浮动,false是不浮动

2、实战案例

 这里大家按照练习一下:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//设置窗口大小resize(800,600);//设置工具栏和位置,默认为窗口上面,这里设置为左边QToolBar* toolBar = new QToolBar(this);addToolBar(Qt::LeftToolBarArea,toolBar);//设置工具栏允许停靠的位置.只允许左右停靠toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);//设置工具栏的浮动属性toolBar->setFloatable(true);//设置工具栏的移动开关toolBar->setMovable(true);//设置工作栏的内容QAction * openAction = new QAction("open",this);QAction* newAction = new QAction("new",this);//添加toolBar->addAction(openAction);toolBar->addSeparator();//添加分割线toolBar->addAction(newAction);//在工具栏添加控件QPushButton * btn = new QPushButton(" 保存",this);toolBar->addWidget(btn);}

四、 状态栏

状态栏是应⽤程序中输出简要信息的区域。⼀般位于主窗⼝的最底部,⼀个窗⼝中最多只能有⼀个状态栏。在Qt中,状态栏是通过QStatusBar类来实现的。在状态栏中可以显⽰的消息类型有:

• 实时消息:如当前程序状态
• 永久消息:如程序版本号,机构名称
• 进度消息:如进度条提⽰,百分百提⽰

 状态栏的创建外面可以通过QMainWindow类提供的statusBar()函数来创建

我们还可以设置状态提示信息:如下代码 

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建状态栏QStatusBar* stbar = statusBar();//将状态栏置于窗口setStatusBar(stbar);//在状态栏中显示信息stbar->showMessage("hello pjb",2000);//在状态 栏中显示信息2s//显示永久信息要用标签来显示,显示在 状态栏的右侧QLabel* label = new QLabel("提示信息",this);stbar->addPermanentWidget(label);
}

 

五、浮动窗口

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

当我们点开某个网站的时候,常会出现很多个浮动窗口的广告,让我们感觉很难受,他的设置也是非常简单的。

 浮动窗⼝的创建是通过QDockWidget类提供的构造⽅法QDockWidget()函数动态创建的;⽰例如下

浮动窗口同样可以设置其出现的位置,可以通过QDockWidget类中提供setAllowedAreas()函数设置其允许停靠的位置。其中可以设置允许停靠的位置有

Qt::LeftDockWidgetArea停靠在左侧
Qt::RightDockWidgetArea停靠在右侧
Qt::TopDockWidgetArea停靠在顶部
Qt::BottomDockWidgetArea停靠在底部
Qt::AllDockWidgetAreas以上四个位置都可停靠

六、对话框 

1、简单介绍

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

 

当我在画板中退出时,会弹出一个QMessageBox(消息框)告诉我是否要进行文件的保存。

这里我们简单创建一个对话框

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QDialog* dialog = new QDialog(this);dialog->setWindowTitle("对话框标题");dialog->resize(400,300);//通过show方法调用显示对话框dialog->show();//diaglog每次按下按键都会创建一个对象,当一个程序在允许的时候,可能遇到了无数次点击,内存消耗会非常大,甚至出现内存泄露//所有要设置在对话框点击关闭的时候,调用用deletedialog->setAttribute((Qt::WA_DeleteOnClose));
}

2、二种自定义对话框的方式 

2.1、纯代码实现

首先要定义一个dialog.h的头文件

#ifndef DIALOG_H
#define DIALOG_H#include<QDialog>
class Dialog : public QDialog
{Q_OBJECT
public:Dialog(QWidget* parent);void handle();
};#endif // DIALOG_H

在dialog.cpp中实现自定义对话框

#include "dialog.h"
#include<QPushButton>
#include<QLabel>
#include<QVBoxLayout>Dialog::Dialog(QWidget* parent): QDialog(parent)
{//在Dialig对话框中添加控件QVBoxLayout* layout = new QVBoxLayout();this->setLayout(layout);QLabel* lable = new QLabel("这是一个对话框",this);QPushButton* button = new QPushButton("关闭",this);layout->addWidget(lable);layout->addWidget(button);connect(button,&QPushButton::clicked,this,&Dialog::handle);
}void Dialog::handle()
{this->close();
}

在mainwindow.cpp中实现点击按键触发stol函数,在函数中实现对话框的创建

void MainWindow::on_pushButton_clicked()
{Dialog* dialog = new Dialog(this);dialog->resize(400,300);dialog->setAttribute(Qt::WA_DeleteOnClose);dialog->show();
}

2.2、图形化界面实现

对图形化界面的实现,关键是实现一个dialog.ui文件

点击项目创建选择文件和类中的Qt设计师界面类

下面的一直选择默认的就好了 

这里会生成一个 dialog.ui文件

 

 点击进去,在这里就可以设计我们的对话框

 实现的效果如下:

这里对话框可以分为模态和非模态。

模态简单来说,弹出对话框时,用户无法在操作父态对话框,必须完成对话框的内部操作才可以进行操作(强迫用户继续选择操作)。

他的调用无非是调用对话框的时候使用exec:

而对于模态者是可以进行多次操作 

 

3、 Qt内置对话框

Qt提供了多种可复⽤的对话框类型,即Qt标准对话框。Qt标准对话框全部继承于QDialog类。常⽤标准对话框如下:

3.1、 消息对话框 QMessageBox

消息对话框是应⽤程序中最常⽤的界⾯元素。消息对话框主要⽤于为⽤⼾提⽰重要信息,强制⽤⼾进⾏选择操作

对于MessageBox他有二常用函数StandardButton 和Icon。

StandardButton 是 Qt 中定义的一组标准对话框按钮,常用于 QMessageBoxQInputDialog 等对话框类中。这些标准按钮提供了一组常用的按钮选项,如 "OK"、"Cancel"、"Yes"、"No" 等,以便在对话框中使用。StandardButton 通过枚举值来表示,可以用于设置对话框的按钮和处理用户的按钮点击事件。

在 PyQt 中,图标(Icon)可以用于许多控件,如按钮(QPushButton)、标签(QLabel)、窗口(QMainWindow)等。图标可以增强用户界面,使其更具吸引力和易用性。使用 QIcon 类,可以方便地设置和管理图标。 

QMessageBox类中定义了静态成员函数,可以直接调⽤创建不同⻛格的消息对话框,其中包括
 

这里我们点击按键的编写其槽函数

void MainWindow::on_pushButton_clicked()
{int result = QMessageBox::warning(this,"对话框的标题","对话框的文本",QMessageBox::Ok|QMessageBox::Cancel);if(result==QMessageBox::Ok){qDebug()<<"ok";}else{qDebug()<<"Cancel";}
}

 3.2、颜⾊对话框 QColorDialog

颜⾊对话框的功能是允许⽤⼾选择颜⾊。继承⾃QDialog类。颜⾊对话框如下图⽰:

对于getColor函数能够弹出一个模态对话框,用户选择颜色后,点击确认就可以关闭对话框。

void MainWindow::on_pushButton_clicked()
{//函数的返回值就是用户的选择颜色QColor color = QColorDialog::getColor(QColor(0,255,0),this,"选择颜色");qDebug()<<color;char style[1024] = {0};sprintf(style,"backgroud-color: rgb(%d,%d,%d)",color.red(),color.green(),color.blue());this->setStyleSheet(style);
}

 

这里使用的是RGB用0-1之间的小数表示。

3.3、⽂件对话框QFileDialog

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

其中有二个关键函数:

getOpenFileName打开文件

 getSaveFileName保存文件

通过这个二函数我们就可以打开或者保存文件

 编写槽函数

void MainWindow::on_pushButton_clicked()
{QString filePath =QFileDialog::getOpenFileName(this);qDebug()<<filePath;
}void MainWindow::on_pushButton_2_clicked()
{QString filePath =QFileDialog::getSaveFileName(this);qDebug()<<filePath;
}

 

3.4、 字体对话框QFontDialog

Qt中提供了预定义的字体对话框类QFontDialog,⽤于提供选择字体的对话框部件。

 运⾏效果如下:

3.5、输⼊对话框QInputDialog

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

这里可以让用户输入整数,浮点数,还可以是字符串(类似于下拉框)

双精度浮点型输⼊数据对话框:double getDouble
整型输⼊数据对话框:int getInt

选择条⽬型输⼊数据框:QStringgetItem

⽰例1:浮点型数据输⼊对话框

 ⽰例2:整型数据输⼊对话框

 ⽰例3:打开选择条⽬对话框

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全面了解虚拟线上会议室的核心功能和优势,助力企业高效协作

在现代办公环境中&#xff0c;虚拟线上会议室日益普及&#xff0c;成为企业沟通协作的重要工具。虚拟会议室的出现不仅简化了传统会议的复杂流程&#xff0c;还提供了一系列优势功能&#xff0c;提升了用户的会议体验。 一、虚拟线上会议室的优势功能 1、实时音视频会议 虚拟线…

全网最易懂,开源时序数据库influxDB,实际应用评测

前言&#xff1a; 当今是信息爆炸的时代&#xff0c;在处理高频数据时&#xff0c;关系型数据库oracle/mysql明显表现出乏力&#xff0c;因秒级、毫秒级高频数据&#xff0c;分分钟可以把关系型数据库的表塞爆。在日常生活工作中&#xff0c;我们经常会遇到哪些需要高频分析的场…

[自动驾驶 SoC]-3 英伟达Orin

NVIDIA Jetson AGX OrinTM series (资料来源&#xff1a;nvidia-jetson-agx-orin-technical-brief.pdf) 1 整体介绍 1) Orin SoC结构 Orin SoC&#xff0c;如下图所示&#xff0c;由一个NVIDIA Ampere architecture GPU, Arm Cortex-A78AE CPU, 下一代深度学习核视觉处理加速…

企业防盗版,如何保障上网安全

信息化的发展企业日常办公越来越依赖互联网。然而&#xff0c;终端及普通PC在访问互联网过程中&#xff0c;会面临各种不容忽视的风险。这些风险包括&#xff1a; 员工主动故意的数据泄漏&#xff1a;员工可能故意泄露敏感信息。后台应用程序外发信息&#xff1a;一些应用程序…

代码覆盖率:衡量测试的有效性

在软件开发领域&#xff0c;确保代码的可靠性和稳健性至关重要。实现这一目标的关键实践之一是通过测试。但是&#xff0c;测试本身需要进行测量和评估&#xff0c;以确保其有效性。这就是代码覆盖率发挥作用的地方。代码覆盖率是一种指标&#xff0c;它量化了测试期间程序源代…

遥感图像地物覆盖分类,数据集制作-分类模型对比-分类保姆级教程

遥感图像地物覆盖分类,数据集制作-分类模型对比-分类保姆级教程 在遥感影像上人工制作分类数据集采用python+gdal库制作数据集挑选分类模型(RF、KNN、SVM、逻辑回归)选择随机森林模型建模分类遥感图像预测在遥感影像上人工制作分类数据集 1.新建shp文件 地理坐标系保持和影像…

本地大模型服务 Ollama:从安装到使用

文章目录 前言一、下载安装1.1 官网安装1.2 压缩包安装1.3 docker 安装二、命令行使用2.1 常用命令2.2 模型列表2.3 使用三、Open-WebUI3.1 安装3.2 修改语言3.3 使用参考前言 Ollama 是专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计的开源框架,它有如下几个特点…

如何应对 Android 面试官 -> MVVM 实战一个新闻客户端 (上)

前言 本章我们基于重构的方式进行一个 MVVM 的实战&#xff0c;我们将一个新闻列表的普通实现&#xff0c;一步一步的改造成 MVVM 的架构模式&#xff0c;一共分为上中下三个章节&#xff1b; 传统方式实现 首先咱们来看具体实现的最终效果&#xff0c;就是一个新闻列表页面&a…

connect-caption-and-trace——用于共同建模图像、文本和人类凝视轨迹预测

介绍 论文地址&#xff1a;https://arxiv.org/abs/2105.05964 源码地址&#xff1a;https://github.com/facebookresearch/connect-caption-and-trace 在过去&#xff0c;计算机视觉和自然语言处理领域的模型和算法的发展只有偶尔的重叠&#xff0c;但近年来&#xff0c;这两…

python-04

str.spilt() str.spilt(str" ", num string.count(str)); str&#xff1a;分隔符&#xff0c;默认为所有的空字符&#xff0c;包括空格、换行符"\n"、制表符"\t"等。 num&#xff1a;分隔次数 str "小时候 总有他们在耳边叮咛嘱咐 小…

第四届人工智能、机器人和通信国际会议(ICAIRC 2024)

第四届人工智能、机器人和通信国际会议&#xff08;ICAIRC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 2024年12月27-29日 | 中国厦门 重要信息 会议官网&#xff1a;www.icairc.net 录用通知时间&…

▶《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch1 基本概念

PPT 截取有用信息。 课程网站做习题。总体 MOOC 过一遍 1、视频 学堂在线 习题 2、相应章节 过电子书 复习 3、总体 MOOC 过一遍 学堂在线 课程页面链接 中国大学MOOC 课程页面链接 B 站 视频链接 PPT和书籍下载网址&#xff1a; 【github链接】 onedrive链接&#xff1a; 【…

Python4 操作MySQL数据库

通过python的pymysql库连接到本地的MySQL数据库&#xff0c;并执行查询操作来获取数据&#xff0c;然后打印出每一行的数据&#xff0c;这里以一个简单的学生表为例进行介绍。 1. MySQL的安装与数据准备 首先需要安装MySQL&#xff0c;在安装完成之后使用Navicat与本地数据库…

Docker 部署项目,真的太雅了~

大家好&#xff0c;我是南城余&#xff01; 最近在找工作&#xff0c;正好手里有台服务器&#xff0c;之前项目上线用的宝塔部署项目上线&#xff0c;在公司实习了一年后&#xff0c;发现如今项目部署都使用的是容器化部署方案&#xff0c;也就是类似于和 Docker 一样的部署方案…

海外仓系统能解决海外仓哪些难题?海外仓标准化管理实用指南

海外仓管理问题常常导致业务流程变慢&#xff0c;根据我们的调查显示&#xff0c;至少有48%的海外仓每周都会出现一些“小意外”。甚至这些小问题每天都在发生&#xff0c;问题的出现已经严重影响到了海外仓业务的进行。今天我们将重点分析海外仓比较常见的一些问题&#xff0c…

springboot vue 开源 会员收银系统 (7) 收银台的完善 新增开卡 结算

前言 完整版演示 开发版演示 在前面的开发中&#xff0c;我们成功完成了商品分类和商品信息的搭建&#xff0c;开发了收银台基础。现在&#xff0c;我们将进一步完善收银台的功能&#xff0c;添加开卡和结算功能&#xff0c;并在后台实现会员卡的创建和订单保存。同时&#xff…

地瓜网络技术综合助手教你一键下载腾讯会议高清视频

当您错过腾讯会议的直播课程&#xff0c;不必担心&#xff0c;地瓜网络技术综合助手帮您轻松获取视频回放。 只需几个简单步骤&#xff0c;即可在手头保留珍贵的学习资料。 首先&#xff0c;启动地瓜网络技术综合助手&#xff0c; 进行软件初始化并开启监测功能。 接下来&…

智慧乡村和美人家信息化系统

一、简介 智慧乡村和美人家信息化系统是一个综合管理平台&#xff0c;集成了首页概览、一张图可视化、数据填报、智能评估、便捷申报、公开公示、任务管理、活动发布和灵活配置等功能。该系统不仅提升了乡村管理效率&#xff0c;也优化了家庭生活的便捷性。通过一张图&#xf…

BEVM背靠比特大陆打造新赛道,算力RWA成下一个千亿市场?

众所周知&#xff0c;在加密行业&#xff0c;每隔一段时间就会有一个新的概念或者一个新词出现&#xff0c;并引来社区和资本的追捧关注&#xff0c;笔者近期在浏览新闻时&#xff0c;发现了一个特别有意思的新概念——算力RWA&#xff0c;在社区引起了不少讨论。 该词最早出现…

Flutter【组件】按钮

简介 flutter 按钮组件。提供一种封装按钮组件的思路&#xff0c;并不支持过多的自定义属性。根据使用场景及设计规范进行封装&#xff0c;使用起来比较方便。 github地址&#xff1a;https://github.com/ThinkerJack/jac_uikit pub地址&#xff1a;https://pub.dev/package…