qt三个窗口基本类

news2024/12/25 8:55:53

qt是一个gui框架,做图形用户界面的,本地可以跑,跟一些web框架那种做好点击网址跳转的不一样,python的web常用的flask和django,python也有gui框架比如pytqt和tkinter,这个专栏讲qt5,用c++写gui

qt三个窗口基本类

在创建项目的时候就是下面这三个

在这里插入图片描述

他们的关系如下:
在这里插入图片描述

  • 常用的窗口类有 3 个

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

4.2 窗口的显示

  • 内嵌窗口
    • 依附于某一个大的窗口,作为了大窗口的一部分
    • 大窗口就是这个内嵌窗口的父窗口
    • 父窗口显示的时候, 内嵌的窗口也就被显示出来了
  • 不内嵌窗口
    • 这类窗口有边框,有标题栏
    • 需要调用函数才可以显示
c++
// QWidget是所有窗口类的基类, 调用这个提供的 show() 方法就可以显示将任何窗口显示出来
// 非模态显示
void QWidget::show();	// 显示当前窗口和它的子窗口

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

给出示例代码:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; } //ui 界面的mainwindow类
QT_END_NAMESPACE

class MainWindow : public QMainWindow//QMainWindow Qt的基本窗口类
{
    Q_OBJECT// 这个宏是为了能够使用Qt中的信号槽机制

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;// 定义指针指向窗口的 UI 对象
};
#endif // MAINWINDOW_H

testwidget.h

#ifndef TESTWIDGET_H
#define TESTWIDGET_H

#include <QWidget>

namespace Ui {
class TestWidget;
}

class TestWidget : public QWidget
{
    Q_OBJECT

public:
    explicit TestWidget(QWidget *parent = nullptr);
    ~TestWidget();

private:
    Ui::TestWidget *ui;
};

#endif // TESTWIDGET_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "testwidget.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow) //窗口ui 被实例化了,ui界面也是个类其实
{
    ui->setupUi(this);//把cpp的mainwindow类和ui的绑定在一起

    //一般在qt的构造函数中进程初始化操作
    //显示当前窗口的时候,显示另一个窗口,TestWidget
    //我们就在MainWindow的构造函数里面构造TestWidget对象,main只调用MainWindow就行
    //创建窗口对象,没有给w对象指定父对象
    TestWidget* w=new TestWidget;
    w->show(); //显示窗口
}

MainWindow::~MainWindow()
{
    delete ui;
}

testwidget.cpp

#include "testwidget.h"
#include "ui_testwidget.h"

TestWidget::TestWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::TestWidget)
{
    ui->setupUi(this);
}

TestWidget::~TestWidget()
{
    delete ui;
}

入口函数:main

#include "mainwindow.h"

#include <QApplication>//应用程序类,后台维护了一个事件循环

int main(int argc, char *argv[])
{
    QApplication a(argc, argv); //创建了一个应用程序的对象,只有一个
    MainWindow w;   //创建了一个窗口对象
    w.show();        //显示窗口
    return a.exec();   //阻塞函数,程序进入了事件循环
}

Qdwidget类

我们去创建一个ui界面类
在这里插入图片描述

进去选择模板,我选择了一个基类空模板widget类,进去之后自动跳到ui界面,我们就可以拖动控件去定制自己想要的样子
在这里插入图片描述
在这里插入图片描述

这么写会发现就是两个窗口

改一下MainWindow构造函数如下:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow) //窗口ui 被实例化了,ui界面也是个类其实
{
    ui->setupUi(this);//把cpp的mainwindow类和ui的绑定在一起

    //一般在qt的构造函数中进程初始化操作
    //显示当前窗口的时候,显示另一个窗口,TestWidget
    //我们就在MainWindow的构造函数里面构造TestWidget对象,main只调用MainWindow就行
    //创建窗口对象,没有给w对象指定父对象,他就是独立窗口
    //想要显示他,就得show一下
#if 0
    TestWidget* w=new TestWidget;
    w->show();
#else   //指定父对象,他就不是单独的窗口了
        //这样的话当前父窗口显示的时候,子窗口就一并显示出来
        //这时候子窗口是没有边框的
        //只有独立窗口是有边框的
    TestWidget* w=new TestWidget(this);

#endif
}

会发现只有一个窗口,且窗口内嵌

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hpFOGE0A-1685551154091)(../AppData/Roaming/Typora/typora-user-images/image-20230531232002079.png)]

