QT界面开发--我的第一个windows窗体【菜单栏、工具栏、状态栏、铆接部件、文本编辑器、按钮、主界面】

经过前面的铺垫,今天我们就开始我们图形化界面之旅了,我们的第一个窗体主要包括:菜单栏、状态栏、工具栏、铆接部件、还有Qt提供的一些主窗体的API。

第一部分:主界面(QMainWindow)

当创建好项目后,我们直接运行,看一下运行结果:

86a3d50e8d294b42afe094155642af4e.png

你会发现,这个界面是小小的一坨,看起来一点也不舒服,那我们就可以使用resize()方法来更改界面尺寸。代码如下:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{this->resize(600,400);//将界面尺寸设置为600*400
}

008d1d1b075045a2b59c475f92e574b7.png

 此时大小的问题我们解决了,如果我们不想这个尺寸被更改,我们可以使用,将窗体的尺寸固定

setFixedSize(this->size());//将当前大小固定

 然后还有一个问题就是这个窗体的标题不是我们想要的,我们如何改成我们想要的标题呢?

setWindowTitle("Stark系统");//设置窗体标题

49c227f1ed4f4b269226aa131d7fd591.png

设置之后,界面就是现在的效果了。更多内容可以查看Qt自带的帮助文档。

6bc7600bca2543b8b2ee911ee95b8ad3.png

第二部分:菜单栏 (QMenuBar)

菜单栏(QMenuBar)是用于在应用程序的窗口顶部显式菜单的组件。一般一个窗口最多拥有一个菜单栏。我们的菜单栏的设置需要有以下几个步骤:

1.在主窗口创建菜单栏

如果我们选择使用 QMenuBar * mBar=new QMenuBar(this); 的话,设置出来的菜单栏没有任何设置,非常的丑陋,要我们亲自去设计也可以,那就非常麻烦,所以Qt就为我们提供了一套方法:

    // //第一步:创建菜单栏并接收QMenuBar * menuBar = menuBar();// //第二步:将菜单栏设置到该窗口内setMenuBar(menuBar);

设置好后点击运行,没有出现任何改变,不要慌张,不要着急,这是因为菜单栏中什么也没有。我们需要添加菜单项在菜单栏中。

2.添加菜单到菜单栏 

使用QMenu来创建菜单,然后将其添加到菜单栏。主要的流程如下:

    // //第三步:创建菜单项QMenu * fileMenu=new QMenu("文件");QMenu * editMenu=new QMenu("编辑");QMenu * helpMenu=new QMenu("帮助");// //第四步:将菜单项加到菜单栏中menuBar->addMenu(fileMenu);menuBar->addMenu(editMenu);menuBar->addMenu(helpMenu);

这样的话,我们就创立了三个菜单项:文件、编辑、帮助。并添加到了菜单栏menuBar中 。此时看一下运行的效果是怎样的:

916fe8d36a59446d99c7cdf726aa084f.png

ok,此时窗体中就有了一个菜单栏,其中的菜单项根据你的实际需求进行添加。我们可以对比一下Qt的菜单栏:

9ca4f8dd71914672a6165c5e4f798983.png

 Qt界面提供了九个菜单项。每个菜单项下又有一些子项,这些子项是什么?这些子项被称为动作。类型是QAction。

3.添加动作到菜单

我们可以声明几个动作来放到文件菜单下:

    // //第五步;创建活动项QAction * newAction=new QAction("新建文件");QAction * openAction=new QAction("打开文件");QAction * saveAction=new QAction("保存文件");// //第六步:将活动项加到菜单项下fileMenu->addAction(newAction);fileMenu->addAction(openAction);fileMenu->addAction(saveAction);

此时我们的【文件】菜单下就有了新建文件、打开文件、保存文件三个动作。这些动作实际起作用其实就需要我们使用connect来进行组件之间的信号与槽的关联。

