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

news2024/11/22 11:55:41

前言

作者:小蜗牛向前冲

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

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

目录

 一、窗口的分类

二、菜单栏 

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:打开选择条⽬对话框

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

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

相关文章

最新!!单目深度估计方向文献综述--Monocular Depth Estimation: A Thorough Review

论文链接&#xff1a;https://ieeexplore.ieee.org/abstract/document/10313067 Abstract 一个是考虑人类深度感知的机制&#xff0c;另一个是包括各种深度学习方法。 这篇论文是关于单目深度估计&#xff08;Monocular Depth Estimation&#xff09;的全面综述&#xff0c;由…

Flutter第十三弹 路由和导航

目标&#xff1a; 1.Flutter怎么创建路由&#xff1f; 2.怎么实现路由跳转&#xff1f;页面返回&#xff1f; 一、路由 1.1 什么是路由&#xff1f; 路由(Route)在移动开发中通常指页面&#xff08;Page&#xff09;&#xff0c;在Android中通常指一个Activity。所谓路由管…

wsl报错在BIOS中启用虚拟化

解决&#xff1a; Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All 以高级管理员身份运行powershell&#xff0c;执行如上命令。

GoldWave软件下载 GoldWave 音频处理软件 v6.80.0 官方版下载附加详细安装步骤

准确来讲GoldWave软件防止GoldWave *原生音频插件被禁用。根据大数据结果显示回声效果&#xff1a;回声&#xff0c;顾名思义是指声音发出后经过一定的时间再返回被我们听到&#xff0c;就象在旷野上面对高山呼喊一样&#xff0c;在很多视频剪辑、配音中广泛采用&#xff0c; G…

最新版本IntelliJ IDEA安装与“坤活”使用

最新版本IntelliJ IDEA安装与“科学”使用 IntelliJ IDEA安装与坤活下载安装坤活idea1.将下面两个压缩文件解压到安装位置&#xff0c;注意路径不要包含中文空格等特殊符号2.双击 install-all-users.vbs &#xff0c;然后点击确定&#xff0c;等到出现 Done的弹窗3. 打开idea复…

【ajax基础04】form-serialize插件

目录 一&#xff1a;form-serialize插件 作用&#xff1a; 语法格式&#xff1a; 一&#xff1a;form-serialize插件 作用&#xff1a; 快速且大量的收集表单元素的值 例如上图对于多表单元素的情形&#xff0c;单靠通过”选择器获取节点.value”值的形式&#xff0c;获取…

Blazor 组件:创建、生命周期、嵌套和 UI 集成

在本文中&#xff0c;您将获得以下问题的答案。 什么是 Blazor 组件&#xff1f;如何使用组件&#xff1f;Blazor 组件的生命周期是什么&#xff1f;我们可以从一个组件调用另一个组件吗&#xff1f;如何创建 Blazor 组件&#xff1f;在组件中哪里写 C# 代码&#xff1f; 什么…

百度文心智能体平台(想象即现实):轻松上手,开启智能新时代!创建属于自己的智能体应用。

目录 1.1、文心智能体平台 1.2、创建智能体 1.3、智能体报名入口 1.4、古诗词小助手 1.5、访问我的智能体 在这个全新的时代里&#xff0c;人工智能技术正以前所未有的速度发展&#xff0c;渗透到我们生活的方方面面。无论是智能家居、自动驾驶&#xff0c;还是医疗诊断、…

漏洞挖掘 | 记一次src挖掘-小程序敏感信息泄露

权当是一次漏洞挖掘的思路分享 闲言 就现在的一个web漏洞挖掘强度还是非常高的&#xff0c;所以我们不妨把我们的眼光投向一个之前可能未曾涉及到的区域———小程序 是的微信小程序&#xff0c;这玩意的防范能力和过滤能力其实对比web方向是要弱小很多的 进入正题 以下就是…

如何设置Excel单元格下拉列表

