在qt界面上内嵌拥有独立句柄的窗口

news2024/12/23 6:59:12

背景

在qt程序中,如果数据刷新频率过高,容易造成窗口卡顿,因为qt程序是整个窗口刷新,在此种背景下可以在qt程序的主程序上内嵌一个拥有独立句柄的窗口,两个窗口刷新就互不干扰。

案例

以下例子,在主窗口中内嵌一个窗口,窗口显示是QChart相关的图标。

#pragma once

#include <qwidget.h>
#include <QLayout>
#include <QGraphicsView>
#include <QChartView>
#include <QValueAxis>
#include <QLineSeries>
#include <QDebug>
#include <QList>
#include <QTimer>
#include <QtPlatformHeaders/QWindowsWindowFunctions> 
#include <thread>
#include <mutex>
#include <vector>
#include <queue>
#include <exception>

namespace ViewDataChart
{
	QT_CHARTS_USE_NAMESPACE

	class DataLineView : public QWidget
	{
		Q_OBJECT
	public:
		DataLineView(int minY, int maxY, int numY, int maxX, int numX);
		~DataLineView();

		// 显示设置
		void SetYNum(int value);
		void SetYMax(int value);
		void SetYMin(int value);
		void SetXNum(int value);
		void SetXMax(int value);

	public slots:
		void UpdateLine();
		// 赋值
		void AppendValue(unsigned short value);
		void AppendValue(std::vector<unsigned short>& list);

	protected:
		void resizeEvent(QResizeEvent*);

	private:
		QVBoxLayout* verticalLayout;
		QGraphicsView* pGrapView_;
		QChartView* pView_;
		QWidget* m_winContainer;

		QChart* pWavePic_;
		QValueAxis* pAxisX_;
		QValueAxis* pAxisY_;
		QLineSeries* pLineData_;

	//	QTimer* pTimer_;
		int objNum_;
		int maxXNum_;
		std::mutex mtxData_;
		std::vector<ushort> values_;
	};
};

#include "DataLineView.h"
#include <QWindow>

ViewDataChart::DataLineView::DataLineView(int minY, int maxY, int numY, int maxX, int numX)
	: maxXNum_(maxX)
{
	if (this->objectName().isEmpty())
		this->setObjectName(QStringLiteral("PlayVideoWidget"));
	this->resize(1, 1);
	verticalLayout = new QVBoxLayout(this);
	verticalLayout->setSpacing(0);
	verticalLayout->setContentsMargins(0, 0, 0, 0);
	verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
	verticalLayout->setContentsMargins(0, 0, 0, 0);
	//this->setWindowTitle("");
	QMetaObject::connectSlotsByName(this);

	// wave
	pAxisX_ = new QValueAxis();
	pAxisY_ = new QValueAxis();
	pAxisX_->setMin(0);
	pAxisX_->setMax(maxX);
	//	pAxisX_->setVisible(false);
	pAxisY_->setMin(minY);
	pAxisY_->setMax(maxY);
	pAxisY_->setTickCount(numY + 1);
	pAxisX_->setTickCount(numX + 1);

	pLineData_ = new QLineSeries();
	pLineData_->setPointsVisible(true);
	pLineData_->setUseOpenGL(true);
	//  //pLineData_->setName("");

	pWavePic_ = new QChart();
	pWavePic_->addAxis(pAxisY_, Qt::AlignLeft);
	pWavePic_->addAxis(pAxisX_, Qt::AlignBottom);
	pWavePic_->addSeries(pLineData_);
	pWavePic_->setAnimationOptions(QChart::SeriesAnimations);
	pLineData_->attachAxis(pAxisX_);
	pLineData_->attachAxis(pAxisY_);

	pView_ = new QChartView(pWavePic_);
	pView_->setVisible(true);
	pView_->resize(geometry().size());
	pView_->setChart(pWavePic_);
	pView_->setRenderHint(QPainter::Antialiasing);

	pView_->setStyleSheet("background-color: rgb(255, 255, 255);");

	// 此处开始创建独立句柄
	QWindow* win = pView_->windowHandle();
	if (!win)
		win = pView_->topLevelWidget()->windowHandle();
	win->setFlags(Qt::FramelessWindowHint);
	QWindowsWindowFunctions::setHasBorderInFullScreen(win, true);
	m_winContainer = QWidget::createWindowContainer(win, this);
	m_winContainer->setStyleSheet(QString::fromUtf8("border:0px"));
	m_winContainer->setStyleSheet("background-color: rgb(255, 255, 255);");
	m_winContainer->resize(geometry().size());

	verticalLayout->addWidget(m_winContainer);

	/*pTimer_ = new QTimer(this);
	pTimer_->setSingleShot(false);
	pTimer_->setInterval(5);
	connect(pTimer_, &QTimer::timeout, this, &ViewDataChart::DataLineView::UpdateLine);
	pTimer_->start();*/

	//setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
	/*QPalette palette = this->palette();
	palette.setColor(QPalette::Base, Qt::transparent);
	setPalette(palette);
	setAttribute(Qt::WA_TranslucentBackground);
	setWindowFlags(Qt::FramelessWindowHint);*/
}

