当前位置: 首页 > news >正文

「Qt Widget中文示例指南」如何实现窗口嵌入?

Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。

本文中的示例主要演示如何将非Qt UI元素嵌入到Qt应用程序中。

Qt为Qt Widget和基于Qt Quick的应用程序提供了广泛的UI控件,但有时可能需要使用来自其他UI工具包的控件,例如平台的本地UI工具包。

为了集成这些控件,我们建立在Qt的QWindow抽象之上,通过创建原生UI控件的QWindow表示,然后将其嵌入到Qt UI中。以这种方式创建的窗口在Qt中称为外部窗口,因为它表示由外部(对Qt) UI工具包创建的控件。

点击获取Qt Widget组件下载

创建外部窗口

要创建QWindow表示,我们使用QWindow::fromWinId(),传递对本机窗口句柄的引用,该句柄由不透明的WId类型表示。

每个平台定义WId不透明类型映射到的本机类型。

「Qt Widget中文示例指南」如何实现窗口嵌入?

结果是一个表示本机窗口句柄的QWindow。

注意:Qt在创建外部窗口时不会(独占)拥有本机窗口句柄,因此应用程序负责在外部QWindow的生命周期内保持本机窗口的激活。

现在在使用QWindow::fromWinId() 创建QWindow 之前,我们需要一个本机窗口句柄。在本例中,我们将嵌入一个月历控件,因为大多数平台在其原生UI工具包中都有它,或者其他随时可用的控件。下面的代码片段显示了如何在每个平台上创建日历的细节。

为了确保本机句柄保持激活状态,并在应用程序退出时正确清理,我们维护了一个清理函数列表,这些函数在从main()返回之前执行。

除了创建本机窗口句柄并将其转换为QWindow之外,我们还在生成的QWindow上设置了最小大小,基于此本机工具包可以告诉我们日历控件的首选最小大小,这允许Qt正确地布局嵌入的外部窗口。

macOS

「Qt Widget中文示例指南」如何实现窗口嵌入?

Windows

「Qt Widget中文示例指南」如何实现窗口嵌入?

X11

「Qt Widget中文示例指南」如何实现窗口嵌入?

iOS

「Qt Widget中文示例指南」如何实现窗口嵌入?

Android

「Qt Widget中文示例指南」如何实现窗口嵌入?

#include <AppKit/NSDatePicker.h>
#include <AppKit/NSLayoutConstraint.h>QWindow *createCalendarWindow()
{
auto *datePicker = [NSDatePicker new];
cleanupFunctions.push_back([=]{ [datePicker release]; });datePicker.datePickerStyle = NSDatePickerStyleClockAndCalendar;
datePicker.datePickerElements = NSDatePickerElementFlagYearMonthDay;
datePicker.drawsBackground = YES;
datePicker.dateValue = [NSDate now];auto *calendarWindow = QWindow::fromWinId(WId(datePicker));
calendarWindow->setMinimumSize(QSizeF::fromCGSize(datePicker.fittingSize).toSize());return calendarWindow;
}
嵌入外部窗口

现在我们有了一个外部的QWindow,可以将它嵌入到Qt UI中。在这里有几个选项,如下所述。

在Qt Gui中嵌入

在最底层,我们可以通过QWindow::setParent()将外部窗口嵌入到另一个QWindow中,这种方法让应用程序开发人员来处理定位、调整大小和管理嵌入子窗口的其他方面,所以我们通常建议不要在这个级别上进行集成,如果可能的话。

在这个例子中,我们首先创建一个最小的容器窗口实现。