如何设置Excel单元格下拉列表 在Excel中设置单元格下拉列表可以提高数据输入的准确性和效率。以下是创建下拉列表的步骤&#xff1a; 使用数据验证设置下拉列表&#xff1a; 1. 选择单元格&#xff1a; 选择你想要设置下拉列表的单元格或单元格区域。 2. 打开数据验证&…

充电学习—8、Type-C TCPC TCPCI

TCPC是usb Type-C port controller&#xff1b; 通用串行总线C型端口控制器 TCPCI是tcpc控制器接口规范&#xff1b; TCPC是个功能块&#xff0c;其中含有VBUS和VCONN的电源控制功能&#xff0c;CC信号的处理 逻辑&#xff0c;PD应用中的BMC物理层和协议层&#xff08;PD信息…

配置环境常规操作

一、看看显卡情况 1、看显卡驱动&#xff1a; nvidia-smi 2、验证cuda是否安装成功 nvcc -V 二、conda创建环境 conda create --name PatchCore_anomaly_detection python3.9 conda activate PatchCore_anomaly_detection 三、配置虚拟环境 cd C:\BaiduNetdiskDownload…

OSPF和RIP的路由引入(华为)

#交换设备 OSPF和RIP的路由引入 不同的网络会根据自身的实际情况来选用路由协议。比如有些网络规模很小&#xff0c;为了管理简单&#xff0c;部署了 RIP; 而有些网络很复杂&#xff0c;可以部署 OSPF。不同路由协议之间不能直接共享各自的路由信息&#xff0c;需要依靠配置路…

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

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

win 打包java项目为exe一键部署,包括mysql和redis

需求&#xff1a;打包springboot项目在win系统下执行&#xff0c;并且要一键部署和开机启动 把所需的程序放在同一个文件夹 1.jdk文件夹&#xff1a;自己去下载&#xff0c;jdk8的话拿jre目录好了 2.mysql文件夹&#xff1a;是8.0.36版&#xff0c;270M精简版了 3.redis文件夹…

Springboot整合Zookeeper分布式组件实例

一、Zookeeper概述 1.1 Zookeeper的定义 Zookeeper是一个开源的分布式协调服务&#xff0c;主要用于分布式应用程序中的协调管理。它由Apache软件基金会维护&#xff0c;是Hadoop生态系统中的重要成员。Zookeeper提供了一个高效且可靠的分布式锁服务&#xff0c;以及群集管理…

深入探讨:UART与USART在单片机中串口的实际应用与实现技巧

单片机&#xff08;Microcontroller Unit, MCU&#xff09;是一种集成了处理器、存储器和输入输出接口的微型计算机。它广泛应用于嵌入式系统中&#xff0c;用于控制各类电子设备。UART和USART是单片机中常见的通信接口&#xff0c;负责串行数据传输。下面我们详细介绍它们在单…

【机器学习系列】Python实战:使用GridSearchCV优化AdaBoost分类器及其基分类器

目录 一、AdaBoost的标准实现中是否支持使用不同类型的基分类器&#xff1f; 二、Adaboost的参数 三、Python实现Adaboost (一)导入库和数据集 &#xff08;二&#xff09; 划分训练集 &#xff08;三&#xff09;选择基分类器--决策树 &#xff08;四&#xff09;创建Ada…

数据结构_栈和队列

目录 一、栈 1.1 栈的使用 1.2 模拟实现栈 二、队列 2.1 队列的使用 2.2 环形队列 2.3 双端队列 总结 一、栈 栈是只允许在固定的一端进行元素的插入和删除操作的一种特殊线性表。其中进行元素的插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈遵循先进后…

MQTT服务器/MQTT_C#客户端/Websoket连MQTT

1 . 搭建MQTT服务器 找到上传中的 emqx-5.3.2-windows-amd64 打开bin如下: 链接: emqx-5.3.2-windows-amd64 如果安装失败 在上传中找到链接: VC_redist.x64.exe 安装。 正确后在浏览器输入 http://127.0.0.1:18083 会有如下mqtt服务端管理页面: 进入客户端认证,创建一个…