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.mfbz.cn/a/290320.html

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

相关文章

uni-app 从入门到精通 3天快速掌握 文字版 学习专栏

大家好&#xff0c;我是java1234小锋老师。 近日锋哥又卷了一波课程&#xff0c;uni-app 从入门到精通 3天快速掌握教程&#xff0c;文字版视频版。三天掌握。 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从…

百度Apollo:自动驾驶的领航者

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 粉丝福利活动 ✅参与方式&#xff1a;通过连接报名观看课程&#xff0c;即可免费获取精美周边 ⛳️活动链接&#xf…

获取CNN/DM适用于评估Bart的格式的数据集(类似于test.source、test.source.tokenized)

项目场景&#xff1a; 复现文本摘要任务评估CNN/DM数据集 问题描述 abisee老哥的代码获取的是bin格式的数据集 时间久远&#xff0c;一些依赖的配置版本难以复现 笔者需要能评估Bart 格式的数据集 形式类似于test.source、test.source.tokenized 解决方案&#xff1a; 经过坚…

婴儿专用洗衣机哪个牌子比较好?高性价比婴儿洗衣机推荐

随着家中新生命的降临&#xff0c;一大批婴儿专用的物品也陆续进入到家中&#xff0c;虽然有很多东西确实能在育儿之路上提供很多帮助&#xff0c;不过也有一些东西“很坑”。婴儿洗衣机这一产品是专为有婴幼儿的家庭或者有特殊需求的人士所研发的&#xff0c;它的容量以及体积…

死锁的处理策略“预防死锁”-第三十七天

目录 前言 破坏互斥条件 破坏不剥夺条件 破坏请求和保持条件 静态分配法 破坏循环等待条件 顺序资源分配法 本节思维导图 前言 死锁的产生必须满足四个必要条件&#xff0c;只要其中一个或几个条件不满足&#xff0c;死锁就不会发生 破坏互斥条件 互斥条件&#xff1a;…

看这里!分享3个有关iPhone照片恢复的好用方法!

手机照片可以记录下我们所经历的点点滴滴&#xff0c;为我们留下宝贵的生活记忆。因此&#xff0c;我们应该珍惜并妥善保管这些照片。 但在使用手机的过程中难免会发生意外&#xff0c;手机照片丢失了怎么办&#xff1f;别着急&#xff01;今天&#xff0c;小编将为大家介绍有…

Linux 互相挂载远程服务器的硬盘

该操作最好保证两台服务器在 高速局域网路由的情况使用。 1.安装 sshfs sudo apt-get updatesudo apt-get install sshfs 2. 创建挂载点&#xff1a; mkdir /path/to/mount/point 3. 挂载远程文件系统&#xff1a; 使用以下命令将远程服务器上的文件系统挂载到本地创建的挂…

共享WiFi贴项目加盟可以解决商家哪些痛点?

近年来&#xff0c;共享WiFi贴项目在共享商业领域引起了广泛关注。作为一种便捷的网络分享工具&#xff0c;共享WiFi贴不仅受到很多人的青睐&#xff0c;更能够为商家带来诸多实际利益。那么&#xff0c;共享WiFi贴项目加盟究竟可以解决商家哪些痛点呢&#xff1f; 共享WiFi贴为…

跨境电商源码技术大揭秘:9个最常见的问题及解决方案

跨境电商发展迅猛&#xff0c;源码技术成为关键。作为跨境电商源码领域的专家&#xff0c;我将向大家揭秘9个最常见的问题及解决方案&#xff0c;帮助您更好地应对挑战&#xff0c;实现技术优化。 问题一&#xff1a;跨境电商源码性能瓶颈如何解决&#xff1f; 跨境电商源码性…

React实现简单登录