这样一会有边框一会没有,因为我们这个继承的是QWidget类,上面有讲他特性

我们在加个Qdialog类,看看效果

注意:qt里面这些类都是继承关系,你看传this,传的其实是父对象,也就是基类指针指向子类,达到多态的那种感觉

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow) //窗口ui 被实例化了,ui界面也是个类其实
{
    ui->setupUi(this);//把cpp的mainwindow类和ui的绑定在一起

    //一般在qt的构造函数中进程初始化操作
    //显示当前窗口的时候,显示另一个窗口,TestWidget
    //我们就在MainWindow的构造函数里面构造TestWidget对象,main只调用MainWindow就行
    //创建窗口对象,没有给w对象指定父对象
#if 0
    TestWidget* w=new TestWidget;
    w->show();
#else
    TestWidget* w=new TestWidget(this);
#endif
    
    TestDialog* dlg=new TestDialog(this);//对于他写不写父对象无所谓的,这个this
    //非模态
    dlg->show();
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1mFtjOTr-1685551154092)(../AppData/Roaming/Typora/typora-user-images/image-20230531233154528.png)]

注意非模态,对于多个子窗口是可以来回切换的

把TestWidget那块if取开,让他走上面那两句代码,因为那两句没有传父类widget对象,这样TestWidget窗口的就不会去嵌入主窗口,你在运行就会有三个窗口且来回鼠标可以去切换,点的动的!

而模态是什么呢?就是子窗口之间不能切换了

对于Dialog的模态模式,需要调用exec这个阻塞函数,跑下面代码,会发现没有主窗口,两个子窗口没法鼠标去切换,这就是模态。那是因为有exec这个函数存在,阻塞在那,dialog这个窗口不退出,相当于主窗口mainwindows没有构造成功,当你把dialog这个窗口关了,主窗口就出来了

这个模态也就dialog能调了,对了还有构造dialog的时候,那个this父类对象传不传都是可以的,对于mainwindowsnew构造的时候来说也是传不传this都一样,毕竟都是从widget继承来的,就widget传和不传才有什么独立和嵌套之分。我上面也有说他们区别

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow) //窗口ui 被实例化了,ui界面也是个类其实
{
    ui->setupUi(this);//把cpp的mainwindow类和ui的绑定在一起

    //一般在qt的构造函数中进程初始化操作
    //显示当前窗口的时候,显示另一个窗口,TestWidget
    //我们就在MainWindow的构造函数里面构造TestWidget对象,main只调用MainWindow就行
    //创建窗口对象,没有给w对象指定父对象
#if 1
    TestWidget* w=new TestWidget;
    w->show();
#else
    TestWidget* w=new TestWidget(this);
#endif

    TestDialog* dlg=new TestDialog(this);//对于他写不写父对象无所谓的,这个this
    //模态 ,得调一个函数exec(),阻塞程序执行
    dlg->exec();
     //写exec了show自动帮你调了一次show显示
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cx9HcFxv-1685551154092)(../AppData/Roaming/Typora/typora-user-images/image-20230531233813577.png)]

QMainWinow类

我们创建项目一开始的类,就是继承QMainWinow这个类,算是你的主窗口,菜单栏的这种,去对应的ui界面也能去拖动按钮,控件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8KGwD5u5-1685551154093)(../AppData/Roaming/Typora/typora-user-images/image-20230601000327961.png)]

Qt的坐标

坐标原点在左上角,从左上角向下向右递增

每个窗口都有一个坐标原点,但是点的位置都是基于父窗口的原点去移动构建的

比如父亲是(0,0),,有个儿子是(5,5),这个5,5是相对于父亲0,0的

儿子还有个儿子(10,10),这个(10,10)是相对于(5,5)来说的,相当于说是按照爷爷(0,0)偏移的(15,,15)这个位置

所以注意窗口嵌套的坐标位置都是基于父窗口的坐标系来算的

我们给主窗口构造函数加点控件看看:

#include "mainwindow.h"
#include <QPushButton>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow) //窗口ui 被实例化了,ui界面也是个类其实
{
    ui->setupUi(this);//把cpp的mainwindow类和ui的绑定在一起
    //创建一个按钮,作为当前窗口的子控件
    QPushButton *ba=new QPushButton(this);//内嵌进去
    //通过move去移动控件位置
    ba->move(10,10);  //x y
    //设置大小
    ba->setFixedSize(200,200);//宽度,高度

    QPushButton *ba1=new QPushButton(ba);//注意这里
    //通过move去移动控件位置
    ba1->move(10,10);  //相对于ba的位置
    //设置大小
    ba1->setFixedSize(100,100);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WoB4iKRx-1685551154094)(../AppData/Roaming/Typora/typora-user-images/image-20230601001431759.png)]

