程序
绘图
.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
.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=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
.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));
}
}
效果展示