除此以外,我们还可以添加分隔符、子菜单:

    //第七步:添加分隔符与子菜单fileMenu->addSeparator();fileMenu->addMenu(new QMenu("无效项"));

此时我们的运行观察结果:

c7128ce138dc4b4ca1838f8ba82e7914.png

ok,越来越像样了。

在这里,我们需要注意的是,千万不要忘了引用头文件

#include <QMenuBar>
#include <QMenu>
#include <QAction>

实际上我们只需要引用第一个就可以了。

第三部分:工具栏(QToolBar)

工具栏(QToolBar)是一个可用于放置常用操作和功能按钮的界面组件,通常位于主窗口的顶部或侧边。工具栏可以显著提高用户体验,是的常用功能更易访问。

万事开头都是头文件:这次我们需要添加#include <QToolBar>

1.在主窗口创建工具栏

添加工具栏时我们直接使用new即可:

    //第一步:创建工具栏并接收QToolBar * toolBar=new QToolBar();//第二步:添加工具栏至该窗口//addToolBar(toolBar);addToolBar(Qt::ToolBarArea::LeftToolBarArea,toolBar);//设置默认停靠区域:左部//addToolBar(Qt::ToolBarArea::TopToolBarArea,tbar2);//设置默认停靠区域:顶部toolBar->setMovable(false);//固定区域,不可移动//tbar2->setFloatable(false);//不可悬浮,必须停靠某个区域

在第二步中我们可以看到我们使用的是addToolBar将工具栏toolBar添加到该窗口,这是因为,窗口中理论上最多只有一个菜单栏,所以使用set设置,工具栏可以有多个,所以使用add,这是非常讲究的。对于该接口,如果我们只传工具栏对象指针,默认将工具栏停靠在窗口上方,但我们可以多传一个参数来确定工具栏的默认停靠位置:

Qt::ToolBarArea::LeftToolBarArea,代表默认停靠在窗口的左侧,对应的还有上、下、右。为什么称为默认停靠区域呢?显然,工具栏可以拖拽,浮动。我们可以选择不让他浮动在窗口,必须停靠在窗口的一边,这个是QToolBar的接口:setFloatable(false),将浮动的(Floatable)属性设置(set)为false,也就是不可浮动。我们也可以选择不允许移动该工具栏:setMovable(false)。

2.添加动作到工具栏

工具栏上可以拥有一些动作,这些动作其实就是菜单下的动作,只不过这些动作比较常用,我们就将其单独列到工具栏,方便用户交互。当然,我们也可以添加一些菜单栏中的菜单中所没有的动作,这不违反语法和规定,这是允许的。下面我们看一下如何添加动作呢?其实与在菜单中添加动作一样(你可以理解为:一个菜单项就是一个折叠起来的工具栏)。

    //第三步:添加工具栏选项QAction* debugAction=new QAction("调试");QAction* helpAction=new QAction("帮助");//第四步:将选项加载至工具栏toolBar->addAction(debugAction);toolBar->addAction(helpAction);

此时来看一下运行效果:

dc80d8fd5fd34ceeb21bb6dc3cf3d83e.png

 当然,工具栏中也可以添加一些分隔符和一些像按钮一样的组件:

    toolBar->addSeparator();QPushButton *exitBtn = new QPushButton("退出",this);toolBar->addWidget(exitBtn);

再看效果图:

3b6ac7d26ce0424db93f5ff2a0dccf39.png

分隔符的存在是为了将不同的功能进行划分,而按钮的存在其实与动作的效果类似,只是进行connect时访问的信号不同,例如:

    //点击自添加退出按钮后,关闭窗口connect(exitBtn,&QPushButton::clicked,this,&QWidget::close);QMessageBox * msg=new QMessageBox(this);msg->setWindowTitle("提示");msg->setText("功能丰富,随便用。");//引发动作后,将弹出消息提示框connect(helpAction,&QAction::triggered,msg,&QWidget::show);

