首页 > 其他分享 >QT窗口类

QT窗口类

时间:2024-07-11 10:19:18浏览次数:8  
标签:窗口 QT 对象 QObject 坐标 QWidget Qt

1 窗口基类

我们在通过Qt向导窗口基于窗口的应用程序的项目过程中倒数第二步让我们选择跟随项目创建的第一个窗口的基类, 下拉菜单中有三个选项, 分别为: QMainWindow、QDialog、QWidget如下图:

image

常用的窗口类有3个
在创建Qt窗口的时候, 需要让自己的窗口类继承上述三个窗口类的其中一个
QWidget
所有窗口类的基类
Qt中的控件(按钮, 输入框, 单选框…)也属于窗口, 基类都是QWidget
可以内嵌到其他窗口中: 没有边框
可以不内嵌单独显示: 独立的窗口, 有边框
QDialog
对话框类, 后边的章节会具体介绍这个窗口
不能内嵌到其他窗口中
QMainWindow
有工具栏, 状态栏, 菜单栏, 后边的章节会具体介绍这个窗口
不能内嵌到其他窗口中

2 窗口的显示

内嵌窗口
依附于某一个大的窗口, 作为了大窗口的一部分
大窗口就是这个内嵌窗口的父窗口
父窗口显示的时候, 内嵌的窗口也就被显示出来了
不内嵌窗口
这类窗口有边框, 有标题栏
需要调用函数才可以显示

// QWidget是所有窗口类的基类, 调用这个提供的 show() 方法就可以显示将任何窗口显示出来
// 非模态显示
void QWidget::show();	// 显示当前窗口和它的子窗口

// 对话框窗口的非模态显示: 还是调用show() 方法
// 对话框窗口的模态显示
[virtual slot] int QDialog::exec();

3 坐标体系

在Qt关于窗口的显示是需要指定位置的,这个位置是通过坐标来确定的,所有坐标的选取又都是基于坐标原点来确定的,关于这些细节的确定,下面依次给大家进行讲解。

3.1 窗口的坐标原点

所有坐标的确定都需要先找到坐标原点, Qt的坐标原点在窗口的左上角
x轴向右递增
y轴向下递增

image

3.2 窗口的相对坐标

在一个Qt窗口中一般都有很多子窗口内嵌到这个父窗口中,其中每个窗口都有自己的坐标原点,子窗口的位置也就是其使用的坐标点就是它的父窗口坐标体系中的坐标点。
image
在Qt的某一个窗口中有可能有若干个控件, 这个控件都是嵌套的关系

A窗口包含B窗口, B窗口包含C窗口
每个窗口都有坐标原点, 在左上角

子窗口的位置是基于父窗口的坐标体系来确定的, 也就是说通过父窗口左上角的坐标点来确定自己的位置
Qt中窗口显示的时候使用的相对坐标, 相对于自己的父窗口

将子窗口移动到父窗口的某个位置

// 所有窗口类的基类: QWidget
// QWidget中提供了移动窗口的 API函数
// 参数 x, y是要移动的窗口的左上角的点, 窗口的左上角移动到这个坐标点
void QWidget::move(int x, int y);
void QWidget::move(const QPoint &);

4 内存回收

在Qt中创建对象的时候会提供一个 Parent对象指针(可以查看类的构造函数),下面来解释这个parent到底是干什么的。

QObject是以对象树的形式组织起来的。当你创建一个QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是 parent,也就是父对象指针。这相当于,在创建QObject对象时,可以提供一个其父对象,我们创建的这个QObject对象会自动添加到其父对象的children()列表。当父对象析构的时候,这个列表中的所有对象也会被析构。(注意,这里的父对象并不是继承意义上的父类!)

QWidget是能够在屏幕上显示的一切组件的父类。QWidget继承自QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的一个子组件。因此,它会显示在父组件的坐标系统中,被父组件的边界剪裁。例如,当用户关闭一个对话框的时候,应用程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该一起被删除。事实就是如此,因为这些都是对话框的子组件。

Qt 引入对象树的概念,在一定程度上解决了内存问题。

当一个QObject对象在堆上创建的时候,Qt 会同时为其创建一个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。

任何对象树中的 QObject对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent 的children()列表中删除;如果有孩子,则自动 delete 每一个孩子。Qt 保证没有QObject会被 delete 两次,这是由析构顺序决定的。

image
综上所述, 我们可以得到一个结论: Qt中有内存回收机制, 但是不是所有被new出的对象被自动回收, 满足条件才可以回收, 如果想要在Qt中实现内存的自动回收, 需要满足以下两个条件:

创建的对象必须是QObject类的子类(间接子类也可以)

QObject类是没有父类的, Qt中有很大一部分类都是从这个类派生出去的

