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

Qt22双缓冲机制

Qt22双缓冲机制

  • 知识点
  • drawwidget
    • drawwidget.h
    • drawwidget.cpp
  • mainwindow
    • mainwindow.h
    • mainwindow.cpp
  • main.cpp
  • 运行图

知识点

双缓冲就是在内存区申请一块缓存;然后显卡直接从这块内存读取数据.。
这样就不用鼠标边画,经过IO来读取这个环节;

鼠标驱动 — 内存缓冲区— 显卡

drawwidget

drawwidget.h

#ifndef DRAWWIDGET_H
#define DRAWWIDGET_H#include <QMainWindow>
#include <QtGui>
#include <QMouseEvent>
#include <QPaintEvent>
#include <QResizeEvent>
#include <QColor>
#include <QPixmap>
#include <QPoint>
#include <QPainter>
#include <QPalette>
#include <QPen>class drawWidget : public QWidget
{Q_OBJECTpublic:explicit drawWidget(QWidget* parent = 0);public:void mousePressEvent(QMouseEvent*);void mouseMoveEvent(QMouseEvent*);void paintEvent(QPaintEvent*);void resizeEvent(QResizeEvent*);public slots:void setStyle(int);void setWidth(int);void setColor(QColor);void clear();
private:QPixmap* pix;QPoint startPos;QPoint endPos;int style;int weight;QColor color;};
#endif // DRAWWIDGET_H

drawwidget.cpp

#include "drawwidget.h"drawWidget::drawWidget(QWidget *parent): QWidget(parent)
{setAutoFillBackground(true);setPalette(QPalette(Qt::white));pix = new QPixmap(size());pix->fill(Qt::white);setMinimumSize(600,400);
}void drawWidget::mousePressEvent(QMouseEvent * e)
{startPos = e->pos();
}void drawWidget::mouseMoveEvent(QMouseEvent *e)
{QPainter *painter = new QPainter;QPen pen;pen.setStyle((Qt::PenStyle)style);pen.setWidth(weight);pen.setColor(color);painter->begin(pix);painter->setPen(pen);painter->drawLine(startPos,e->pos());painter->end();startPos = e->pos();update();}void drawWidget::paintEvent(QPaintEvent *)
{//把图片内存的数据  绘制到窗体控件中QPainter painter(this);painter.drawPixmap(QPoint(0,0),*pix);
}void drawWidget::resizeEvent(QResizeEvent *event)
{if(height()>pix->height() || width()>pix->width())//如果图片尺寸发生改变{QPixmap *newPix = new QPixmap(size());newPix->fill(Qt::white);QPainter p(newPix);p.drawPixmap(QPoint(0,0),*pix);pix = newPix;}QWidget::resizeEvent(event);
}void drawWidget::setStyle(int s)
{style = s;
}void drawWidget::setWidth(int w)
{weight = w;}void drawWidget::setColor(QColor c)
{color = c;
}void drawWidget::clear()
{QPixmap *clearPix = new QPixmap(size());clearPix->fill(Qt::white);pix = clearPix;update();
}

