QT的坐标系统,回收机制、菜单栏,工具栏,状态栏,对话框及资源文件

news2025/4/17 8:43:55

QT的坐标系统,回收机制、菜单栏,工具栏,状态栏,对话框及资源文件


文章目录

  • QT的坐标系统,回收机制、菜单栏,工具栏,状态栏,对话框及资源文件
  • 1、QT的坐标系统?
  • 2、对象模型
  • 3、内存回收机制
  • 4.、窗口的几个区域
  • 5、对话框
    • 1、对话框的基本概念
    • 2、自定义对话框分为模态对话框和非模态对话框。
    • 3、标准对话框
      • 1. QMessageBox模态对话框
      • 2、文件对话框
  • 6、资源文件
  • 7. 总结


1、QT的坐标系统?

QT的主窗口坐标是相对于屏幕的。当用move(0,0)时就是屏幕的原点。而子窗口的坐标系统是相对于父窗口的。
比如按钮的父类是窗口。那么按钮坐标系统是相对于窗口的。不包含边框。

#include "mainwidget.h"
MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    this->move(0,0); /* 窗口移动到0,0的位置 */
    this->resize(400, 300);
    button = new QPushButton(this);
    button->setText("确定");
    button->resize(100, 100);
}

以左上角为原点,X向右增加,Y向下增加。
在这里插入图片描述
如上窗口可以使用resize而按钮也可以使用呢?
所有窗口及窗口控件都是从QWidget直接或间接派生出来的。

2、对象模型

在这里插入图片描述
在这里插入图片描述

3、内存回收机制

所有窗口及窗口控件都是从QWidget直接或间接派生出来的。而QWidget又是继承QObject。所以new出来的控件只要指定父对象
都会形成对象数结构如下。当我们没有delete时系统会从上往下依次释放。
但是要满足两个条件:1. 指定父类 2. 直接或者间接继承与QObject
在这里插入图片描述
怎么证明呢?
用一个dome来证明
自定义一个类MyButton然后继承与QPushButton。那么MyButton也相当于一个按钮。然后在主窗口new MyButton对象。
当窗口关闭时。如果会释放一定会调用MyButton的析构函数。在析构函数里打印东西来确认。
mybutton.h

#ifndef MYBUTTON_H
#define MYBUTTON_H
#include <QPushButton>
class MyButton : public QPushButton
{
    Q_OBJECT
public:
    explicit MyButton(QWidget *parent = nullptr);
    ~MyButton();
};
#endif // MYBUTTON_H

mybutton.cpp

#include "mybutton.h"
#include <QDebug>
MyButton::MyButton(QWidget *parent)
    : QPushButton{parent}
{
}
MyButton::~MyButton()
{
    qDebug()<<"按钮被析构";
}

mainwidget.cpp

#include "mainwidget.h"
MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    this->move(0,0); /* 窗口移动到0,0的位置 */
    this->resize(400, 300);
    button = new MyButton(this); /* 在堆区申请了MyButton对象空间,但并没有释放 */
    button->setText("确定");
    button->resize(100, 100);
}

MainWidget::~MainWidget()
{
}

当窗口关闭时,会打印" 按钮被析构 "。说明会自动释放。

4.、窗口的几个区域

QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器等。在这里创建工程里要选择
QMainWindow作为基类。
在这里插入图片描述
mainwindow.cpp

#include "mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QDebug>
#include <QToolBar>
#include <QPushButton>
#include <QStatusBar>
#include <QLabel>
#include <QTextEdit>
#include <QDockWidget>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //1.菜单栏
    QMenuBar *mBar = menuBar();

    //添加菜单
    QMenu *pFile = mBar->addMenu("文件");

    //添加菜单项,添加动作
    QAction *pNew = pFile->addAction("新建");

    connect(pNew, &QAction::triggered,

            [=]()
            {
                qDebug() << "新建被按下";
            }

            );
    pFile->addSeparator(); //添加分割线·
    QAction *pOpen = pFile->addAction("打开");

    //2.工具栏,菜单项的快捷方式
    QToolBar *toolBar = addToolBar("toolBar");

    //工具栏添加快捷键
    toolBar->addAction(pNew);

    QPushButton *b = new QPushButton(this);
    b->setText("^_^");
    //添加小控件
    toolBar->addWidget(b);

    connect(b, &QPushButton::clicked,
            [=]()
            {
                b->setText("123");
            }
            );

    //3. 状态栏
    QStatusBar *sBar = statusBar();
    QLabel *label = new QLabel(this);
    label->setText("Normal text file");
    sBar->addWidget(label);
    //addWidget 从左往右添加
    sBar->addWidget(new QLabel("2", this));

    // addPermanentWidget 从右往左添加
    sBar->addPermanentWidget(new QLabel("3", this));

    //4. 核心控件
    QTextEdit *textEdit = new QTextEdit(this);
    setCentralWidget(textEdit);

    //5. 浮动窗口
    QDockWidget *dock = new QDockWidget(this);
    addDockWidget(Qt::RightDockWidgetArea, dock);

    //给浮动窗口添加控件
    QTextEdit *textEdit1 = new QTextEdit(this);
    dock->setWidget(textEdit1);
}

