Qt窗口类部件

一、窗口类部件

窗口就是没有父部件的部件,所以又称顶级部件。窗口类主要包括基本窗口类QWidget、对话框类QDialog和主窗口类QMainWindow三种。

在这里插入图片描述

QObject是Qt框架中的一个核心基类,它提供了对象模型和信号槽机制。而QPaintDevice及其子类则提供了绘制和显示内容的功能。

Paint = 绘制、涂画

Device = 设备、载体

1、QObject类

QObject类是所有Qt类的基类,它提供了对象模型和信号槽机制。任何对象要实现信号与槽机制,都必须使用Q_OBJECT宏。因此不管是否真正用到信号与槽机制,最好在所有QObject子类中都使用Q_OBJECT宏,避免出现不必要的错误。

#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>class MyWidget:public QWidget
{Q_OBJECT
public:explicit MyWidget(QWidget *parent = nullptr);
};#endif // MYWIDGET_H
2、QWidget

Qt 中所有用户界面对象的基类,是最基本的可视元素。可以作为一个独立的窗口(顶级窗口部件)存在,或者作为另一个 QWidget 的子部件(嵌入式窗口部件)。

没有划分菜单、工具栏、状态栏、主窗口 等区域。

在这里插入图片描述

3、QMainWindow

是 QWidget的子类,包含菜单栏,工具栏,状态栏,标题栏等,中间部分则为主窗口区域。

在这里插入图片描述

4、QDialog

是 QWidget 的子类,用于与用户进行简短交互,如确认操作。

对话框在外观上和基本窗口相似。通常由标题栏、客户区、边框组成,标题栏上有关闭按钮。

在这里插入图片描述

二、基本窗口类QWidget

QWidget类是所有用户界面类的基类,也是所有可视组件(窗口部件)的基类,所有的窗口、按钮、标签、文本框等控件都是直接或间接从QWidget派生而来。

  • 既可以作为独立窗口存在,也可以作为另一个窗口部件的子部件嵌入其中。
  • 通常用于创建不带特定框架结构(如菜单栏、工具栏)的窗口或自定义界面组件。

创建QWidget窗口的代码示例:

#include "widget.h"            // 引入自定义的头文件(通常包含 QWidget 子类,如果没定义可以不需要)
#include <QApplication>        // 引入 QApplication 类,Qt 程序的入口类
#include <QWidget>             // 引入 QWidget 类,Qt 所有控件的基类
#include <QDebug>              // 引入 QDebug,方便调试时打印信息int main(int argc, char *argv[])
{QApplication a(argc, argv); // 创建 Qt 应用程序对象,接收命令行参数,管理整个 Qt 程序的运行环境QWidget w;                  // 创建一个 QWidget 窗口对象(窗口部件实例)w.setWindowTitle("这里是标题"); // 设置窗口的标题栏文字w.resize(300,200);          // 设置窗口的大小(宽 300,高 200),只影响用户区域,不包含标题栏和边框w.move(500,500);            // 将窗口移动到屏幕上的位置(左上角坐标为 x=500, y=500)w.setCursor(Qt::UpArrowCursor); // 设置鼠标指针的形状为“向上箭头”光标// w.setCursor(Qt::PointingHandCursor); // (另一种光标示例:手形光标)w.show();                   // 显示窗口(默认隐藏,必须调用 show() 才能在屏幕显示)return a.exec();            // 启动 Qt 事件循环,等待并处理用户操作(比如鼠标、键盘、窗口事件)
}
  • QApplication:整个 Qt GUI 程序必须有且只有一个,用来管理事件循环。
  • Cursor:(光标)
  • QWidget:最基础的窗口类,可以单独作为窗口,也可以作为控件嵌入其他窗口。
  • w.setXXX(...):调用 QWidget 提供的接口设置窗口属性。
  • w.show():把窗口显示出来。
  • a.exec():进入消息循环,没有它程序会一闪而过。
三、主窗口类QMainWindow