我们点击按钮时,触发的信号是点击:clicked。而动作不同,我们触发的信号是引发:triggered。

此外,二者也有其他的区别,比如按钮可以设置更的属性动作设置不了,类似背景色等的东西。

我们试着运行一下,测试效果:

17e2e1fbae0a4a838a1ca4c4fa42c819.png

点击退出后,窗口确实随之关闭了。

第四部分:状态栏(QStatusBar)

状态栏 (QStatusBar) 是一个用于显示应用程序当前状态的信息的组件,通常位于主窗口的底部。状态栏可以用来显示消息、进度信息或应用程序的状态等。一般一个窗口最多拥有一个状态栏。

创建状态栏的基本步骤:

前提:引用头文件:#include <QStatusBar>

1.在主窗口创建状态栏

创建状态栏也是new出来的。由于状态栏一般只有一个,所以我们添加的方法是set而非add。

    //第一步:建立状态栏QStatusBar * stBar=new QStatusBar();//第二步:设置到窗口setStatusBar(stBar);

 2.添加标签到状态栏

我们添加一个提示信息的标签,这是一个固定的信息,除非后续我们使用setText("");为标签的Text属性进行修改,我们的标签文本内容就是固定的了。创建时也是new,添加时我们使用添加组件的方法addWidget即可,将label组件加入即可。默认将标签设置到状态栏左侧,可以额外传入一个int类型的参数e4589aaa4e6a4b6cab041092962a4cc5.png。进行拉伸的话,默认的位置就会发生变动。如果使用addPermanentWidget方法,默认位置则是右侧,也可以传入int类型的参数,效果与前者相反。

    //第三步:添加标签QLabel * label_hint=new QLabel("系统提示信息:");//第四步:设置标签位置stBar->addWidget(label_hint);//默认放到左侧//stBar->addPermanentWidget(label_hint);//默认放到右侧

当然,我们也可以添加其它的小部件:如进度条、按钮等。

3.添加消息到状态栏

我们可以使用showMessage方法向状态栏显示一条消息:

stBar->showMessage("欢迎使用Stark系统!", 5000); // 消息显示5秒 

37135c559b3649a28761dd02eabd9f3e.png

 第四部分:文本编辑器

在窗口中心设置一个文本编辑器。

    //设置中心部件QTextEdit *textEdit=new QTextEdit(this);setCentralWidget(textEdit);

 af2abb38009f41abade6eb085efedef1.png

此时我们就可以在窗口内输入一些信息,如果我们对【保存文件】动作和 保存文本信息 进行信号与槽的连接的话,我们就实现了一个简单的word编辑器,当然了我们还需要对文本进行字体大小、色彩、背景、等东西进行修改才能逐步完善。但此时,我们已经有很大的进步了。

 第五部分:铆接部件

    QDockWidget *dockWidget=new QDockWidget("这是一个浮动窗口",this);addDockWidget(Qt::BottomDockWidgetArea,dockWidget);//默认停靠下方dockWidget->setAllowedAreas(Qt::BottomDockWidgetArea|Qt::TopDockWidgetArea);//只能上下停靠//dockWidget->setAcceptDrops(false);//不接受拖拽

 铆接部件是一个浮动窗口

ee002bff562c412db6ab95f9a63b11a9.png

如果在浮动窗口中加入一些功能,是不是感觉布局与VS有点像了呢?当然了,只是现在界面外表低配,只有实现connect以及自定义或提供的一些方法信号才能实现更强大的功能。


感谢观看

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

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

相关文章

logdata-anomaly-miner:一款安全日志解析与异常检测工具

关于logdata-anomaly-miner logdata-anomaly-miner是一款安全日志解析与异常检测工具&#xff0c;该工具旨在以有限的资源和尽可能低的权限运行分析&#xff0c;以使其适合生产服务器使用。 为了确保 logdata-anomaly-miner的正常运行&#xff0c;推荐安装了python > 3.6的…

