個(gè)人簡(jiǎn)歷制作網(wǎng)站營(yíng)銷網(wǎng)站做的好的公司
采用雙緩沖實(shí)現(xiàn)界面實(shí)時(shí)響應(yīng)鼠標(biāo)的拖動(dòng)繪制。
思想如下:首先需要兩張畫布pix和tempPix,他們都是QPixmap實(shí)例;pix用來保存初始界面或上一階段以完成的繪制;tempPix用來作為鼠標(biāo)拖動(dòng)時(shí)的實(shí)時(shí)界面繪制;當(dāng)鼠標(biāo)左鍵按下后拖動(dòng)時(shí)每次都將將pix賦值給tempPix,然后用tempPix進(jìn)行繪制,最后鼠標(biāo)左鍵釋放時(shí)將tempPix賦值給pix。
widget.h代碼如下
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_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_H
widget.cpp代碼如下:
#include "widget.h"
#include "ui_widget.h"
#include <QMouseEvent>
#include <QPainter>Widget::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(); //調(diào)用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;
}