ViewDataChart::DataLineView::~DataLineView()
{
	delete pLineData_;
	pLineData_ = nullptr;

	delete pAxisX_;
	pAxisX_ = nullptr;
	delete pAxisY_;
	pAxisY_ = nullptr;

	delete pWavePic_;
	pWavePic_ = nullptr;

	delete pView_;
	pView_ = nullptr;

	delete verticalLayout;
	verticalLayout = nullptr;
}

// 设置y轴刻度数
void ViewDataChart::DataLineView::SetYNum(int value)
{
	pAxisY_->setTickCount(value);
}

// 设置y轴最大值
void ViewDataChart::DataLineView::SetYMax(int value)
{
	pAxisY_->setMax(value);
}

// 设置y轴最小值
void ViewDataChart::DataLineView::SetYMin(int value)
{
	pAxisY_->setMin(value);
}

// 设置x轴刻度数
void ViewDataChart::DataLineView::SetXNum(int value)
{
	pAxisX_->setTickCount(value);
}

// 设置x轴最大值
void ViewDataChart::DataLineView::SetXMax(int value)
{
	for (int i = 0; i < value - maxXNum_; ++i)
	{
		if (pLineData_->count() > 0)
			pLineData_->remove(0);
	}

	maxXNum_ = value;
	pAxisX_->setMax(maxXNum_);
}

// 添加数据值
void ViewDataChart::DataLineView::AppendValue(unsigned short value)
{
	std::unique_lock<std::mutex> lock(mtxData_);

	while (pLineData_->count() + 1 > maxXNum_ && maxXNum_ > 1)
	{
		pLineData_->remove(0);
	}
	pLineData_->append(pLineData_->count() + 1, value);
}


// 添加数据值(数组)
void ViewDataChart::DataLineView::AppendValue(std::vector<unsigned short>& list)
{
	std::unique_lock<std::mutex> lock(mtxData_);
	values_ = list;
	pLineData_->clear();
	for (int i = 0; i < list.size(); ++i)
	{
		pLineData_->append(QPointF(i, list[i]));
	}
}

void ViewDataChart::DataLineView::resizeEvent(QResizeEvent* event)
{
	if (pView_)
	{
		pView_->show();
		pView_->resize(geometry().size());
		pView_->setVisible(true);
		//pView_->resize(geometry().size());
	}
	QWidget::resizeEvent(event);
}

// 更新图像
void ViewDataChart::DataLineView::UpdateLine()
{

}

案例中数据显示未做完善,在构造函数注明创建独立句柄的代码处。
如下图是效果图,外表看无法看出是内嵌窗口,可以使用 QWidget::winId 函数来获取窗口句柄(HWND)。
在这里插入图片描述

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

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

相关文章

【技术指南】3D转换工具HOOPS Exchange的功能特征和典型使用场景全解析(一)

一、什么是 HOOPS Exchange&#xff1f; HOOPS Exchange 是一组软件库&#xff0c;可以帮助开发人员在开发应用程序时读取和写入主流的 2D 和 3D 格式。HOOPS Exchange 支持 在主流的3D 文件格式中读取 CAD 数据&#xff0c;并支持将 3D 数据转换为 PRC 数据格式&#xff0c;…

2.2 顺序表与链表特性对比

1. 插入删除操作对比 1. 顺序表插入删除元素 插入策略: 在某个位置插入元素时, 把从该位置开始的所有元素都往后挪一个位置, 规定顺序表最后一个元素后面的位置也是一个可插入位置. 后面的元素先往后挪动位置. 删除策略: 在某位置删除元素, 把从该位置之后的所有元素都往前…

【技术篇】• 饮用水除硝酸盐的技术解析

​​​​​​​ 近年来由于农业活动及排污物的影响&#xff0c;部分地表水源水中硝酸盐含量呈现明显的增加趋势&#xff0c;硝酸盐污染成为地下水和饮用水领域关注的热点问题之一。 硝酸盐是有氧环境中稳定的含氮化合物形式&#xff0c;也是含氮有机物通过无机化分解的产物&am…

搭建archetype骨架工程

搭建archetype骨架工程 一、archetype概念1、archetype简介2、archetype组成结构3、archetype生命周期4、archetype使用 二、构建我们自定义的骨架工程1、创建一个自定义的项目2、修改pom的build插件3、生成archetype资源文件4、将生成的资源文件制作成archetype jar包5、生成a…

Java中不同变量声明类型

今天在学习分层解耦-三层架构的过程中&#xff0c;具体文章参照&#xff1a;写文章-CSDN创作中心 在Servie层创建Dao对象时&#xff0c;以及在Controller层创建Service对象时&#xff0c;发现与我之前了解的声明变量的方法不一样。具体关键代码如下&#xff1a; 其中EmpServic…

简要介绍 | 边缘计算:原理,研究现状与未来展望

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对边缘计算进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 边缘计算&#xff1a;原理&#xff0c;研究现状与未来展望 What is Edge Computing? | Moving Intelligence to the Edge 一、背景介…