Qt自带内存回收

因为qt总是来回继承的,很多类都是qobject这个类的子类或者间接子类,qt后台继承会构建一颗继承树,,父类要析构就得先去析构子类,这下就明白吧。。不过这种内存回收前提就是这个类得继承在qobject这个对象树下

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

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

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

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

// 方式1: 通过构造函数
// parent: 当前窗口的父对象, 找构造函数中的 parent 参数即可 .h
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);

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

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

相关文章

WOWWEE ROVIO小车改造思路

23年5月接触到这个车&#xff0c;大约是07年的玩具&#xff0c;初看到外观&#xff0c;真的是惊艳&#xff0c;三爪着地&#xff0c;长长的脖子&#xff0c;有些科幻电影中外星生物的味道。这个ID设计&#xff0c;放到今天&#xff0c;也是能镇住国内一众玩具厂商的。惊讶之余&…

浅谈 ByteHouse Projection 优化实践

预聚合是 OLAP 系统中常用的一种优化手段&#xff0c;在通过在加载数据时就进行部分聚合计算&#xff0c;生成聚合后的中间表或视图&#xff0c;从而在查询时直接使用这些预先计算好的聚合结果&#xff0c;提高查询性能&#xff0c;实现这种预聚合方法大多都使用物化视图来实现…

基于javaweb jsp+SSM 简易版教务管理系统的设计与实现

目录 一.项目介绍 二.环境需要 三.技术栈 四.使用说明 五. 运行截图 六. 视频演示 一.项目介绍 本系统分为管理员、老师、学生三类 管理员&#xff1a;维护课程信息、维护老师信息、维护学生信息、密码重置&#xff08;其他账户&#xff09;、修改密码、退出系统 老…

macOS Sonoma 14.0 Beta 1 (23A5257q) ISO、IPSW、PKG 下载

macOS Sonoma 14.0 Beta 1 (23A5257q) ISO、IPSW、PKG 下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Li…

JVM暂时私有

Jvm: 一、类加载器分类 引导类加载器&#xff1a;BootStrapClassLoader&#xff08;出于安全考虑&#xff0c;Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类&#xff09;自定义类加载器&#xff1a;Extension ClassLoader AppClassLoader &#xff08;Tomcat也…

DBeaver 23.0.5发布

导读SQL 编辑器是一款功能强大的数据库管理工具&#xff0c;为用户提供了便捷的 SQL 编写和编辑功能。最近&#xff0c;该编辑器进行了多项更新&#xff0c;提升了使用体验。 首先&#xff0c;WHERE 和 SELECT 等自动完成功能现在显示与别名表的别名。用户可以使用键盘快捷键或…

https通信加密原理

为什么要用https HTTP 由于是超文本传输协议&#xff0c;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上&#xff0c;它是明文传输&#xff0c;不能保证数据的完整性&#xff0c;不能保证是否被窃听&#xff0c;不能保证数据是否被篡改 https采用了一些加解密&am…

安装银河麒麟操作系统

文章目录 一、安装银河麒麟操作系统1.1、简介1.2、银河麒麟高级服务器操作系统V101.3、下载银河麒麟镜像1.4、安装银河麒麟操作系统兼容版 一、安装银河麒麟操作系统 1.1、简介 银河麒麟&#xff08;KylinOS&#xff09;原是在863计划和国家核高基科技重大专项支持下&#xf…

HFish蜜罐部署教程(windows版)—HW蓝队主动防御利器

文章目录 前言基础环境蜜罐部署管理端部署添加节点&开启服务 攻击展示端口扫描测试目录扫描测试POC测试 && ssh测试失陷测试 酷炫大屏后记Tips 前言 一年一度的HW马上又要来了&#xff0c;【不过听说今年推迟了一些】 &#xff0c;各位师傅应该都按耐不住了&#…

Tcl-12. 数组