Qt 文本文件读写与保存

Qt 文本文件读写与保存 开发工具&#xff1a;VS2013 QT5.8 设计UI界面&#xff0c;如下图所示 sample7_1QFile.h 头文件&#xff1a; #pragma once#include <QtWidgets/QMainWindow> #include "ui_sample7_1QFile.h"class sample7_1QFile : public QMainWin…

中国人寿财险青岛市分公司:保障民生,传递关爱

中国人寿财险青岛市分公司以保障民生为使命&#xff0c;传递关爱与温暖。 在健康险领域&#xff0c;公司为市民提供全面的医疗保障。从重大疾病保险到普通医疗保险&#xff0c;满足不同客户的需求。通过与医疗机构合作&#xff0c;为客户提供便捷的就医服务和理赔服务&#xf…

Linux下的文件IO操作

目录 1.前导 1.1文件知识 1.2对比一下文件操作和重定向 1.2.1输入重定向 1.2.2追加重定向 1.3当前路径 1.4stdin stdout stderr 2.文件操作的系统调用接口 2.1.open()打开文件 2.1.2.flags参数 2.1.3.mode参数 2.1.3 umask()函数 2.2.write()向文件写入 ​编辑 2…

【Kaggle | Pandas】练习1:创造、阅读和写作

文章目录 1. 创建DataFrame2. 创建数据表3. 创建可变Series表4. 读取csv 数据集5. 保存csv 文件 1. 创建DataFrame 在下面的单元格中&#xff0c;创建一个 DataFrame fruits &#xff0c;如下所示&#xff1a; import pandas as pd # Your code goes here. Create a datafr…

Javaee---多线程(一)

文章目录 1.线程的概念2.休眠里面的异常处理3.实现runnable接口4.匿名内部类子类创建线程5.匿名内部类接口创建线程6.基于lambda表达式进行线程创建7.关于Thread的其他的使用方法7.1线程的名字7.2设置为前台线程7.3判断线程是否存活 8.创建线程方法总结9.start方法10.终止&…

Spring《声明式事务》

知识点&#xff1a; Spring 声明式事务 1.基于注解和配置类的Spring-jdbc环境搭建 1. 准备项目&#xff0c;pom.xml <dependencies> <!--spring context依赖--> <!--当你引入Spring Context依赖之后&#xff0c;表示将Spring的基础依赖引入了--> …

七款主流图纸加密软件强力推荐|2024年CAD图纸加密保护指南

在当今信息化的设计行业&#xff0c;保护CAD图纸的知识产权和数据安全变得尤为重要。随着越来越多的企业采用数字化设计和共享文件&#xff0c;如何防止CAD图纸被未经授权的访问和窃取成为了许多设计师和企业关注的焦点。为此&#xff0c;选用合适的图纸加密软件是保护CAD文件安…

《数据结构》学习系列——树(下)

系列文章目录 目录 树和森林的遍历树的遍历森林的遍历基本算法递归先根遍历树迭代先根遍历树树和森林的层次遍历 压缩与哈夫曼树文件编码扩充二叉树哈夫曼树和哈夫曼编码哈夫曼树的基本思路哈夫曼编码 树和森林的遍历 树的遍历 先根遍历&#xff1a;先访问树的根结点&#x…

想作弊❓用这个发起考试,根本没法作弊

&#x1f389; 推荐一款超实用的在线考试神器 —— 土著刷题✨ 如果你正在寻找一个既方便又高效的在线考试平台&#xff0c;那么“土著刷题”小&#x1f34a;序绝对值得一试&#xff01;它不仅完全免费&#xff0c;而且操作简单&#xff0c;非常适合用来组织线上测试。 &#x…

使用Angular构建动态Web应用

&#x1f496; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4bb; Gitee主页&#xff1a;瑕疵的gitee主页 &#x1f680; 文章专栏&#xff1a;《热点资讯》 使用Angular构建动态Web应用 1 引言 2 Angular简介 3 安装Angular 4 创建Angular项目 5 设计应用结构 6 创建组件 7 …

