QPainter Pixmap和widget联合画图 您所在的位置:网站首页 qt如何在qwidget上画图 QPainter Pixmap和widget联合画图

QPainter Pixmap和widget联合画图

2023-09-04 17:52| 来源: 网络整理| 查看: 265

最近在使用双缓冲画图的时候,发现有一部分 不需要双缓冲。其实解决办法就是先双缓冲画图,剩下的直接画在widget上。

h文件

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include #include #include #include #define PI 3.1415926 namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); void paintEvent(QPaintEvent *paint); void resizeEvent(QResizeEvent *event); void allShowPaint(); void drawSingleLine(); public slots: void dealTimeOut(); private slots: private: Ui::MainWindow *ui; double curScale = 0; int angle1 = 0; int angle2 = 0; QTimer *timer = 0; QPixmap *m_pixmap = 0; }; #endif // MAINWINDOW_H

CPP文件

#pragma execution_character_set("utf-8") #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); curScale = 1; m_pixmap = new QPixmap(size()); m_pixmap->fill(Qt::white); timer = new QTimer(this); timer->start(100); connect(timer,&QTimer::timeout,this,&MainWindow::dealTimeOut); } MainWindow::~MainWindow() { delete ui; } void MainWindow::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); allShowPaint(); painter.drawPixmap(0,0,*m_pixmap); drawSingleLine(); } void MainWindow::resizeEvent(QResizeEvent *event) { if(m_pixmap) { delete m_pixmap; m_pixmap = new QPixmap(size()); } } void MainWindow::allShowPaint() { QPainter painter(m_pixmap); painter.save(); painter.translate(width()>>1,height()>>1); painter.setRenderHint(QPainter::Antialiasing,true); painter.fillRect(-width()>>1,-height()>>1,width(),height(),Qt::transparent); painter.setPen(Qt::NoPen); int r = 100; int num =4; for(int i = 0;i>1,height()>>1); painter.setRenderHint(QPainter::Antialiasing,true); int r =100; painter.save(); painter.setPen(Qt::red); painter.drawLine(0,0,r*cos(PI*angle1/180),-r*sin(PI*angle1/180)); painter.restore(); } void MainWindow::dealTimeOut() { if(angle1 >360) { angle1 = 0; } else { angle1+=5; } graphChart(); update(); }

关键部分:

运行截图:



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有