QMainWindow类的实例是一个可以设置菜单栏、工具栏、状态栏的主应用程序窗口。主要组成部分:

  1. 菜单栏 (Menu Bar): 位于窗口顶部,通常包含多个菜单。
  2. 工具栏 (Toolbars): 可以放置在窗口的顶部、底部或两侧,包含常用的按钮和控件。
  3. 状态栏 (Status Bar): 位于窗口底部,显示一些临时信息或状态。
  4. 中心窗口部件 (Central Widget): 位于主窗口的中央区域,可以放置任何 QWidget 子类的实例。这个中心窗口部件可以有自己的布局。

在这里插入图片描述

int main(int argc, char *argv[])
{QApplication a(argc, argv);     // 创建 Qt 应用程序对象,管理整个应用的事件循环和资源QMainWindow w;                  // 创建一个 QMainWindow 对象(主窗口),适合做应用的框架界面w.setWindowTitle("主窗口");      // 设置窗口标题为“主窗口”QMenuBar *bar = w.menuBar();    // 获取主窗口自带的菜单栏指针(QMainWindow 已经内置了菜单栏)// ====== 创建一个“文件”菜单(含快捷键 Alt+F)======QMenu *fmenu = new QMenu("文件(&F)");  // 创建“文件”菜单,&F 表示按 Alt+F 激活此菜单fmenu->addAction("新建文件");          // 在“文件”菜单里添加一个动作(菜单项)→“新建文件”fmenu->addMenu("访问最近文件");        // 在“文件”菜单里再添加一个子菜单 →“访问最近文件”// ====== 把“文件”菜单加入菜单栏 ======bar->addMenu(fmenu);                   // 将“文件”菜单添加到菜单栏bar->addMenu("编辑(&E)");              // 在菜单栏添加“编辑”菜单,快捷键 Alt+Ebar->addMenu("构建(&B)");              // 在菜单栏添加“构建”菜单,快捷键 Alt+Bbar->addMenu("调试(&D)");              // 在菜单栏添加“调试”菜单,快捷键 Alt+Dw.setMenuBar(bar);                     // 将菜单栏设置到主窗口(可省略,默认已有)// ====== 设置状态栏 ======w.statusBar()->showMessage("状态栏信息");  // 在主窗口底部的状态栏显示提示信息w.show();                              // 显示主窗口return a.exec();                       // 启动事件循环,等待并处理用户操作
}
  • QMainWindow 自带菜单栏、工具栏、状态栏等,适合做应用主框架。
  • QMenuBar → 菜单栏容器。
  • QMenu → 菜单项(可以有子菜单和动作)。
  • QStatusBar → 窗口底部的提示信息栏。
  • Bar→ 栏、条、横条
四、对话框类QDialog

对话框窗口的基类,用于创建模态或非模态的对话框窗口。对话框是与用户进行简短交互的顶层窗口,通常用于显示消息或执行一些临时性的任务。

  • 模态对话框:在模态对话框打开时,它会阻塞其父窗口或整个应用程序,直到用户关闭对话框。这意味着用户必须先处理对话框中的任务,才能继续与应用程序的其他部分交互。
  • 非模态对话框:非模态对话框则不会阻止用户与其父窗口或其他窗口的交互,它独立于主窗口运行,允许用户同时操作多个窗口。
int main(int argc, char* argv[])
{QApplication a(argc, argv);   // 创建应用程序对象,管理整个事件循环Widget w;                     // 创建一个自定义窗口部件(Widget 继承自 QWidget)w.show();                     // 显示这个主窗口QDialog d;                    // 创建一个 QDialog 对话框对象d.setWindowTitle("对话框");     // 设置对话框标题为“对话框”d.setModal(true);             // 设置为模态对话框(对话框关闭前,无法操作主窗口)d.resize(200, 100);           // 设置对话框的大小为 200×100d.show();                     // 显示对话框(非阻塞方式)return a.exec();              // 启动事件循环,程序进入消息处理状态
}
  • Widget w:主窗口(你自定义的窗口类,通常继承自 QWidget)。
  • QDialog d:对话框窗口,标题是“对话框”。
  • setModal(true):因为是模态对话框,所以当对话框没关闭时,不能点击主窗口
  • show():显示对话框,但不会阻塞代码(对比 exec())。