运行的结果:
在这里插入图片描述

总结:对于这个窗口区域无非就是add,set开头的函数。多看帮助文档。

5、对话框

1、对话框的基本概念

在这里插入图片描述

2、自定义对话框分为模态对话框和非模态对话框。

什么是模态与非模态?
在这里插入图片描述
模态与非模态的实现?
在这里插入图片描述
模态对话框和非模态对话框的举例

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{

    QMenuBar *mBar = menuBar();
    setMenuBar(mBar);
    QMenu *menu = mBar->addMenu("对话框");
    QAction *p1 = menu->addAction("模态对话框");
    connect(p1, &QAction::triggered,
            [=]()
            {
                QDialog dlg;
                dlg.exec(); /* 一直死循环 */
                qDebug() << "111111";
            }
            );

    QAction *p2 = menu->addAction("非模态对话框");
    connect(p2, &QAction::triggered,
            [=]()
            {
                QDialog *p = new QDialog;
                p->setAttribute(Qt::WA_DeleteOnClose);
                p->show();
            }
            );
 }

3、标准对话框

所谓标准对话框,是 Qt 内置的一系列对话框,用于简化开发。事实上,有很多对话框都是通用的,比如打开文件、设置颜色、打印设置等。这些对话框在所有程序中几乎相同,因此没有必要在每一个程序中都自己实现这么一个对话框。
Qt 的内置对话框大致分为以下几类:
在这里插入图片描述

1. QMessageBox模态对话框

包含关于,信息,问题,告警对话框。
在这里插入图片描述
QMessageBox模态对话框的举例

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{

    QMenuBar *mBar = menuBar();
    setMenuBar(mBar);
    QMenu *menu = mBar->addMenu("对话框");
    QAction *p1 = menu->addAction("关于对话框");
    connect(p1, &QAction::triggered,
            [=]()
            {
               QMessageBox::about(this, "about", "关于qt");
            }

            );

    QAction *p2 = menu->addAction("问题对话框");
    connect(p2, &QAction::triggered,
            [=]()
            {
               int ret = QMessageBox::question(this,
                           "question", "Are you ok?",
                              QMessageBox::Ok |
                                QMessageBox::Cancel);
                switch(ret)
                {
                case QMessageBox::Ok:
                    qDebug() << "i am ok";
                    break;
                case QMessageBox::Cancel:
                    qDebug() << "i am bad";
                    break;
                default:
                    break;
                }
            }

            );

}

2、文件对话框

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{

    QMenuBar *mBar = menuBar();
    setMenuBar(mBar);
    QMenu *menu = mBar->addMenu("对话框");
    QAction *p1 = menu->addAction("文件对话框");
    connect(p1, &QAction::triggered,
            [=]()
            {
               QString path = QFileDialog::getOpenFileName(
                           this,
                           "open",
                           "../",
             "souce(*.cpp *.h);;Text(*.txt);;all(*.*)"
                           );
               qDebug() << path; 
            }

            );
}

QFileDialog的参数
参数1: 父对象
参数2:文件对话框的标题
参数3:默认打开的路径
参数4:过滤器
返回值:选择文件的绝对路径

6、资源文件

