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();
}

运行图

在这里插入图片描述

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

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

相关文章

EasyExcel实现复杂Excel的导入

最近项目中遇到一个复杂的Excel的导入&#xff0c;并且数据量较大。因为数据不规则&#xff0c;所以只能使用POI进行自定义读取&#xff0c;但是发现数据量大之后&#xff0c;读取数据非常耗时。后面换成EasyExcel&#xff0c;性能起飞。 1. Excel样板 如上图&#xff0c;需要…

【C++】汇编分析,函数是如何调用,传参,返回

传参 有的是用寄存器传参&#xff0c;有的用push传参 我在MSVC编译测出来的是PUSH传参&#xff08;debug模式&#xff09;&#xff0c;具体过程如下 long func(long a, long b, long c, long d,long e, long f, long g, long h) {long sum;sum (a b c d e f g h);ret…

VMware安装windows虚拟机详细过程

目录 准备工作配置虚拟机为虚拟机设置操作系统镜像安装windows10 准备工作 安装好VMware软件并激活&#xff0c;激活码自行查找 准备好系统镜像文件&#xff0c;可以在MSDN中下载&#xff0c;地址&#xff1a;https://next.itellyou.cn/ 配置虚拟机 选择自定义 默认 选择稍后…

骨灵冷火!Solon Cloud Gateway 照面发布

骨灵冷火&#xff0c;是练药的好火哟。极冷&#xff0c;又极热。在冰冻中被烧死&#xff1a;&#xff09; 1、认识 Solon Cloud Gateway Solon Cloud Gateway 是基于 Solon Cloud、Vert.X 和 Solon Rx(reactive-streams) 接口实现。小特点&#xff1a; 纯响应式的接口体验流…

[Linux]:基本指令(上)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 与Windows环境不同&#xff0c;我们在linux环境下需要通过指令进行各操作&…

13.DataLoader 的使用

DataLoader 的使用 dataset&#xff1a;告诉程序中数据集的位置&#xff0c;数据集中索引&#xff0c;数据集中有多少数据&#xff08;想象成一叠扑克牌&#xff09;dataloader&#xff1a;加载器&#xff0c;将数据加载到神经网络中&#xff0c;每次从dataset中取数据&#x…

Zynq7000系列FPGA中的DDRC纠错码(ECC)

仅在半总线宽度&#xff08;16位&#xff09;数据宽度配置中提供可选的ECC支持。这种配置下&#xff0c;外部DRAM DDR设备需要26位&#xff0c;其中16位用于数据&#xff0c;10位用于ECC。每个数据字节使用独立的5位ECC字段&#xff0c;这种模式提供了单错误纠正和双错误检测的…

UE5蓝图 抽卡出货概率

SSR概率0.1 SR概率0.2 R概率0.7 ps&#xff1a;数组内相加为1。且从小到大排序。

C练手题--Two Oldest Ages 【7 kyu】

一、原题 链接&#xff1a;Training on Two Oldest Ages | Codewars The two oldest ages function/method needs to be completed. It should take an array of numbers as its argument and return the two highest numbers within the array. The returned value should b…

网络-多路io

了 fcntl 函数来操作文件描述符的状态标志&#xff0c;其中主要是为了设置非阻塞模式。下面是对 fcntl 函数及其参数的详细解释&#xff1a; fcntl 函数 fcntl 是一个用于操作文件描述符的系统调用&#xff0c;可以用来设置或获取文件描述符的各种属性。其原型如下&#xff1…

Ubuntu Linux Server安装Kubernetes

本文主要描述在Ubuntu Linux Server操作系统中安装Kubernetes云原生对应的microk8s组件。 sudo snap install microk8s --classic 如上所示&#xff0c;在Ubuntu服务器中安装microk8s组件完成&#xff0c;对应的版本是microk8s v1.30版本 microk8s enable dashboard 如上所…

华为云征文|基于Flexus云服务器X实例的应用场景-定时给微信群中推送新闻简报

&#x1f534;大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 先看这里 写在前面效果华为云Flexus X实例服务器部署开源的热点新闻项目ssh连接服务器docker部署今日热点项目访问今日热点项目 搭建微信交互工具获取token创建发送的公共方法…

【Spring】获取cookie,session,header(3)

本系列共涉及4个框架&#xff1a;Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点&#xff0c;根据序号学习即可。 目录 本系列共涉及4个框架&#xff1a;Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点&#xff0c;根据序号学习即可。…

Linux主机网络参数的设置—IP地址的作用和类型

网络参数管理 一.网络参数 主机名&#xff0c;IP地址&#xff0c;子网掩码&#xff0c;网关&#xff0c;DNS服务器地址 1.配置主机名 hostname命令来查看当前系统的主机名&#xff0c; hosnamectl set-hostname 修改centos7的主机名&#xff0c; 建议以FQDN的&#xff…

惠中科技光伏清洗剂:点亮绿色能源未来

在当今全球追求可持续发展的时代&#xff0c;光伏产业作为清洁能源的重要代表&#xff0c;正发挥着日益关键的作用。而在光伏产业的高效运行中&#xff0c;惠中科技的光伏清洗剂犹如一颗璀璨的明珠&#xff0c;为光伏板的清洁与维护贡献着卓越力量。 一、光伏产业的挑战与需求…

STM32嵌入式面试知识点总结

一、STM32F1和F4的区别&#xff1f; 解答&#xff1a; 参看&#xff1a;STM32开发 – STM32初识内核不同&#xff1a;F1是Cortex-M3内核&#xff0c;F4是Cortex-M4内核&#xff1b;主频不同&#xff1a;F1主频72MHz&#xff0c;F4主频168MHz&#xff1b;浮点运算&#xff1a;…

【C++ Primer Plus习题】8.3

问题: 解答: #include <iostream> #include <string> #include <cctype> using namespace std;void function(string& str) {for (int i 0; i < str.size(); i){str[i]toupper(str[i]);} }int main() {string str;while (true){cout << "…

od机试题目

od试题 日志采集TLV 日志采集 思路&#xff1a; 处理输入&#xff1a; Scanner 拿到整个输入 放入string[] 按照" "分隔 调用Integer.parseInt 将string转int类型 解题&#xff1a; 用一个变量count记录当前日志数量&#xff0c;初始为输入的第一个参数 用一个max变…

Java中类的成员介绍

我的后端学习大纲 我的Java学习大纲 4.类的成员&#xff1a; 3.1.类的成员 -> 属性介绍&#xff08;成员变量&#xff09;&#xff1a; a.语法格式&#xff1a; 1.修饰符 数据类型 属性名 初始化值 ;2.说明1: 修饰符 常用的权限修饰符有&#xff1a;private、缺省、prot…

网络原理 - 初识

文章目录 局域网(LAN)广域网(WAN)网络设备IP地址格式 端口号格式 认识网络协议协议分层 OSI七层模型(只是理论,没有实际运用)TCP/IP五层&#xff08;或四层&#xff09;模型网络设备所在分层 封装和分用 计算机之间通过网络来传输数据&#xff0c;也称为网络通信。 根据网络互连…