[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+a
    QAction* 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每次按下按键都会创建一个对象,当一个程序在允许的时候,可能遇到了无数次点击,内存消耗会非常大,甚至出现内存泄露
    //所有要设置在对话框点击关闭的时候,调用用delete
    dialog->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:打开选择条⽬对话框

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

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

相关文章

无引擎游戏开发(2):最简游戏框架 | EasyX制作井字棋小游戏I

一、EasyX中的坐标系 不同于数理中的坐标系&#xff0c;EasyX中的y轴是竖直向下的 二、渲染缓冲区 之前的程序添加了这三个函数改善了绘图时闪烁的情况: 小球在"画布“上移动的过程就是我们在调用绘图函数&#xff0c;这个”画布“就是渲染缓冲区&#xff0c;先绘制的内…

【漏洞复现】致远OA webmail.do 任意文件下载 (CNVD-2020-62422)

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

摄影构图:人像摄影和风景摄影的一些建议

写在前面 博文内容涉及摄影中人像摄影和风景摄影的简单介绍《高品质摄影全流程解析》 读书笔记整理理解不足小伙伴帮忙指正 &#x1f603; 生活加油 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼前的风景已经和从前不一样…

C++ | Leetcode C++题解之第167题两数之和II-输入有序数组

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> twoSum(vector<int>& numbers, int target) {int low 0, high numbers.size() - 1;while (low < high) {int sum numbers[low] numbers[high];if (sum target) {return {low …

前端技术栈三(vue+Axios)

一、Vue 1 基本介绍 1.1 Vue 是什么? Vue (读音 /vjuː/&#xff0c;类似于 view) 是一个前端框架, 易于构建用户界面 Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或项目整合 支持和其它类库结合使用 开发复杂的单页应用非常方便 Vue 是…

海外优青ppt美化_海优ppt录音视频制作

海外优青 优秀青年科学基金项目&#xff08;海外&#xff09;旨在吸引和鼓励在自然科学、工程技术等方面已取得较好成绩的海外优秀青年学者&#xff08;含非华裔外籍人才&#xff09;回国&#xff08;来华&#xff09;工作&#xff0c;自主选择研究方向开展创新性研究&#xf…

在 Visual Studio 2022 (Visual C++ 17) 中使用 Visual Leak Detector

在 Visual C 2022 中使用 Visual Leak Detector 1 问题描述1.1 内存泄漏的困扰和解决之道1.2 内存泄漏检测工具的选择1.3 VLD的现状 2 安装和设置VLD的环境变量2.1 安装VLD文件2.2 VLD安装后的目录和文件说明2.2.1 include子目录说明2.2.2 lib子目录说明2.2.2.1 目录整理 2.2.3…

centOS Stream9配置NAT8网络

首先将VMware关机&#xff0c;添加网络适配器 启动虚拟机&#xff0c;查看ens192是否打开连接 安装的图形化需要查看右上角电源处网卡是否连接 最小化安装一般不会出现未连接的状态 使用ip a 查看 配置网卡文件 cd /etc/NetworkManager/system-connections/cd到当前目录下…

【stm32-新建工程-HAL库版本】

stm32-新建工程-HAL库版本 ■ HAL库版本目录■ Drivers■ Middlewares 文件夹&#xff0c; 同寄存器版本一样。■ Output 文件夹&#xff0c; 同寄存器版本一样。■ Projects 文件夹&#xff0c; 同寄存器版本一样。■ User 文件夹 ■ HAL库版本目录 ■ Drivers ① &#xff0c…

leetcode119 杨辉三角②

给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0 输出: [1]示例 3: 输入: rowIndex 1 输出: [1,1] pub…

【实战指南】SpringBoot结合Zookeeper/Nacos构建Dubbo微服务

1、微服务架构 微服务架构是一种设计复杂应用程序的方法&#xff0c;它提倡将单一应用程序开发为一组小型、独立的服务&#xff0c;每个服务运行在其自己的进程中&#xff0c;并通过轻量级通信&#xff08;通常是HTTP协议&#xff09;进行交互。每个服务都是围绕业务功能构建的…

绘唐3官网体验入口绘唐官网

绘唐3官网体验入口绘唐官网 绘唐3官网体验入口是指进入绘唐3官网的入口。绘唐是一款中国传统绘画软件&#xff0c;绘唐3是绘唐系列的最新版本。通过绘唐3官网&#xff0c;用户可以了解绘唐3的功能特点、下载安装包、查看新闻动态、参与社区讨论等。以下是绘唐3官网的体验入口&…

今年618各云厂商的香港服务器优惠活动汇总

又到了一年618年中钜惠活动时间&#xff0c;2024年各大云服务器厂商都有哪些活动呢&#xff1f;有哪些活动包括香港服务器呢&#xff1f;带着这些问题&#xff0c;小编给大家一一讲解各大知名厂商的618活动有哪些值得关注的地方&#xff0c;如果对你有帮助&#xff0c;欢迎点赞…

Spring Bean详解

Spring Bean作用域 默认情况下&#xff0c;所有的 Spring Bean 都是单例的&#xff0c;也就是说在整个 Spring 应用中&#xff0c; Bean 的实例只有一个 如果我们需要创建多个实例的对象&#xff0c;那么应该将 Bean 的 scope 属性定义为 prototype&#xff0c;如果 Spring 需…

【STM32】矩阵计算器

【STM32】矩阵计算器 资料链接请在文章末尾获取~ 1.说明 使用元器件&#xff1a;stm32f103c8t6最小系统板x1&#xff0c;0.96寸OLED显示屏四角x1&#xff0c;4x4矩阵按键x1; 参考&#xff1a;正点原子有关4脚OLED驱动float型数据的驱动文件&#xff0c;CSDN有关矩阵横向扫描…

【LeetCode:394. 字符串解码 + 栈 | 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

SpringMVC 写个 HelloWorld

文章目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式&#xff1a;warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求控制器5、创建springMVC…

NoMaD: Goal Masked Diffusion Policies for Navigation and Exploration

引言 机器人学习的背景和挑战 本文的研究重点 现有方法的局限性 本文的创新点 相关工作 事先准备 视觉目标条件策略 ViNT在目标条件导航中表现出最先进的性能&#xff0c;但它不能执行无方向探索&#xff0c;需要外部的子目标建议机制。Nomad扩展了Vint&#xff0c;同时支持目…

HMI之王 STM32H7S7

还要什么自行车啊 感谢原厂精彩培训和慷慨赠板&#xff01; 以下列示几个关注的点&#xff0c;计划做成系列&#xff0c;随缘更新&#xff0c;尽量填。 0&#xff09;1024*600分辨率配5寸触屏&#xff1b;Type-C with USB 2.0 HS interface, dual‑role‑power 终于不用2根线…

读AI新生:破解人机共存密码笔记06人工智能生态系统

1. 深蓝 1.1. “深蓝”的胜利虽然令人印象深刻&#xff0c;但它只是延续了几十年来显而易见的趋势 1.2. 国际象棋算法的基本设计是由克劳德香农在1950年提出的 1.2.1. 这一基本设计在20世纪60年代初实现了重大改进 1.2.2. 最优秀的国际象棋程序的等级评分稳步提高&#xff…