1. 补充
  1. 模态(Modal)

    • 阻塞用户对其他窗口的操作。
    • 常用于提示用户“必须先完成当前操作”。
    • 例子:弹出“保存/取消”的对话框。
  2. 非模态(Modeless)

    • 不阻塞其他窗口,可以同时操作。
    • 常用于工具窗口。
  3. QDialog::show() vs QDialog::exec()

    • show()非阻塞,只是显示窗口,程序会继续执行。
    • exec()阻塞,对话框关闭前,程序停在这里(常用于模态对话框)。
2. setModal(true)exec()的区别

1️⃣ setModal(true)

  • 作用:设置对话框为 模态(Modal)。

  • 影响:用户在对话框没关闭前,不能操作其它窗口(比如主窗口)。

  • 显示方式:它还是要配合 show() 来显示。

    QDialog d;
    d.setModal(true);
    d.show();   // 模态对话框(禁止操作主窗口),但程序继续往下走
    qDebug() << "这行会立刻执行";
    

👉 模态只是限制 用户交互,但 不会阻塞代码执行


2️⃣ exec()

  • 作用:显示对话框,同时进入一个 本地事件循环

  • 影响:用户必须关闭对话框,程序代码才会往下执行。

  • 等价效果模态 + 阻塞

    QDialog d;
    d.exec();   // 模态 + 阻塞,必须关闭对话框,程序才会继续
    qDebug() << "只有关掉对话框,这行才会执行";
    

3️⃣ 区别总结

  • setModal(true) + show()模态非阻塞
    • 用户不能操作主窗口,但程序代码继续运行。
  • exec()模态阻塞
    • 用户不能操作主窗口,程序代码也会停在这里,等对话框关闭才继续。

4️⃣ 小口诀

  • setModal(true) 控制的是:用户能不能点主窗口
  • exec() 控制的是:程序能不能继续往下执行
五、总结
1. QWidget
  • 定义:Qt 所有可视化界面控件的基类(Widget = 窗口部件/控件)。
  • 特点
    • 可以作为独立窗口(如果没有父对象)。
    • 可以作为子控件嵌套在别的控件里(比如按钮、文本框)。
    • 提供了基本的绘制、事件处理(鼠标、键盘)、布局功能。
  • 中文理解:小部件 / 控件。
  • 例子:按钮 (QPushButton)、标签 (QLabel)、输入框 (QLineEdit) 都继承自 QWidget

2. QMainWindow
  • 定义:继承自 QWidget 的一个主窗口类,是 Qt 专门为应用程序的主界面准备的。
  • 特点
    • 内置了菜单栏(Menu Bar)、工具栏(Tool Bar)、状态栏(Status Bar)、停靠窗口(Dock Widget)、中心窗口(Central Widget)等。
    • 适合用来做应用程序的主框架界面。
  • 中文理解:主窗口。
  • 例子:像 Qt Creator、Word 这种有菜单栏、工具栏的程序,通常用 QMainWindow 搭建。

3. QDialog
  • 定义:继承自 QWidget对话框类,通常用来做临时窗口。
  • 特点
    • 默认是 模态窗口(Modal):弹出后会阻塞主窗口输入,直到关闭。
    • 也可以设为 非模态(Modeless):和主窗口同时交互。
    • 常用于弹出提示框、登录框、设置对话框。
  • 中文理解:对话框。
  • 例子:弹出的“确认/取消”窗口就是 QDialog

4. 三者关系
  1. QObject
  • 提供对象模型、信号槽机制。
  1. QPaintDevice
  • 提供绘制接口,所有可绘制的类都要继承它(QWidget、QPixmap、QImage…)。
  1. QWidget
  • 继承自 QObject(能发信号/槽)和 QPaintDevice(能被绘制)。
  • 是所有控件的基类。
  1. QDialog / QMainWindow
  • 都是 QWidget 的子类。

  • QMainWindow适合做“程序主界面”,有完整的菜单、工具栏、状态栏。

  • QDialog适合做“临时对话框”,比如登录、提示、设置。

📌 类关系图(简化版):

QObject└── QWidget (同时继承自 QPaintDevice)├── QDialog└── QMainWindow

✅ 总结一句:

  • QPaintDeviceQWidget 提供了“能画”的能力;
  • QObjectQWidget 提供了“能通信”的能力;
  • 所以 QWidget 是 Qt 控件的核心基类,在它之上才有 QDialogQMainWindow

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

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

