所谓双缓冲机制吗,是指在绘制控件时,首先将要绘制的内容绘制在一个图片中,再将图片一次性地绘制到控件中。
案例分析:绘图工具,可以选择线型、线宽及颜色等基本要素。QMainWindow对象作为主窗口,QToolBar对象作为工具栏,QQWidget对象作为主窗口的中央窗体CentralWidget,也是绘图区。
这里需要先创建一个头文件
draw_widget.h
#ifndef DRAW_WIDGET_H
#define DRAW_WIDGET_H
#include <QWidget>
#include <QtGui>
#include <QMouseEvent>//鼠标事件
#include <QPaintEvent> // 绘制事件
#include <QResizeEvent> //实时获取窗口操作等大小
#include <QColor>
#include <QPixmap>//显示图像
#include <QPainter>//绘制图形
#include <QPalette>//修改背景颜色
#include <QPen>
#include <QPoint>
class draw_widget : public QWidget
{
Q_OBJECT
public:
explicit draw_widget(QWidget *parent = nullptr);
void mousePressEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
void paintEvent(QPaintEvent *);
void resizeEvent(QResizeEvent *event);
signals:
public slots:
void setStyle(int);//设置线风格
void setWidth(int);// 设置线宽度
void setColor(QColor);//设备线颜色
void clearFunc();//清除函数
private:
QPixmap *pix;
QPoint startpos;
QPoint endpos;
int style,weightss;
QColor color;
};
#endif // DRAW_WIDGET_H
mainwindows.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QLabel>
#include <QComboBox>
#include <QToolBar>
#include <QSpinBox>
#include "draw_widget.h"
#include <QGridLayout>
#include <QToolButton>
#include <QColorDialog>
#include <QToolBar>
#include <QPixmap>//显示图像
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void CreateToolBarFunc();
private:
draw_widget *drawWidget;
QLabel *labelstyle;
QComboBox *comboboxstyle;
QLabel *labelwidth;
QSpinBox *spoinboxlabelwidth;
QToolButton *colorbutton;
QToolButton *clearbutton;
QGridLayout *gridlayout;
private slots:
void dispstyle();
void dispcolor();
};
#endif // MAINWINDOW_H
draw_widget.cpp
#include "draw_widget.h"
draw_widget::draw_widget(QWidget *parent) : QWidget(parent)
{
setAutoFillBackground(true);
setPalette(QPalette(Qt::white));
pix=new QPixmap(size());
pix->fill(Qt::white);
//设置绘制区窗口最小尺寸
setMinimumSize(600,400);
}
void draw_widget::setStyle(int s)//设置线风格
{
style=s;
}
void draw_widget::setWidth(int w)// 设置线宽度
{
weightss=w;
}
void draw_widget::setColor(QColor c)//设备线颜色
{
color =c;
}
void draw_widget::clearFunc()//清除函数
{
QPixmap *cPix=new QPixmap(size());
cPix->fill(Qt::white);
pix=cPix;
update();
}
void draw_widget::mousePressEvent(QMouseEvent * e)
{
startpos=e->pos();
}
void draw_widget::mouseMoveEvent(QMouseEvent *e)
{
QPainter *painter=new QPainter;
QPen pen;
pen.setStyle((Qt::PenStyle)style);
pen.setWidth(weightss);
pen.setColor(color);
painter->begin(pix);
painter->setPen(pen);
painter->drawLine(startpos,e->pos());
painter->end();
startpos=e->pos();
update();
}
void draw_widget::paintEvent(QPaintEvent *)
{
QPainter Painter(this);
Painter.drawPixmap(QPoint(0,0),*pix);
}
void draw_widget::resizeEvent(QResizeEvent *event)
{
if(height()>pix->height()||width()>pix->width())
{
QPixmap *newPix=new QPixmap(size());
newPix->fill (Qt::white);
QPainter ps(newPix);
ps.drawPixmap(QPoint(0,0),*pix);
pix=newPix;
}
QWidget::resizeEvent(event);
}
mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle("图形绘制综合案例分析(双缓冲机制)");
drawWidget=new draw_widget;
setCentralWidget(drawWidget);//将刚才创建对象作为主窗口的中心窗口
CreateToolBarFunc();//调用此函数实现创建工具栏
setMinimumSize(600,400);
dispstyle();
drawWidget->setWidth(spoinboxlabelwidth->value());//初始化线宽度
drawWidget->setColor(Qt::blue);//初始化线颜色
}
MainWindow::~MainWindow()
{
}
void MainWindow::CreateToolBarFunc()
{
QToolBar *toobar=addToolBar("Tool");
labelstyle=new QLabel("线型风格:");
comboboxstyle=new QComboBox;
comboboxstyle->addItem("SolidLine",static_cast<int>(Qt::SolidLine));//实现
comboboxstyle->addItem("DotLine",static_cast<int>(Qt::DotLine));//虚线
connect(comboboxstyle,SIGNAL(activeated(int)),this,SLOT(dispstyle()));
labelwidth=new QLabel("线型宽度:");
spoinboxlabelwidth=new QSpinBox;
connect(spoinboxlabelwidth,SIGNAL(valueChanged(int)),drawWidget,SLOT(setWidth(int)));
colorbutton=new QToolButton;
QPixmap pixmap(20,20);
pixmap.fill(Qt::black);
colorbutton->setIcon(QIcon(pixmap));
connect(colorbutton,SIGNAL(clicked()),this,SLOT(dispcolor()));
clearbutton=new QToolButton;
clearbutton->setText("清除");
connect(clearbutton,SIGNAL(clicked()),drawWidget,SLOT(clearFunc()));
toobar->addWidget(labelstyle);
toobar->addWidget(comboboxstyle);
toobar->addWidget(labelwidth);
toobar->addWidget(spoinboxlabelwidth);
toobar->addWidget(colorbutton);
toobar->addWidget(clearbutton);
}
void MainWindow::dispstyle()
{
drawWidget->setStyle(comboboxstyle->itemData(comboboxstyle->currentIndex(),Qt::UserRole).toInt());
}
void MainWindow::dispcolor()
{
QColor color=QColorDialog::getColor(static_cast<int>(Qt::black));
if(color.isValid())
{
drawWidget->setColor(color);
QPixmap ps(20,20);
ps.fill(color);
}
}