TCL支持通过数组的形式存储多个元素。 Tcl中的数组和其他高级语言的数组有些不同&#xff1a;Tcl 数组元素的索引&#xff0c;或称键值&#xff0c;可以是任意的字符串&#xff0c;而且其本身没有所谓多维数组的概念。数组的存取速度要比列表有优势&#xff0c;数组在内部使用散…

从理论上理解SQL注入、XSS、中间件解析漏洞、挖矿马

目录 1、SQL注入 &#xff08;1&#xff09;原理 &#xff08;2&#xff09;分类 &#xff08;3&#xff09;防御 2、XSS &#xff08;1&#xff09;原理 &#xff08;2&#xff09;分类 3、中间件&#xff08;解析漏洞&#xff09; &#xff08;1&#xff09;IIS6.X …

JDK安装教程

jdk 链接&#xff1a;https://pan.baidu.com/s/1xAFaR7AQdy_hPVFHc1CVnA 提取码&#xff1a;cypz 环境配置 1、我的电脑–》右键属性–》高级系统设置–》环境变量 2、系统变量–》新建系统变量–》完成后点击确定 变量名&#xff1a;JAVA_HOME 变量值&#xff1a;&#xff0…

chatgpt赋能python:Python中的分词技术及其应用

Python中的分词技术及其应用 什么是分词&#xff1f; 分词是自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;中的一个重要环节&#xff0c;指将一段文本切分成若干个单词或词组。在中文分词中&#xff0c;由于中文没有明显的词汇边界&#…

进入IT领域,多久能月入过万?

当下打拼的很多人都有这样的困惑&#xff1a;刚毕业或者工作时间不长&#xff0c;也有一些基本技能&#xff0c;对未来有美好憧憬&#xff0c;一身干劲&#xff0c;却拿着微薄的薪水过着捉襟见肘的生活。 有些同龄人进入IT领域后快速升职加薪&#xff0c;观望者经常会问&#…

C++设计模式之生成器模式(Builder)

文章目录 定义前言1. 问题2. 解决方案 结构适用场景实现方法优点缺点与其他模式的关系实例 定义 生成器是一种创建型设计模式&#xff0c;使你能够分步骤创建复杂对象。该模式允许你使用相同的创建 代码生成不同类型和形式的对象。 前言 1. 问题 假设有这样一个复杂对象&a…

100种思维模型之事物关系思维模型-72

具体的事物是形象的、容易观察和理解的&#xff0c;而事物间的关系则容易让人忽视&#xff0c;乃至无法意识到它正在发生作用。 生活中&#xff0c;我们习惯于低估事物关系的影响。 事物关系思维模型一个提醒我们关注事物关系、从宏观层面找到更好的工作方向、实现可持续发展的…

显示反馈与隐式反馈

文章目录 1. 数据分类2. 显性反馈数据模型评价方法&#xff1a;3. 显式反馈转换为隐式反馈4. 隐式反馈的作用5. 参考资料 本文来介绍一下显示反馈与隐式反馈&#xff0c;作为我学习推荐系统的笔记以便日后忘记了可以回过头来温习。 1. 数据分类 显式反馈是指&#xff1a;用户明…

光量子计算机+GPU!NVIDIA、Rolls-Royce和Classiq宣布取得技术突破

​ &#xff08;图片来源&#xff1a;网络&#xff09; 5月21日&#xff0c;英伟达&#xff08;NVIDIA&#xff09;、罗尔斯罗伊斯&#xff08;Rolls-Royce&#xff09;和以色列量子软件公司Classiq宣布了一项量子计算技术突破成果&#xff0c;旨在不断提高喷气发动机的效率。 …

AB32VG:(2)app.cbp工程源码阅读笔记(ADC按键和红外)

文章目录 1.SDK文件目录2.ADCKEY和红外遥控器相关源码2.1 初始化2.2 在定时器中断服务程序中查询按键 3. 更改参数以适应自己的ADC按键板3.1 我的ADC按键板硬件3.2 ADC值转换为键值 4.红外遥控器5. 相关配置 参考文章&#xff1a; 作者&#xff1a;nunu1010&#xff0c;中科蓝…

VSCode+Git+TortoiseGit+Tools

目录 一、Tools 1、VSCode(visual studio code)下载安装 VSCode使用技巧和经验 2、Git下载安装 3、TortoiseGit 简介 3.1、下载安装Git及Tortoisegit 3.2、Tortoisegit拉取gitee仓库到本地 3.3、Git拉取gitee仓库到本地 3.4、Git提交到gitee仓库 4、国内获取GitHub链…