小平板 大智慧-嵌入式方案满足教育市场多元需求

线上教育观念的深入和技术的更新&#xff0c;直接拉动了教育类硬件及相关终端设备的市场需求。 产品框图 IDO-SBC3566采用瑞芯微RK3566&#xff0c; CPU采用4核A55架构处理器&#xff0c;集成G52图形处理器&#xff0c;内置独立NPU&#xff0c;算力高达1Tops&#xff0c;可满足…

如何在 Windows 中免费合并 PDF 文件 [在线和离线]

PDF是一种广泛使用的文件格式&#xff0c;具有兼容性好、安全性高、易于打印、方便浏览等众多优点。在工作和学习过程中&#xff0c;经常需要将同一类型的PDF文件合并起来&#xff0c;以方便传输和查看&#xff0c;使得合并PDF文件成为一种重要的数据整合方法。 如果您想知道如…

Es存储和查询

基本概念 Cluster 集群&#xff0c;一个ES集群是由多个节点(Node)组成的&#xff0c;每个集群都有一个cluster name 作为标识&#xff0c; 在同一网段下的Es实例会通过cluster name 决定加入哪个集群下。 node 节点&#xff0c;一个ES实例就是一个node&#xff0c;一个机器可以…

电气控制与PLC之间的本质区别是什么?

电气控制和PLC&#xff08;可编程逻辑控制器&#xff09;之间的最实质的区别是它们的实现方式和应用范围。 我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 实现方式&#xff1a; 电气控制&#xff1a;电气控制是通过使用电气元件&#xff08;如继电器、…

数据库多表连接查询练习

数据库多表连接查询练习 一、创建数据库dept、emp 二、插入数据 1.找出销售部门中年纪最大的员工的姓名 mysql> select name,age from emp inner join dept on dept.dept1emp.dept2 where dept_name销售 order by age desc limit 1;2.求财务部门最低工资的员工姓名…

探索AI大模型:现状、挑战与未来

导言&#xff1a; 近年来&#xff0c;AI大模型如GPT&#xff08;生成对抗网络&#xff09;在自然语言处理领域崭露头角&#xff0c;引发广泛关注和讨论。这些模型能够生成各种类型的文本内容&#xff0c;展现出惊人的语言处理能力。然而&#xff0c;AI大模型的发展也面临着挑战…

Perl web - Mojolicious 小记

文章目录 关于 Mojolicious安装 关于 Mojolicious Mojolicious是Perl语言比较流行的异步Web开发框架。 官网&#xff1a;https://mojolicious.orggithub : https://github.com/mojolicious/mojo示例&#xff1a;https://github.com/mojolicious/mojo/tree/main/examples 相关…

【雕爷学编程】Arduino动手做(138)---64位WS2812点阵屏模块8

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

移动端 滚动穿透

文章目录 滚动穿透弹窗内容滚动到底部后带动底层页面滚动在弹窗出现时可以直接通过页面滚动条滚动 禁用底层页面滚动弹出层将覆盖整个视口禁用触摸事件监听弹出层滚动位置阻止弹出层的滚动事件冒泡 滚动穿透 当一个固定定位&#xff08;fixed&#xff09;或绝对定位&#xff0…

Windows10 网页版 上线!最具扩展性的webos

模仿Windows10 UI 框架 Vue3 点击进入github 链接: https://github.com/royalknight56/win10-vue3 本框架可以让你的页面像win10视窗系统一样&#xff0c;运行一个网页上的win10系统。 本框架可能是最具扩展性的webos 本框架相较于其他的特点是&#xff0c; 具有文件系统&am…

第二章:类与对象(上)

系列文章目录 文章目录 系列文章目录前言面向过程和面向对象初步认识类的引入类的定义类的两种定义方式成员变量命名规则的建议 类的访问限定符及封装访问限定符面试题 封装面试题 类的作用域类的实例化类对象模型如何计算类对象的大小类对象的存储方式猜测对象中包含类的各个成…

C语言字节序

C语言字节序分为大端序和小端序。 大端序&#xff1a; 高字节先存储&#xff0c;也就是数据的高字节存储在低地址中。 小端序&#xff1a; 低字节先存储&#xff0c;也就是数据的低字节存储在低地址中。 例如&#xff1a; short a 01234; char *p &a; printf(&qu…

基于Java+SpringBoot制作一个社区宠物登记小程序

制作一个社区宠物登记小程序,帮助社区居民登记和管理他们的宠物信息,以便更好地跟踪和维护社区中的宠物状况,通过社区宠物信息登记系统,社区居民可以更好地管理自己的宠物信息,并与其他宠物所有者共享资源和信息。这将有助于提高社区宠物的福利和安全,促进社区成员之间的…

业务流程管理系统是什么?企业业务流程有哪些?

随着企业规模的不断扩大和竞争的日益激烈&#xff0c;业务流程管理系统的重要性也越来越明显。通过对业务流程的全面管理和优化&#xff0c;企业可以提高工作效率、降低流程成本、优化流程质量&#xff0c;从而在市场竞争中获得更大的优势。 阅读本文您将了解&#xff1a; 一、…