「Java SPI机制应用快速入门」: 一种JDK内置的服务提供发现机制

文章目录 什么是SPISPI机制的应用使用方法使用规范 入门案例 什么是SPI SPI首先是一种机制&#xff0c;这个机制叫&#xff1a;服务提供发现机制。那是谁来负责发现呢&#xff1f;当然是JDK内置的服务帮助我们发现啦。发现了帮助我们去调用&#xff0c;我们要做的就是在中间去…

2024护理类科技核心期刊汇总(最新版)

2024年9月中国科技核心期刊目录&#xff08;2024年版&#xff09;正式公布&#xff0c;13本护理类期刊入选。常笑医学整理了这13本护理类科技核心期刊的详细参数&#xff0c;以及投稿经验&#xff0c;供大家在论文投稿时参考&#xff0c;有需要的赶紧收藏&#xff01; 1.《中华…

SwiftUI(四)- 布局(VStack、HStack、ZStack)

引言 页面的搭建和布局在应用开发中几乎占据了一半的代码量。定于iOS开发而言&#xff0c;相较于其它平台&#xff0c;UIKit的布局方式显得相对局限&#xff0c;通常只有绝对布局和相对布局两种方案。而在Flutter或者Android开发中&#xff0c;布局选项更为丰富&#xff0c;比…

【mod分享】极品飞车9冬日mod,支持光追,想体验一把冬天的Rockport市吗

各位好&#xff0c;今天小编给大家带来一款新的高清重置魔改MOD&#xff0c;本次高清重置的游戏叫《极品飞车9最高通缉》。 《极品飞车&#xff1a;最高通缉》作为一款2005年的游戏&#xff0c;《极品飞车&#xff1a;最高通缉》的画面效果还是可以的&#xff0c;效果全开之后…

【状态机DP】力扣1186. 删除一次得到子数组最大和

给你一个整数数组&#xff0c;返回它的某个 非空 子数组&#xff08;连续元素&#xff09;在执行一次可选的删除操作后&#xff0c;所能得到的最大元素总和。换句话说&#xff0c;你可以从原数组中选出一个子数组&#xff0c;并可以决定要不要从中删除一个元素&#xff08;只能…

手机拍证件照,换正装有领衣服及底色的方法

证件照在我们的职业生涯的关键节点是经常会用到的&#xff0c;比如毕业入职、人事档案建立、升迁履历、执业资格考试和领证等&#xff0c;这些重要的证件照往往要求使用正装照&#xff0c;有时候手头没有合适的衣服&#xff0c;或者原先的证件照背景色不符合要求&#xff0c;就…

numpy——数学运算

一、标量——矢量 import numpy as npa 3.14 b np.array([[9, 5], [2, 7]])print(a) print(b)# ---------- 四则运算 ---------- print(a b) # np.add print(a - b) # np.subtract print(a * b) # np.multiply print(a / b) # np.divide 二、矢量——矢量 import nump…

优选算法精品课--双指针算法(2)

双指针算法&#xff08;2&#xff09; 1、有效三角形的个数1.1 题目解析1.2 思路解析1.3 代码实现 2、和为s的两个数2.1 题目解析2.2 思路解析2.3 代码实现 3、三数之和3.1 题目解析3.2 思路解析3.3 代码实现 4、四数之和4.1 题目解析4.2 思路解析4.3 代码实现 5 总结 1、有效三…

4个提取音频办法,轻松实现视频转音频!

在信息爆炸的时代&#xff0c;视频内容以其直观、生动的特点占据了互联网的大半江山。然而&#xff0c;在某些场景下&#xff0c;我们可能更倾向于只听取音频部分&#xff0c;无论是驾驶途中听讲座、跑步时享受音乐视频中的纯音乐的场景&#xff0c;还是为了节省流量和存储空间…