宿迁做网站大公司,达令的网站建设,网站 技术方案,wordpress 开场采用双缓冲实现界面实时响应鼠标的拖动绘制。
思想如下#xff1a;首先需要两张画布pix和tempPix#xff0c;他们都是QPixmap实例#xff1b;pix用来保存初始界面或上一阶段以完成的绘制#xff1b;tempPix用来作为鼠标拖动时的实时界面绘制#xff1b;当鼠标左键按下后拖…采用双缓冲实现界面实时响应鼠标的拖动绘制。
思想如下首先需要两张画布pix和tempPix他们都是QPixmap实例pix用来保存初始界面或上一阶段以完成的绘制tempPix用来作为鼠标拖动时的实时界面绘制当鼠标左键按下后拖动时每次都将将pix赋值给tempPix然后用tempPix进行绘制最后鼠标左键释放时将tempPix赋值给pix。
widget.h代码如下
#ifndef WIDGET_H
#define WIDGET_H#include QWidgetQT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();protected:void mousePressEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void paintEvent(QPaintEvent *event);
private:Ui::Widget *ui;QPixmap pix;QPixmap tempPix;QPoint startPoint;QPoint endPoint;bool isDrawing;
};
#endif // WIDGET_Hwidget.cpp代码如下
#include widget.h
#include ui_widget.h
#include QMouseEvent
#include QPainterWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);pix QPixmap(400, 300);//宽高pix.fill(Qt::white);tempPix pix;isDrawing false;
}void Widget::mousePressEvent(QMouseEvent *event)
{if(event-button() Qt::LeftButton) {startPoint event-pos();isDrawing true;}
}void Widget::mouseMoveEvent(QMouseEvent *event)
{if(event-buttons() Qt::LeftButton) {endPoint event-pos();tempPix pix;update(); //调用paintEvent();}
}void Widget::mouseReleaseEvent(QMouseEvent *event)
{if(event-button() Qt::LeftButton) {endPoint event-pos();isDrawing false;update();}
}void Widget::paintEvent(QPaintEvent *)
{int x startPoint.x();int y startPoint.y();int width endPoint.x() - x;int height endPoint.y() - y;QPainter painter;painter.begin(tempPix);painter.drawRect(x, y, width, height);painter.end();painter.begin(this);painter.drawPixmap(0, 0, tempPix);if(!isDrawing) {pix tempPix;}
}Widget::~Widget()
{delete ui;
}效果展示