在这里插入图片描述
在这里插入图片描述
点击“选择…”按钮,打开“新建 Qt 资源文件”对话框。在这里我们输入资源文件的名字和路径:
在这里插入图片描述
点击下一步,选择所需要的版本控制系统,然后直接选择完成。我们可以在 Qt Creator 的左侧文件列表中看到“资源文件”一项,也就是我们新创建的资源文件:
在这里插入图片描述
右侧的编辑区有个“添加”,我们首先需要添加前缀,比如我们将前缀取名为 images。然后选中这个前缀,继续点击添加文件,可以找到我们所需添加的文件。这里,我们选择 document-open.png 文件。当我们完成操作之后,Qt Creator 应该是这样子的:
在这里插入图片描述
接下来,我们还可以添加另外的前缀或者另外的文件。这取决于你的需要。当我们添加完成之后,我们可以像前面一章讲解的那样,通过使用 : 开头的路径来找到这个文件。比如,我们的前缀是 /images,文件是 document-open.png,那么就可以使用:/images/document-open.png找到这个文件。
这么做带来的一个问题是,如果以后我们要更改文件名,比如将 docuemnt-open.png 改成 docopen.png,那么,所有使用了这个名字的路径都需要修改。所以,更好的办法是,我们给这个文件去一个“别名”,以后就以这个别名来引用这个文件。具体做法是,选中这个文件,添加别名信息:
在这里插入图片描述
这样,我们可以直接使用:/images/doc-open引用到这个资源,无需关心图片的真实文件名。
如果我们使用文本编辑器打开 res.qrc 文件,就会看到一下内容:
在这里插入图片描述
我们可以对比一下,看看 Qt Creator 帮我们生成的是怎样的 qrc 文件。当我们编译工程之后,我们可以在构建目录中找到 qrc_res.cpp 文件,这就是 Qt 将我们的资源编译成了 C++ 代码。

7. 总结

主要介绍了QT的坐标系统、回收机制、窗口的区域(菜单栏,工具栏、核心区域、状态栏,浮动窗口)以及各种对话框与资源文件。

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

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

相关文章

顶帽运算在OpenCv中的应用

项目背景 假如我们拍了一张自拍&#xff0c;想为自己的照片添加一个酷炫的火星飞舞的效果&#xff0c;素材库中正好有一张火焰的照片&#xff0c;如果想去除图中的火焰&#xff0c;只保留火星效果&#xff0c;可以使用顶帽子算法 图片中的火星部分正好属于比周围亮一些的斑块…

知虾皮Shopee:东南亚最受欢迎的电子商务平台

在如今数字化时代&#xff0c;电子商务平台成为人们购物的首选方式。Shopee作为东南亚地区最受欢迎的电子商务平台&#xff0c;通过其多样化的商品、便捷的购物体验和创新的商业模式&#xff0c;迅速在该地区占据了重要地位。本文将详细介绍Shopee的特点和优势&#xff0c;以及…

《作家天地》期刊投稿邮箱投稿方式

《作家天地》是国家新闻出版总署批准的正规文学刊物。对各种流派的作品兼收并蓄&#xff0c;力求题材、形式、风格多样化&#xff0c;适用于发表高品质文学学术作品&#xff0c;科研机构的专家学者以及高等院校的师生等。具有原创性的学术理论、工作实践、科研成果和科研课题及…

spug发布问题汇总记录

问题导览 1. [vite]: Rollup failed to resolve import "element-plus" from "src/main.js". 项目框架简介 vue3viteelement-plus 解决方案 - 1. 配置淘宝镜像源&#xff1a;npm config set registry https://registry.npm.taobao.org/ - 2. npm inst…

20240104确认AIO-3399J的开发板适配ov13850摄像头不支持4K分辨率录像

20240104确认AIO-3399J的开发板适配ov13850摄像头不支持4K分辨率录像 2024/1/4 13:23 开发板&#xff1a;Firefly的AIO-3399J【RK3399】 SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab Android1…

Android kotlin build.gradle.kts配置