相关文章

【CSP初赛】程序阅读3

文章目录前置知识阅读程序判断选择答案解析判断选择总结前置知识 埃氏筛素数、C 基础。 阅读程序 #include <bits/stdc.h> using namespace std; int main(){int a1[51] {0};int i,j,t,t2,n 50;for(i 2;i<sqrt(n);i){if(a1[i] 0){t2 n/i;for(j 2;j<t2;j) …

【ESP32-IDF】高级外设开发4:SPI

系列文章目录 持续更新中… 文章目录系列文章目录前言一、SPI概述1.主要功能2.SPI控制器架构3.SPI通信模式4.SPI数据帧与事务5.DMA与传输性能6.中断与驱动事件二、SPI类型定义及相关API三、SPI示例程序总结前言 在嵌入式开发中&#xff0c;SPI&#xff08;串行外设接口&#…

遥感机器学习入门实战教程|Sklearn案例⑧:评估指标(metrics)全解析

很多同学问&#xff1a;“模型好不好&#xff0c;怎么量化&#xff1f;” 本篇系统梳理 sklearn.metrics 中常用且“够用”的多分类指标&#xff0c;并给出一段可直接运行的示例代码&#xff0c;覆盖&#xff1a;准确率、宏/微/加权 F1、Kappa、MCC、混淆矩阵&#xff08;计数/…

【Bluedroid】深入解析A2DP SBC编码器初始化(a2dp_sbc_encoder_init)

SBC(Subband Coding)作为蓝牙 A2DP 协议的标准编解码器,其编码器的初始化与参数配置直接影响音频传输的音质、效率与兼容性。本文基于Andoird A2DP 协议栈源码,系统剖析 SBC 编码器的初始化流程,包括核心参数(比特池、采样率、声道模式等)的解析、计算与动态调整逻辑,以…

linux shell测试函数

在 C 语言中&#xff0c;int main(int argc, char *argv[])是程序的入口函数&#xff0c;而​​在 main函数中调用专门的测试逻辑&#xff08;如测试函数&#xff09;​​的程序结构&#xff0c;通常被称为​​测试程序&#xff08;Test Program&#xff09;​​或​​测试驱动…

【Java SE】抽象类、接口与Object类

文章目录一、 抽象类&#xff08;Abstract Class&#xff09;1.1 什么是抽象类&#xff1f;1.2 抽象类的语法1.2.1 定义抽象类1.2.2 继承抽象类1.3 抽象类的特性1.3.1 不能直接实例化1.3.2 抽象方法的限制1.3.3 抽象类可以包含构造方法1.3.4 抽象类不一定包含抽象方法1.3.5 抽象…

Autodl 创建新虚拟环境 python3.9

问题&#xff1a;本人在autodl上保存的环境因为很长时间没有开机&#xff0c;autodl竟然给我删除了。后来看了官网的介绍我才发现&#xff0c;原来15天不开机&#xff0c;autodl就会自动释放实例。 因此&#xff0c;我就自己重新选了一个虚拟环境&#xff0c;从头开始配置。 GP…

应急响应靶机-WindowsServer2022挖矿事件

依旧手痒开局&#xff0c;知攻善防实验室的原创靶机 https://mp.weixin.qq.com/s/URrNHvQSnFKOyefHKXKjQQ 相关账户密码&#xff1a; Administrator/zgsf123 注意&#xff1a;做个原始快照&#xff08;方便日后复习&#xff09;&#xff0c;安装VMware tool&#xff08;安装后图…

PCB电路设计学习3 电路原理图设计 元件PCB封装设计与添加

目录PCB电路设计学习3五、电路原理图设计5.1 32个发光二极管电路5.2 单片机外围电路5.3 供电与程序下载电路5.4 连接各部分网络&#xff0c;绘制边框和说明六、元件PCB封装设计与添加6.1 名词解释6.2 绘制PCB附学习参考网址欢迎大家有问题评论交流 (* ^ ω ^)PCB电路设计学习3 …

redis---常用数据类型及内部编码

Redis 中每种常用数据类型都对应多种内部编码&#xff0c;这些编码会根据数据特征&#xff08;如大小、数量&#xff09;自动切换&#xff0c;以平衡存储效率和操作性能。1.字符串&#xff08;String&#xff09;用途&#xff1a;存储文本、数字或二进制数据&#xff0c;是最基…