class ContainerWindow : public QRasterWindow
{
protected:
bool event(QEvent *event) override
{
if (event->type() == QEvent::ChildWindowAdded) {
auto *childWindow = static_cast<QChildWindowEvent*>(event)->child();
childWindow->resize(childWindow->minimumSize());
setMinimumSize(childWindow->size().grownBy(contentsMargins));
resize(minimumSize());
}return QRasterWindow::event(event);
}void showEvent(QShowEvent *) override
{
findChild<QWindow*>()->setVisible(true);
}void resizeEvent(QResizeEvent *) override
{
auto *containedWindow = findChild<QWindow*>();
containedWindow->setPosition(
(width() / 2) - containedWindow->width() / 2,
(height() / 2) - containedWindow->height() / 2
);
}void paintEvent(QPaintEvent *) override
{
QPainter painter(this);
painter.fillRect(0, 0, width(), height(), "#00414A");
}
};

然后我们就可以重新打开外部窗口。

ContainerWindow window;
window.setTitle("Qt Gui");auto *calendarWindow = createCalendarWindow();
calendarWindow->setParent(&window);
嵌入Qt小部件

对于建立在Qt Widgets UI堆栈上的应用程序,我们遵循与QWindow::fromWinId()相同的方法,通过QWidget::createWindowContainer()创建QWindow的一个QWidget表示。

然后我们可以通过QWidget::setParent()将这个小部件重命名为另一个小部件,与上面Qt Gui的例子一样,必须手动管理定位、调整大小等。在本例中,我们倾向于将窗口容器小部件添加到QVBoxLayout,,这允许我们自动将外部窗口居中于顶级小部件内。

QWidget widget;
widget.setPalette(QColor("#CDB0FF"));
widget.setWindowTitle("Qt Widgets");
widget.setLayout(new QVBoxLayout);
widget.layout()->setContentsMargins(contentsMargins);
widget.layout()->setAlignment(Qt::AlignCenter);auto *calendarWidget = QWidget::createWindowContainer(createCalendarWindow());
widget.layout()->addWidget(calendarWidget);
在Qt Quick中嵌入

最后,对于构建在Qt Quick UI堆栈上的应用程序,我们使用WindowContainer项来管理外部窗口。

Window {
title: "Qt Quick"
color: "#2CDE85"required property QtObject calendarWindow;property int contentsMargins: 20minimumWidth: calendarWindow.minimumWidth + contentsMargins * 2
minimumHeight: calendarWindow.minimumHeight + contentsMargins * 2WindowContainer {
id: calendar
window: calendarWindow
width: window.minimumWidth
height: window.minimumHeight
anchors.centerIn: parent
}
}

在本例中,外部窗口作为上下文属性公开给QML引擎,但这可以根据应用程序的需要以不同的方式解决。

QQmlApplicationEngine engine;
engine.setInitialProperties({{ "calendarWindow", QVariant::fromValue(createCalendarWindow()) }});
engine.loadFromModule("windowembedding", "Main");
Qt Widget组件推荐
  • QtitanRibbon - Ribbon UI组件:是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,QtitanRibbon致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart - Qt类图表组件:是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。
  • QtitanDataGrid - Qt网格组件:提供了一套完整的标准 QTableView 函数和传统组件无法实现的独特功能。使您能够将不同来源的各类数据加载到一个快速、灵活且功能强大的可编辑网格中,支持排序、分组、报告、创建带状列、拖放按钮和许多其他方便的功能。
  • QtitanDocking:允许您像 Visual Studio 一样为您的伟大应用程序配备可停靠面板和可停靠工具栏。黑色、白色、蓝色调色板完全支持 Visual Studio 2019 主题!

相关文章:

「Qt Widget中文示例指南」如何实现窗口嵌入?

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文中的示例主要演…...

企业CRM选型必看:2024年最佳CRM系统排行

企业用户在选择CRM系统时&#xff0c;不仅要考虑系统的功能性、可定制性&#xff0c;还要考虑其与现有工具的集成能力以及价格。此外&#xff0c;在2024年&#xff0c;越来越多的企业用户会把CRM厂商的AI能力列入考察范畴。 本文分析整理2024年最佳CRM系统排行榜&#xff0c;从…...

