请用Qt写一个简单画图软件
时间: 2023-06-19 07:07:57 浏览: 63
好的,以下是一个简单的画图软件的实现,基于Qt 5.15版本:
1. 创建一个Qt Widgets应用程序项目。
2. 在主窗口中添加一个QWidget,作为绘图区域。并设置该QWidget的背景为白色。
3. 在主窗口中添加一个QToolBar,用于放置绘图工具按钮。
4. 在QToolBar中添加QPushButton,分别对应不同的绘图工具(例如:画笔、直线、矩形、圆形等)。
5. 在主窗口中添加一个QColorDialog,用于选择画笔颜色。
6. 在主窗口的构造函数中,连接各个按钮的clicked信号到对应的槽函数,实现绘图功能。
7. 在绘图区域的绘图事件中,根据当前的绘图工具和颜色,调用对应的绘图函数进行绘图。
以下是一个简单的实现示例:
mainwindow.h
```cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QToolBar>
#include <QPushButton>
#include <QColorDialog>
#include <QPainter>
#include <QMouseEvent>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
protected:
void paintEvent(QPaintEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
private slots:
void onPenBtnClicked();
void onLineBtnClicked();
void onRectBtnClicked();
void onEllipseBtnClicked();
void onColorBtnClicked();
private:
enum DrawShape {
PenShape,
LineShape,
RectShape,
EllipseShape
};
bool m_isDrawing;
DrawShape m_drawShape;
QColor m_penColor;
QPoint m_lastPoint;
QPoint m_currentPoint;
QWidget *m_drawWidget;
QToolBar *m_toolbar;
QPushButton *m_penBtn;
QPushButton *m_lineBtn;
QPushButton *m_rectBtn;
QPushButton *m_ellipseBtn;
QPushButton *m_colorBtn;
QColorDialog *m_colorDialog;
void drawPen(const QPoint &point);
void drawLine(const QPoint &start, const QPoint &end);
void drawRect(const QPoint &topLeft, const QPoint &bottomRight);
void drawEllipse(const QPoint ¢er, int rx, int ry);
};
#endif // MAINWINDOW_H
```
mainwindow.cpp
```cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, m_isDrawing(false)
, m_drawShape(PenShape)
, m_penColor(Qt::black)
, m_lastPoint(QPoint())
, m_currentPoint(QPoint())
{
// 创建绘图区域
m_drawWidget = new QWidget(this);
setCentralWidget(m_drawWidget);
m_drawWidget->setStyleSheet("background-color: white;");
// 创建工具栏
m_toolbar = addToolBar("Tools");
// 创建画笔按钮
m_penBtn = new QPushButton("Pen", this);
m_penBtn->setCheckable(true);
m_penBtn->setChecked(true);
connect(m_penBtn, &QPushButton::clicked, this, &MainWindow::onPenBtnClicked);
m_toolbar->addWidget(m_penBtn);
// 创建直线按钮
m_lineBtn = new QPushButton("Line", this);
m_lineBtn->setCheckable(true);
connect(m_lineBtn, &QPushButton::clicked, this, &MainWindow::onLineBtnClicked);
m_toolbar->addWidget(m_lineBtn);
// 创建矩形按钮
m_rectBtn = new QPushButton("Rect", this);
m_rectBtn->setCheckable(true);
connect(m_rectBtn, &QPushButton::clicked, this, &MainWindow::onRectBtnClicked);
m_toolbar->addWidget(m_rectBtn);
// 创建椭圆按钮
m_ellipseBtn = new QPushButton("Ellipse", this);
m_ellipseBtn->setCheckable(true);
connect(m_ellipseBtn, &QPushButton::clicked, this, &MainWindow::onEllipseBtnClicked);
m_toolbar->addWidget(m_ellipseBtn);
// 创建颜色按钮
m_colorBtn = new QPushButton("Color", this);
connect(m_colorBtn, &QPushButton::clicked, this, &MainWindow::onColorBtnClicked);
m_toolbar->addWidget(m_colorBtn);
// 创建颜色选择对话框
m_colorDialog = new QColorDialog(this);
}
MainWindow::~MainWindow()
{
}
void MainWindow::paintEvent(QPaintEvent *event)
{
QPainter painter(m_drawWidget);
painter.setPen(QPen(m_penColor, 2));
switch (m_drawShape) {
case PenShape:
break;
case LineShape:
painter.drawLine(m_lastPoint, m_currentPoint);
break;
case RectShape:
painter.drawRect(QRect(m_lastPoint, m_currentPoint));
break;
case EllipseShape:
painter.drawEllipse(m_lastPoint, std::abs(m_currentPoint.x() - m_lastPoint.x()), std::abs(m_currentPoint.y() - m_lastPoint.y()));
break;
default:
break;
}
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_isDrawing = true;
m_lastPoint = event->pos();
m_currentPoint = event->pos();
update();
}
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
if (m_isDrawing) {
m_currentPoint = event->pos();
update();
}
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton && m_isDrawing) {
m_isDrawing = false;
m_currentPoint = event->pos();
update();
}
}
void MainWindow::onPenBtnClicked()
{
m_drawShape = PenShape;
}
void MainWindow::onLineBtnClicked()
{
m_drawShape = LineShape;
}
void MainWindow::onRectBtnClicked()
{
m_drawShape = RectShape;
}
void MainWindow::onEllipseBtnClicked()
{
m_drawShape = EllipseShape;
}
void MainWindow::onColorBtnClicked()
{
QColor color = m_colorDialog->getColor(m_penColor, this, "Select Color");
if (color.isValid()) {
m_penColor = color;
}
}
void MainWindow::drawPen(const QPoint &point)
{
QPainter painter(m_drawWidget);
painter.setPen(QPen(m_penColor, 2));
painter.drawPoint(point);
}
void MainWindow::drawLine(const QPoint &start, const QPoint &end)
{
QPainter painter(m_drawWidget);
painter.setPen(QPen(m_penColor, 2));
painter.drawLine(start, end);
}
void MainWindow::drawRect(const QPoint &topLeft, const QPoint &bottomRight)
{
QPainter painter(m_drawWidget);
painter.setPen(QPen(m_penColor, 2));
painter.drawRect(QRect(topLeft, bottomRight));
}
void MainWindow::drawEllipse(const QPoint ¢er, int rx, int ry)
{
QPainter painter(m_drawWidget);
painter.setPen(QPen(m_penColor, 2));
painter.drawEllipse(QRect(center.x() - rx, center.y() - ry, 2 * rx, 2 * ry));
}
```