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

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.hqwc.cn/news/320873.html

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

相关文章

C#: 和时间相关,延时、获取系统时间、时间格式转换、定时器 等

说明&#xff1a;本文记录C# 和时间相关&#xff0c;延时、获取系统时间、时间格式转换、定时器 等&#xff0c;应用和代码。 1.延时函数 System.Threading.Thread.Sleep(20); //毫秒 1.1 主线程不卡延时函数 /* 主线程不卡延时函数 */public static void Delay_ms(int mil…

利用阿里云的尖端数据库解决方案增强游戏数据管理

在快节奏和动态的游戏世界中&#xff0c;对于努力为玩家提供无缝体验的公司来说&#xff0c;管理大量数据是一项关键挑战。阿里云是亚太地区的主要参与者&#xff0c;也是全球公认的运营数据库管理系统领导者&#xff0c;提供量身定制的创新解决方案&#xff0c;以应对游戏公司…

服务器为什么大多用 Linux?

服务器为什么大多用 Linux&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「Linux的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&#…

APP自动化测试工具:八款推荐解析

uiautomator2 github地址&#xff1a;github.com/openatx/uia… UiAutomator 是 Google 提供的用来做安卓自动化测试的一个 Java 库&#xff0c;基于 Accessibility 服务。功能很强&#xff0c;可以对第三方 App 进行测试&#xff0c;获取屏幕上任意一个 APP 的任意一个控件属…

imgaug库指南(二):从入门到精通的【图像增强】之旅

文章目录 引言前期回顾代码示例小结结尾 引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应…

【Redux】自己动手实现redux和react-redux

1. React提供context的作用 在class组件的世界里&#xff0c;如果后代组件共享某些状态&#xff0c;比如主题色、语言键&#xff0c;则需要将这些状态提升到根组件&#xff0c;以props的方式从根组件向后代组件一层一层传递&#xff0c;这样则需要在每层写props.someData&#…

【如何选择Mysql服务器的CPU核数及内存大小】

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容&#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…

提升代码托管,助力大数据学习!Git学习网站等你来挑战!

介绍&#xff1a;Git是一个开源的分布式版本控制系统&#xff0c;可以高效地处理各种规模项目的版本管理。它是Linus Torvalds为了帮助管理Linux内核开发而开发的开放源码版本控制软件。在Git中&#xff0c;你可以掌握工作区、暂存区和版本库等核心概念&#xff0c;并学会使用常…

VSCode远程连接centos

1 下载remote -ssh插件 2 在上方打开命令面板&#xff0c;输入>,再输入ssh&#xff0c;选择设置 Remote-SSH:Settings 那行 3 勾选下面这个选项 4 点击加号旁边的那个齿轮&#xff0c;选择.ssh\config ,配置连接信息&#xff0c;保存好后&#xff0c;刷新。 4 连接centos,然…

Spring Boot 完善订单【五】集成接入支付宝沙箱支付

1.1.什么是沙箱支付 支付宝沙箱支付&#xff08;Alipay Sandbox Payment&#xff09;是支付宝提供的一个模拟支付环境&#xff0c;用于开发和测试支付宝支付功能的开发者工具。在真实的支付宝环境中进行支付开发和测试可能涉及真实资金和真实用户账户&#xff0c;而沙箱环境则提…

[MySQL] 数据库的主从复制和读写分离

一、mysql主从复制和读写分离的相关知识 1.1 什么是读写分离? 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作( INSERT、UPDATE、DELETE) &#xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。…

weblogic中间件安装

1.下载jdk Java Archive Downloads - Java SE 6 下载jdk-6u45-linux-x64.bin 2.配置防火墙和SELINUX Redhat7操作系统配置防火墙&#xff0c;开放应用端口&#xff0c;例如7001&#xff1b; # firewall-cmd --permanent --add-port7001/tcp # firewall-cmd --reload 关闭selinu…