SQL入门的基础知识

思考 无论是干任何语言或者其他方向的开发&#xff0c;都会和我们的SQL去进行打交道 总结 学习SQL的原因&#xff1a;后面的实战案例需要用SQL&#xff0c;SQL是开发人员的必备技能 现在只需要学到满足后续案例需要&#xff0c;即简单增删改查&#xff0c;做一个入门即可 1.…...

JS渗透(安全)

JS逆向 基本了解 作用域&#xff1a; 相关数据值 调用堆栈&#xff1a; 由下到上就是代码的执行顺序 常见分析调试流程&#xff1a; 1、代码全局搜索 2、文件流程断点 3、代码标签断点 4、XHR提交断点 某通js逆向结合burp插件jsEncrypter 申通快递会员中心-登录 查看登录包…...

淘宝扭蛋机小程序,功能优势分析

随着潮玩文化的影响&#xff0c;扭蛋机作为潮玩的鼻祖&#xff0c;又再次成为了大众的“宠儿”。扭蛋机通过与多种IP结合&#xff0c;创造出各种元素的商品&#xff0c;为大众带来娱乐、收藏的新方式。我国潮玩市场规模正在大幅度的增长&#xff0c;将达到千亿元&#xff0c;发…...

Redis 数据备份与恢复

Redis 数据备份与恢复 引言 Redis 作为一种高性能的键值存储数据库,在许多应用场景中扮演着重要的角色。然而,数据的安全性是任何数据库系统都需要关注的问题。为了确保数据的安全和完整性,定期进行数据备份和掌握恢复策略是至关重要的。本文将详细介绍 Redis 数据备份与恢…...

CentOS9 Stream 设置禁用IPV6

CentOS9 Stream 设置禁用IPV6 方法 1: 修改 sysctl 配置方法 2: 使用 NetworkManager方法 3: 禁用内核参数验证 IPv6 是否禁用 在 CentOS 9 Stream 中&#xff0c;您可以通过以下步骤禁用 IPv6&#xff1a; 方法 1: 修改 sysctl 配置 编辑 sysctl 配置文件&#xff1a; 打开 /…...

C语言 | Leetcode C语言题解之第530题二叉搜索树的最小绝对差

题目&#xff1a; 题解&#xff1a; void dfs(struct TreeNode* root, int* pre, int* ans) {if (root NULL) {return;}dfs(root->left, pre, ans);if (*pre -1) {*pre root->val;} else {*ans fmin(*ans, root->val - (*pre));*pre root->val;}dfs(root->…...

【系统设计】高效的分布式系统:使用 Spring Boot 和 Kafka 实现 Saga 模式

在现代分布式系统中&#xff0c;管理跨多个服务的长事务至关重要。传统的分布式事务解决方案往往面临性能瓶颈和复杂性问题&#xff0c;而 Saga 模式 作为一种灵活高效的解决方案&#xff0c;逐渐受到开发者的青睐。本文将探讨如何利用 Spring Boot 和 Kafka 实现 Saga 模式&am…...

蓝桥杯 python day01 第一题

1. 确定字符串是否包含唯一字符 确定字符串是否包含唯一字符 题目描述 实现一个算法来识别一个字符串的字符是否是唯一的&#xff08;忽略字母大小写&#xff09;。 若唯一&#xff0c;则输出YES&#xff0c;否则输出NO。 输入描述 输入一行字符串&#xff0c;长度不超过…...

10款好用的win10录屏软件带你体验专业录屏。

其实win10系统的设备上有自带的录屏功能&#xff0c;还有powerpoint里面也有录屏工具可以使用。如果有朋友觉得里面的功能并不能够满足自己的录屏需求的话&#xff0c;可以用专门的录屏软件来完成。比如我最近找到的这4款工具&#xff0c;录制的视频效果好&#xff0c;操作还方…...

2025浙江省考报名流程详细教程

