首页 > 其他分享 >如何在Qt的 paintEvent之外进行绘制

如何在Qt的 paintEvent之外进行绘制

时间:2024-03-11 15:25:38浏览次数:28  
标签:Qt mPixmap event paintEvent mPainter 绘制 QPixmap QPainter

QPainter 默认只能在paintEvent中进行绘制

这在有些情况下会很不方便,有时候我们希望可以在任意地方直接进行绘制

 

为了实现这个目的,可以采用以下方法:

继承QWidget,通过子类提供直接绘制的方法,并将所有绘制保存到中间的QPixmap

最后在重载的paintEvent中将QPixmap复制显示:

#pragma once

#include <QtWidgets/QWidget>
#include <QPainter>
#include <QResizeEvent>

class PaintWidget: public QWidget
{
	Q_OBJECT
public:
	PaintWidget(QWidget * parent = 0, Qt::WindowFlags f = 0)
		:QWidget(parent, f)
	{
		mPixmap = new QPixmap(width(), height());
		mPainter = new QPainter(mPixmap);
	}

	~PaintWidget()
	{
		delete mPainter;
		delete mPixmap;
	}

	void resizeEvent(QResizeEvent *event)
	{
		if(event->size().width() > mPixmap->width() || event->size().height() > mPixmap->height())
		{
			QPixmap* pixmap = new QPixmap((std::max)(event->size().width(), mPixmap->width()), (std::max)(event->size().height(), mPixmap->height()));
			delete mPainter;
			mPainter = new QPainter(pixmap);
			mPainter->drawPixmap(0, 0, *mPixmap);
			delete mPixmap;
			mPixmap = pixmap;
		}
	}

	void paintEvent(QPaintEvent *event)
	{
		QPainter painter(this);
		painter.drawPixmap(0, 0, *mPixmap);
	}

	QPainter* getPainter()
	{
		return mPainter;
	}
private:
	QPixmap* mPixmap;
	QPainter* mPainter;
};

  使用说明:

       通过子类提供的getPainter()方法获取QPainter指针以便进行绘制,比如:

      paintWidget.getPainter()->drawLine(...);

      paintWidget.update() ;   //绘制之后记得通过paintWidget.update() 通知页面刷新

   

  附:代码中的resizeEvent是为了保证缓存的QPixmap始终比widget大,根据情况你可以直接初始化为所希望的大小

 

标签:Qt,mPixmap,event,paintEvent,mPainter,绘制,QPixmap,QPainter
From: https://www.cnblogs.com/lidabo/p/18066136

相关文章

  • QT 多线程
     第一种:静态函数1voidprint()2{3for(inti=0;i<5;i++)4qInfo()<<"helloglobalprint";5}6classMainWindow:publicQWidget7{8Q_OBJECT9public:10MainWindow(QWidget*parent=nullptr):QWidget(parent)......
  • QT信号与槽机制与事件机制的区别
    QT信号与槽机制与事件机制的区别第一:什么是信号与槽?事件?所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,用自己的一......
  • 使用AT+MQTT指令连接华为云实现数据上传
    1准备工作硬件设备模块:ESP-01-S固件烧录工具:ESP8266下载器串口调试工具:VOFA+参考文章:stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与下发的命令处理2固件更新2.1为什么要重新安装固件由于ESP-01-S模块出厂没有集成MQTT指令,故需要自己下载固件包,详见官网固......
  • Qt ModbusTCP通讯
    前言Modbus在工业控制中的应用非常多,由于其免费使用加上一定的历史环境,Modbus在PLC上的通讯应用非常多,本文主要介绍MosbusTCPmaster(主站)的实现。一、关于ModbusModbus是由MODICON公司开发的一种工业现场总线协议标准,随后施耐德推出了基于TCP/IP的MOdbus协议:Modbustcp;......
  • Qt 使用第三方libmodbus库实现Modbus通讯
    之前发表的Modbus通讯程序使用了QT自带的Modbus库,由于QT自带库的数据响应使用的是信号和槽来实现的,所以在一些读写频率较高的场景下,会引发很多异常问题,此篇文章使用C语言写的第三方Modbus库来实现modbus通讯。 经程序运行测试,调用该库进行modbus通讯完虐QT自带mosbus库。......
  • Qt 基于QTcpSocket的ModbusTCP协议
    一、编写缘由1.发现问题最近项目上要把之前的modbusRTU改为TCP形式,因此之前的modbus通讯线程得重构,一开始当然是使用Qt自带的QModbusTcpClient类,很快就重构好线程,读取数据没有问题,但是只要一发送写数据请求,整个tcp连接就会断开,做了很多尝试,排除了从站的问题,即使直接连modbuss......
  • C++ Qt开发:QNetworkInterface网络接口组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QNetworkInterface组件实现查询详细的网络接口参数。在Qt网络编程中,QNetworkInterface是......
  • C++ Qt开发:QHostInfo主机地址查询组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QHostInfo组件实现对主机地址查询功能。在Qt网络编程中,QHostInfo是一个强大而灵活的组件......
  • R语言中ggplot绘图绘制L型图形,并设置框线的粗细
     001、基础绘图library(ggplot2)##加载包ggplot(data=mtcars,aes(x=wt,y=mpg,colour=factor(cyl)))+geom_point()##绘制散点图 002、增加四边框线library(ggplot2)#导入ggplot包ggplot(d......
  • C++ Qt开发:QFileSystemWatcher文件监视组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QFileSystemWatcher组件实现对文件或目录的监视功能。QFileSystemWatcher是Qt框架中......