1. 添加 maven 仓库 1. 1. settings配置 1. 1.1. settings.gradle repositories {maven {url https://maven.aliyun.com/repository/public/}mavenCentral() }1. 1.2. settings.gradle.kts repositories {maven {setUrl("https://maven.aliyun.com/repository/public/…

Ubuntu 22.04/20.04 安装 SSH

OpenSSH 是安全远程通信的重要工具&#xff0c;提供了一种安全的方式来访问和管理服务器。对于那些计划在 Ubuntu 22.04 Jammy Jellyfish 或其较旧的稳定版本的 Ubuntu 20.04 Focal Fossa 上安装 SSH 并启用它的人来说&#xff0c;了解其功能和优势至关重要。 OpenSSH的主要特…

技术阅读周刊第十二期

年前最后一篇推送&#xff0c;提前祝大家新年快乐。 技术阅读周刊&#xff0c;每周更新。 历史更新 20231201&#xff1a;第八期20231215&#xff1a;第十期20231122&#xff1a;第十一期 Deno vs Go: Native hello world performance | Tech Tonic URL: https://medium.com/de…

TSINGSEE青犀智能分析网关V4视频智能分析在智慧幼儿园中的应用

一、背景需求 在科技浪潮的推动下&#xff0c;智慧化监管已然成为幼儿园管理发展的必然趋势。通过引入尖端技术手段&#xff0c;智慧幼儿园监管解决方案不仅显著提升了管理效率&#xff0c;更为孩子们的安全与健康筑起一道坚实的屏障。为了全方位守护幼儿的平安&#xff0c;幼…

java设计模式学习之【策略模式】

文章目录 引言策略模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用计算示例代码地址 引言 设想你正在玩一个策略游戏&#xff0c;每一个决策都会导致不同的游戏结局。同样地&#xff0c;在软件开发中&#xff0c;我们常常需要根据不同的场景或条件选择不同…

【c++————————构造函数和析构函数】

【c————————构造函数和析构函数】 欢迎阅读新一期的c模块————构造函数和析构函数 ✒️个人主页&#xff1a;-Joker- &#x1f3f7;️专栏&#xff1a;C &#x1f4dc;代码仓库&#xff1a;c_code &#x1f339;&#x1f339;欢迎大佬们的阅读和三连关注&#xff0c…

如何配置Zabbix告警邮件通知并基于GPT提供解决方案?

一、概述 时间来到2023年末&#xff0c;距离Open AI发布GPT-3.5&#xff0c;首次向公众推出ChatGPT已经整整过去了一年。如今&#xff0c;以ChatGPT为代表的人工智能模型已然被应用众多领域&#xff0c;当然也包括IT运维。在IT运维中&#xff0c;通过对接运维监控平台&#xff…

人生重开模拟器

前言&#xff1a; 人生重开模拟器是前段时间非常火的一个小游戏&#xff0c;接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏&#xff1a; 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 &#xff08;1&#xff09; 游戏开始的时…

【JAVA】深入了解 Java 中的 DelayQueue

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 Java中的DelayQueue是一个强大的工具&#xff0c;常用于处理需要延迟执行的任务或具有过期时间的元素。通过实现Delayed接口&#x…

MySQL慢查询日志分析(慢查询日志)

一、背景 &emsp;&emsp;MySQL的慢查询日志是MySQL提供的一种日志记录&#xff0c;他用来记录在MySQL中响应的时间超过阈值的语句&#xff0c;具体指运行时间超过long_query_time&#xff08;默认是10秒&#xff09;值的SQL&#xff0c;会被记录到慢查询日志中。 &em…

CAAC无人机操作证考证报名流程及白底证件照片制作方法

在这个无人机技术日新月异的时代&#xff0c;拥有一张CAAC民用无人机操作证不仅意味着你能够合法地在天空翱翔&#xff0c;也象征着你对飞行技术的尊重和对规章制度的遵守。如果你怀揣着成为无人机飞行员的梦想&#xff0c;那么&#xff0c;让我们一起揭开CAAC民用无人机操作证…

Docker安装Elasticsearch,kibana,ik分词器

安装elasticsearch 下载elasticsearch&#xff0c;查看版本&#xff1a;Elasticsearch Guide [8.11] | Elastic docker pull elasticsearch:7.17.16 查看镜像是否下载成功 docker images 创建网络&#xff0c;因为需要部署kibana容器&#xff0c;要让es和kibana容器互联 …

由浅入深理解C#中的事件

目录 本文较长&#xff0c;给大家提供了目录&#xff0c;可以直接看自己感兴趣的部分。 前言有关事件的概念示例​ 简单示例​ 标准 .NET 事件模式​ 使用泛型版本的标准 .NET 事件模式​ 补充总结 参考前言 前面介绍了C#中的委托&#xff0c;事件的很多部分都与委托…

MySQL——事物

目录 一.发现问题 二.什么时事物 三.事务提交方式 四.事物的常规操作方式 五. 事务隔离级别 1.如何理解隔离性 2.隔离级别 3.查看与设置隔离性 4.读未提交【Read Uncommitted】 5.读提交【Read Committed】 6.可重复读【Repeatable Read】 7.串行化【serializabl…

A01、class文件简要说明

关于 .class 文件的相关结构说明 1、字节码文件相关名词 类型名称数量u4magic1u2minor_version1u2major_version1u2constant_pool_count1cp_infoconstant_poolconstant_pool_count - 1u2access_flags1u2this_class1u2super_class1u2interfaces_count1u2interfacesinterfaces_c…