mainwindow

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QToolButton>
#include <QLabel>
#include <QComboBox>
#include <QSpinBox>
#include <QToolBar>
#include <QColorDialog>#include "drawwidget.h"class MainWindow : public QMainWindow
{Q_OBJECT
public:MainWindow(QWidget *parent = nullptr);~MainWindow();void createToolBar();signals:
public slots:void ShowStyle();void ShowColor();
private:drawWidget *drawwidget;QLabel* styleLabel;QComboBox* styleComboBox;QLabel* widthLabel;QSpinBox* widthSpinBox;QToolButton* colorBtn;QToolButton* clearBtn;
};#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow{parent}
{drawwidget = new drawWidget;setCentralWidget(drawwidget);createToolBar();setMinimumSize(600,400);ShowStyle();drawwidget->setWidth(widthSpinBox->value());drawwidget->setColor(Qt::black);
}MainWindow::~MainWindow()
{}void MainWindow::createToolBar()
{QToolBar* toolBar = addToolBar("Tool");styleLabel = new QLabel(tr("线型风格:"));styleComboBox = new QComboBox;styleComboBox->addItem(tr("SolidLine"),static_cast<int>(Qt::SolidLine));styleComboBox->addItem(tr("DashLine"),static_cast<int>(Qt::DashLine));styleComboBox->addItem(tr("DotLine"),static_cast<int>(Qt::DotLine));styleComboBox->addItem(tr("DashDotLine"),static_cast<int>(Qt::DashDotLine));styleComboBox->addItem(tr("DashDotDotLine"),static_cast<int>(Qt::DashDotDotLine));connect(styleComboBox,static_cast<void (QComboBox::*)(int)>(&QComboBox::activated),this,&MainWindow::ShowStyle);widthLabel = new QLabel(tr("线宽:"));widthSpinBox =new QSpinBox;connect(widthSpinBox,static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),drawwidget,&drawWidget::setWidth);colorBtn = new QToolButton;QPixmap pixmap(20,20);pixmap.fill(Qt::black);colorBtn->setIcon(QIcon(pixmap));connect(colorBtn,&QToolButton::clicked,this,&MainWindow::ShowColor);clearBtn = new QToolButton;clearBtn->setText(tr("清除"));connect(clearBtn,&QToolButton::clicked,drawwidget,&drawWidget::clear);toolBar->addWidget(styleLabel);toolBar->addWidget(styleComboBox);toolBar->addWidget(widthLabel);toolBar->addWidget(widthSpinBox);toolBar->addWidget(colorBtn);toolBar->addWidget(clearBtn);}void MainWindow::ShowStyle()
{drawwidget->setStyle(styleComboBox->itemData(styleComboBox->currentIndex(),Qt::UserRole).toInt());}void MainWindow::ShowColor()
{QColor color =QColorDialog::getColor(static_cast<int>(Qt::black));if(color.isValid()){drawwidget->setColor(color);QPixmap p(20,20);p.fill(color);colorBtn->setIcon(QIcon(p));}}

main.cpp

#include "mainwindow.h"#include <QApplication>
#include <QFont>int main(int argc, char *argv[])
{QApplication a(argc, argv);QFont font("ZYSong18030",12);a.setFont(font);MainWindow w;w.show();return a.exec();
}

运行图

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 网络模型及协议介绍
  • 使用 EasyExcel 高效读取大文件 Excel
  • Java内部类的应用分析
  • 【千帆AppBuilder】使用Python调用基于官方的API创建图片故事的应用,一起体验下全代码模式下是怎样的效果
  • PhpStorm下调试功能配置
  • KAN学习Day1——模型框架解析及HelloKAN
  • Spring boot整合接入Redis
  • shell脚本前置基础
  • 揭秘组合模式:C++设计模式的奥秘与应用!
  • 《基础模型时代的图像分割》研究综述
  • 视频素材网站无水印的有哪些?热门视频素材网站分享!
  • 文心快码帮你解大厂面试题:一次请求从浏览器进入到Sping框架的服务,整个请求的生命周期是什么?
  • HTB-lgnition(curl工具、yakit、 弱口令)
  • Git —— 2、配置本地与远程免密仓库免密访问、实操创建本地仓库与上github新仓库关联
  • stm32之硬件I2C读写MPU6050陀螺仪、加速度传感器应用案例
  • CSS居中完全指南——构建CSS居中决策树
  • gitlab-ci配置详解(一)
  • gops —— Go 程序诊断分析工具
  • httpie使用详解
  • in typeof instanceof ===这些运算符有什么作用
  • Java 多线程编程之:notify 和 wait 用法
  • MySQL的数据类型
  • node-glob通配符
  • orm2 中文文档 3.1 模型属性
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Vue官网教程学习过程中值得记录的一些事情
  • 安卓应用性能调试和优化经验分享
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 码农张的Bug人生 - 初来乍到
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 译自由幺半群
  • 用 Swift 编写面向协议的视图
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • Java总结 - String - 这篇请使劲喷我
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​一些不规范的GTID使用场景
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #{}和${}的区别是什么 -- java面试
  • #565. 查找之大编号
  • #70结构体案例1(导师,学生,成绩)
  • $refs 、$nextTic、动态组件、name的使用
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C++17) std算法之执行策略 execution
  • (day 12)JavaScript学习笔记(数组3)
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (全注解开发)学习Spring-MVC的第三天
  • (十八)SpringBoot之发送QQ邮件
  • (一)基于IDEA的JAVA基础12
  • (一一四)第九章编程练习
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)总结使用Unity 3D优化游戏运行性能的经验