2025年浙江省考报名马上就要开始了&#xff0c;有想要参加浙江省考的同学&#xff0c;可以提前看一下报名流程&#xff0c;和报名照要求。 报名时间&#xff1a;11月6日9时一11月11日17时 南核时间&#xff1a;11月6日9时一11月13日17时 缴费时间&#xff1a;11月14日9时一11月…...

unity3d——关于GetComponent<T>()

先看代码&#xff1a; TankBaseObj obj other.GetComponent<TankBaseObj>();if(obj ! null){//说明是坦克打到坦克 受伤处理 固定不会受伤 移动的会受伤obj.Wound(fatherObj);} TankBaseObj 是一个基类 wound是一个虚函数 子类已经重新实现 当你的游戏对象依附…...

Spring 框架中常见的注解(Spring、SpringMVC、SpringBoot)

1. Spring 中常见注解 还有Recourse&#xff1a;相当于AutowiredQualifier Value : 用于将配置文件中的值注入到Bean的字段中。 Bean : 用于在配置类中声明一个Bean。 Lazy : 用于延迟加载Bean。 2. SpringMVC 中常见注解 还有GetMapping PostMapping PutMapping DeleteMapp…...

Hms?: 1渗透测试

靶机&#xff1a;Hms?: 1 Hms?: 1 ~ VulnHub 攻击机&#xff1a;kail linux 2024 主机扫描阶段发现不了靶机&#xff0c;所以需要按DriftingBlues2一样手动配置网卡 1,将两台虚拟机网络连接都改为NAT模式&#xff0c;并查看靶机的MAC地址 2&#xff0c;攻击机上做主机扫描发现…...

1、Qt6 Quick 简介

一、Qt6 Quick 简介 1、Qt Quick简介 Qt Quick 是 Qt 6 中使用的用户界面技术的总称。它是在 Qt 4 中引入的&#xff0c;现在在 Qt 6 中进行了扩展。Qt Quick 本身是几种技术的集合&#xff1a; QML——用户界面标记语言JavaScript - 动态脚本语言Qt C - 高度可移植的增强型…...

大模型论文集-20241103

Investigating the catastrophic forgetting in multimodal large language models 研究问题 本文探讨了多模态大型语言模型&#xff08;MLLMs&#xff09;在学习新任务时的灾难性遗忘现象。研究者关注于在添加新数据集后&#xff0c;模型是否能够保留之前学到的知识而不忘记…...

GESP4级考试语法知识(计数排序-桶排序)

整数排列参考程序代码&#xff1a; #include<iostream> #include<cstring> using namespace std; int main() {int a[101],n,i,j,k;memset(a,0,sizeof(a)); //数组清0cin>>n; //输入数字个数for(i1;i<n;i) {cin>>k; //输…...

红队-shodan搜索引擎篇

如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一.shodan原理与功能的介绍 Shodan Search Engine 它是专门搜网络设备的,只要联网的,只要有IP地址的都可以称为网络设备 1.shodan&#x…...

SQL 数据结构查询

1&#xff1a;查询变得结构。 SELECT COLID,SO.NAME,EP.VALUE,SO.LENGTH,MIN(ST.NAME) AS TYPE FROM SYS.EXTENDED_PROPERTIES EP RIGHT JOIN SYS.SYSCOLUMNS SO ON MAJOR_IDID AND COLIDMINOR_ID LEFT JOIN SYS.SYSTYPES ST ON ST.XTYPESO…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

算法—栈系列

一&#xff1a;删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...

DeepSeek越强,Kimi越慌?

被DeepSeek吊打的Kimi&#xff0c;还有多少人在用&#xff1f; 去年&#xff0c;月之暗面创始人杨植麟别提有多风光了。90后清华学霸&#xff0c;国产大模型六小虎之一&#xff0c;手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水&#xff0c;单月光是投流就花费2个亿。 疯…...