QT双缓冲机制

QT双缓冲机制

程序

绘图

.h
#ifndef DRAWWIDGET_H
#define DRAWWIDGET_H

#include <QWidget>
#include <QMouseEvent>

class DrawWidget : public QWidget
{
    Q_OBJECT
public:
    explicit DrawWidget(QWidget *parent = nullptr);
    void mousePressEvent(QMouseEvent*);
    void mouseMoveEvent(QMouseEvent*);
    void paintEvent(QPaintEvent*);
    void resizeEvent(QResizeEvent*);

signals:

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

.cpp
#include "drawwidget.h"
#include <QPen>
#include <QPainter>

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

主窗口

.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QToolButton>
#include <QLabel>
#include <QComboBox>
#include <QSpinBox>
#include "drawwidget.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void createToolBar();
public slots:
    void showStyle();
    void showColor();
private:
    DrawWidget *drawwidget;
    QLabel *styleLabel;
    QComboBox *styleComboBox;
    QLabel *widthLabel;
    QSpinBox *widthSpinBox;
    QToolButton *colorBtn;
    QToolButton *clearBtn;
};

#endif // MAINWINDOW_H
.cpp
#include "mainwindow.h"
#include <QToolBar>
#include <QColorDialog>

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("线性风格");
    styleComboBox=new QComboBox;
    styleComboBox->addItem("SolidLine",static_cast<int>(Qt::SolidLine));
    styleComboBox->addItem("DashLine",static_cast<int>(Qt::DashLine));
    styleComboBox->addItem("DotLine",static_cast<int>(Qt::DotLine));
    styleComboBox->addItem("DashDotLine",static_cast<int>(Qt::DashDotLine));
    styleComboBox->addItem("CustomDashLine",static_cast<int>(Qt::CustomDashLine));
    connect(styleComboBox,SIGNAL(activated(int)),this,SLOT(showStyle()));
    widthLabel=new QLabel("线宽");
    widthSpinBox=new QSpinBox;
    connect(widthSpinBox,SIGNAL(valueChanged(int)),drawwidget,SLOT(setWidth(int)));
    colorBtn=new QToolButton;
    QPixmap pixmap(20,20);
    pixmap.fill(Qt::black);
    colorBtn->setIcon(QIcon(pixmap));
    connect(colorBtn,SIGNAL(clicked()),this,SLOT(showColor()));
    clearBtn=new QToolButton;
    clearBtn->setText("清除");
    connect(clearBtn,SIGNAL(clicked()),drawwidget,SLOT(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),this);
    if(color.isValid())
    {
        drawwidget->setColor(color);
        QPixmap p(20,20);
        p.fill(color);
        colorBtn->setIcon(QIcon(p));
    }
}

效果展示

在这里插入图片描述

发布了31 篇原创文章 · 获赞 3 · 访问量 285

猜你喜欢

转载自blog.csdn.net/weixin_44011306/article/details/105449900