Qt中使用频率很高的窗口类和控件都是 QObject 的直接或间接的子类
其他的类可以自己查阅Qt帮助文档
创建出的类对象, 必须要指定其父对象是谁, 一般情况下有两种操作方式:

// 方式1: 通过构造函数
// parent: 当前窗口的父对象, 找构造函数中的 parent 参数即可
QWidget::QWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
QTimer::QTimer(QObject *parent = nullptr);

// 方式2: 通过setParent()方法
// 假设这个控件没有在构造的时候指定符对象, 可以调用QWidget的api指定父窗口对象
void QWidget::setParent(QWidget *parent);
void QObject::setParent(QObject *parent);

标签:窗口,QT,对象,QObject,坐标,QWidget,Qt
From: https://www.cnblogs.com/checha/p/18295502

相关文章

  • QT入门
    1QT概述1.1什么是QT是一个跨平台的C++应用程序开发框架具有短平快的优秀特质:投资少、周期短、见效快、效益高几乎支持所有的平台,可用于桌面程序开发以及嵌入式开发有属于自己的事件处理机制可以搞效率的开发基于窗口的应用程序。Qt是标准C++的扩展,C++的语法在Qt......
  • Qt入门(C++)
    创建项目基类的选择对于基类的选择有三个选项,分别是QMainWindow、QWidget、QDialog基类说明QMainWindow主窗⼝类,⼀般⽤于较为复杂的应⽤程序,除了中央客⼾区界⾯,还包括菜单栏、⼯具栏、状态栏以及多个可停靠的⼯具对话框等QWidget最简单、最基本的窗体程序,⾥⾯可以放置多......
  • Qt信号与槽
    信号和槽是QT自行定义的一种通信机制,独立于标准的C/C++语言。信号与槽可以一对一、一对多、多对一。 信号(signals:)是无返回值、无函数体、可有参的函数(声明),被emit发出后无序地被对应的槽接收然后执行槽函数。槽(slots:)是普通的类成员函数。 信号与槽的绑定函数原型:boolQOb......
  • Day 10 逆波兰表达式求值,滑动窗口的最大值,前k个高频词
    逆波兰表达式求值逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。#include<iostream>usingnamespacestd;#include<stack>strings;intmain(){ strings; cin>>s; stack<int>u; for(inti=0;i<s.size();i++) { if(s[i]=='+'|......
  • C# 多显示器窗口控制详解
    写Winform程序的时候,有将一个窗口放置到特定的显示器,并且全屏的需求。于是借此机会,好好研究了一番这个Screen类[1],总结了一些方法。Windows的窗口逻辑首先我们需要知道窗口定位的逻辑。以2个窗口为例,下面的图片展示了显示器和坐标的对应关系。注意,使用深色模式可能看不清,可以点......
  • QtCreator使用Heob进行程序内存泄漏检测
    在Windows下,我们可以在QtCreator里使用Heob进行内存泄漏检测。下载到这里下载最新版的heob:【heob-heapobserver】下载后解压到某个文件夹下QtCreator使用heob新建一个Qt工程,然后写两句绝对导致内存泄漏的语句,并且要在profile或者debug模式下编译。然后选择Analyze--》......
  • opc ua设备数据 转MQTT项目案例
    目录1 案例说明 12 VFBOX网关工作原理 13 准备工作 24 配置VFBOX网关采集OPCUA的数据 25 用MQTT协议转发数据 46 配置参数说明 47 上报内容配置 58 其他说明 89 案例总结 81 案例说明设置网关采集OPCUA设备数据把采集的数据转成MQTT协议转发给其他系统。2 VFBOX......
  • PySide/PyQt中使网络请求更加方便简洁的实践
    众所周知,在PySide中,想要发送网络请求且不阻塞GUI线程,需要使用QNetworkAccessManager,但是这个东西用起来十分麻烦,需要写很多槽函数,而且必须要绑定在对象上,否则会报空指针。这种写法非常不优雅,而且让代码变得十分复杂。因此在写项目的实践中,我写了这样一个库,可以简化网络请求,特此分......
  • PySide/PyQt中使网络请求更加方便简洁的实践
    众所周知,在PySide中,想要发送网络请求且不阻塞GUI线程,需要使用QNetworkAccessManager,但是这个东西用起来十分麻烦,需要写很多槽函数,而且不能必须要绑定在对象上,否则会报空指针。这种写法非常不优雅,而且让代码变得十分复杂。因此在写项目的实践中,我写了这样一个库,可以简化网络请求,特......
  • 案例分享:Qt modbusTcp调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.0.0)
    前言  西门子PLC、台达PLC、法兰克机床等等多年以前玩得比较多,有tcp/ip通讯也有modbus通讯,modbus又分为网络,485,232等。  医疗项目,焊接机器人项目,工控机床项目,数控项目,物联网项目用的挺多的,将关键的通信技术抽离出来,单独弄成工具。  最近调绞车,遇到了modbustcp,正好有设......