crypto.randomUUID is not a function

在本地运行时 crypto.randomUUID 好使&#xff0c;build 后放到服务器上用域名访问就不好使。原因&#xff1a;浏览器策略&#xff0c;浏览器在非https、localhost的环境中访问时&#xff0c;crypto.randomUUID 是不可用的开发时使用的是localhost正常访问 生产临时使用的是htt…

【思考】什么是服务器?什么是服务?什么是部署?

文章目录1 什么是服务器&#xff1f;什么是服务&#xff1f;端口是什么意思&#xff1f;2 什么是部署&#xff1f;1 什么是服务器&#xff1f;什么是服务&#xff1f;端口是什么意思&#xff1f; 服务器本质是一台运行着程序的电脑&#xff0c;它可以运行着很多程序&#xff0c…

自动驾驶导航信号使用方式调研

1 总结 本文调研在给定导航信号后&#xff0c;如何在端到端架构下&#xff0c;利用导航信息引导轨迹生成。 目前主流的方案可以分为2种。一种是将导航作为“前置引导”深度融入轨迹生成过程&#xff08;导航前置型&#xff09;&#xff1b;另一种则是将导航作为“后置评价”标准…

玳瑁的嵌入式日记D21-08020(数据结构)

双向链表double link listtypedef struct dou_node { DATATYPE data; struct dou_node *prev; struct dou_node *next; }DouLinkNode;双向链表&#xff1a;节点 数据 NEXT PREV . 手撕代码(增加删除) 增加&#xff0c;删除的操作&#xff0c; 需要 tmp 停止待操作节点的前一…

Uipath查找元素 查找子元素 获取属性活动组合使用示例

Uipath 查找元素 查找子元素 获取属性组合使用示例使用场景案例介绍项目流程图附加浏览器查找元素查找子元素遍历循环获取属性点击元素使用场景 在实际场景中&#xff0c;有时需RPA自动点击某组范围元素或获取某组范围元素的值&#xff0c;如需获取指定的父元素&#xff0c;再…

【MongoDB与MySQL对比】

MongoDB 与 MySQL 全方位对比分析在现代软件开发中&#xff0c;数据库的选择直接影响系统性能、扩展性和开发效率。MongoDB 和 MySQL 作为两种主流数据库&#xff0c;分别代表了 NoSQL 和关系型数据库的典型&#xff0c;各自在不同场景中发挥着重要作用。本文将抛开代码示例&am…

Spring AI开发指导-对话模型

对话模型接口描述Spring AI基于Spring Cloud的架构体系&#xff0c;定义了一系列可扩展的API接口&#xff0c;支持对接不同类型的AI大模型的核心功能&#xff0c;这些API接口支持同步编程模式或者异步编程模式&#xff1a;接口ModelModel是同步编程模式接口&#xff0c;其参数支…

Win11 下卸载 Oracle11g

目录 1、停止服务 2、启动 Universal install 应用 3、执行 deinstall.bat 脚本 4、删除注册表相关数据 5、删除环境变量中的oracle相关路径 6、删除安装文件 7、删除C盘中的相关Oracle文件 8、删除 Oracle 数据存放目录 9、检查 10、重装oracle可能还会碰到的问题 &…

深入剖析Spring Boot应用启动全流程

目录 前言 启动流程概览 一、第一阶段&#xff1a;初始化SpringApplication 二、第二阶段&#xff1a;运行SpringApplication 三、第三阶段&#xff1a;环境准备 四、第四阶段&#xff1a;创建应用上下文 五、第五阶段&#xff1a;准备应用上下文 六、第六阶段&#xf…

Matplotlib 可视化大师系列(三):plt.bar() 与 plt.barh() - 清晰对比的柱状图

目录Matplotlib 可视化大师系列博客总览Matplotlib 可视化大师系列&#xff08;三&#xff09;&#xff1a;plt.bar() 与 plt.barh() - 清晰对比的柱状图一、 柱状图是什么&#xff1f;何时使用&#xff1f;二、 函数原型与核心参数plt.bar(x, height, ...) - 垂直柱状图plt.ba…