一 实现效果(样式是之前设置的&#xff09; 二 具体实现代码 2.1 Login.js import {useNavigate} from "react-router-dom"; import React from "react"; // import ./style2.cssfunction Login(){const navigateuseNavigate()func…

【数据仓库与联机分析处理】数据仓库

目录 一、数据仓库的概念 二、数据仓库与操作性数据库的区别 三、发展前期 四、数据仓库的系统结构 五、建模划分 六、主要案例 一、数据仓库的概念 目前很难给数据仓库&#xff08;Data Warehouse&#xff09;一个严格的定义&#xff0c;不准确地说&#xff0c;数据仓库…

用c语言以升序顺序显示15个单词,从键盘上输入15个单词,将其以升序顺序显示出来。(排序方法不限,单词不得雷同,而且单词须是正确的单词)

用c语言以升序顺序显示15个单词,从键盘上输入15个单词&#xff0c;将其以升序顺序显示出来。&#xff08;排序方法不限&#xff0c;单词不得雷同,而且单词须是正确的单词&#xff09; 以下是一个使用C语言实现的示例程序&#xff0c;可以从键盘上输入15个单词&#xff0c;并将它…

ES(Elasticsearch)的基本使用

一、常见的NoSQL解决方案 1、redis Redis是一个基于内存的 key-value 结构数据库。Redis是一款采用key-value数据存储格式的内存级NoSQL数据库&#xff0c;重点关注数据存储格式&#xff0c;是key-value格式&#xff0c;也就是键值对的存储形式。与MySQL数据库不同&#xff0…

python下载wheel并安装

一、查看当前python 版本兼容信息 pip debug --verbose C:\python\37>pip debug --verbose WARNING: This command is only meant for debugging. Do not use this with automation for parsing and getting these details, since the output and options of this command…

甜美温柔有气质的衬衫穿搭

衬衫可以说是一年四季都很好穿的时尚单品了 这次上新怎么少的了百搭经典的衬衫呢&#xff1f; 实用耐穿&#xff0c;怎么穿都好看 温柔气质淑女范儿&#xff0c;韩系氛围感拉满 翻领设计版型很正&#xff0c;穿在身上不会有松垮感 棉质面料。上身很舒适透气 可以搭配一个…

macbook录屏快捷键大全,教你快速录制视频

“有人知道macbook电脑有录屏快捷键吗&#xff0c;现在录屏的速度太慢了&#xff0c;每次打开都要浪费不少时间&#xff0c;要是有录屏快捷键&#xff0c;应该会快很多&#xff0c;有哪位大佬知道吗&#xff1f;教教我&#xff01;” 无论是在工作还是生活中&#xff0c;电脑已…

AI 编写完整工程代码:自然语言控制,AI 驱动开发 | 开源日报 No.135

gpt-engineer-org/gpt-engineer Stars: 47.6k License: MIT GPT-Engineer&#xff0c;AI 帮你写代码&#xff01; 工作流程&#xff1a; 通过自然语言指定软件AI 编写和执行代码引导 AI 优化改进 核心优势&#xff1a; 可以编辑 preprompts 文件来指定 AI 代理的 “身份”…

【云原生】Docker学习笔记

安装docker 系统信息&#xff1a; passnightpassnight-s600:/etc/apt/trusted.gpg.d$ cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.1 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04.1 LTS (Jammy Jellyfish)" VERSION_COD…

云计算:OpenStack 分布式架构管理FLAT网络(单控制节点与多计算节点)

目录 一、实验 1.环境 2.控制节点创建网络 3.控制节点创建规格 4.控制节点新增安全组入口规则 5.控制节点创建实例 二、问题 1.FLAT网络底层如何实现 2.无法SSH 云主机实例 一、实验 1.环境 (1) 主机 表1 主机 主机架构IP备注controller控制节点192.168.204.210已部…

听GPT 讲Rust源代码--compiler(5)

File: rust/compiler/rustc_resolve/src/rustdoc.rs rust/compiler/rustc_resolve/src/rustdoc.rs是Rust编译器中解析文档注释的模块。该模块处理Rust源代码中的文档注释&#xff0c;提取出有用的信息&#xff0c;例如函数、结构体、枚举的名称、说明、参数、返回值等。它的主要…
最新文章