基于Qt框架实现绘图软件的功能
一、项目架构设计
1. 模块划分
// 核心类关系图
+-------------------+ +-------------------+ +-------------------+
| MainWindow | →→→→→ | GraphicsScene | →→→→→ | CustomGraphicsItem |
| - 工具栏/菜单 | | - 图形管理 | | - 图形基类 |
| - 状态栏 | | - 坐标转换 | | - 属性存储 |
+-------------------+ +-------------------+ +-------------------+
2. 关键类设计
// 自定义图形基类
class CustomGraphicsItem : public QGraphicsItem {
public:
enum ItemType { RECT, ELLIPSE, LINE, TEXT };
CustomGraphicsItem(ItemType type, QGraphicsItem *parent = nullptr);
QRectF boundingRect() const override;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
// 属性设置接口
void setColor(const QColor &color);
void setRotationAngle(qreal angle);
void setScaleFactor(qreal factor);
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
private:
ItemType m_type;
QColor m_color;
qreal m_rotation;
qreal m_scale;
QPointF m_startPos;
};
二、核心功能实现
1. 图形绘制模块
// 自定义矩形绘制
CustomGraphicsRectItem::CustomGraphicsRectItem(QGraphicsItem *parent)
: QGraphicsRectItem(-50, -50, 100, 50, parent), m_type(RECT) {
setFlag(ItemIsMovable | ItemIsSelectable);
setAcceptHoverEvents(true);
}
// 绘制事件处理
void CustomGraphicsRectItem::paint(QPainter *painter,
const QStyleOptionGraphicsItem *option,
QWidget *widget) {
painter->setPen(Qt::black);
painter->setBrush(QBrush(m_color));
painter->drawRect(rect());
// 绘制控制点(缩放手柄)
QPainterPath handles;
handles.addEllipse(rect().adjusted(0,0,-5,-5).topLeft(), 5,5);
handles.addEllipse(rect().adjusted(0,0,-5,-5).topRight(), 5,5);
painter->drawPath(handles);
}
2. 缩放与旋转实现
// 视图缩放(支持鼠标滚轮)
void GraphicsView::wheelEvent(QWheelEvent *event) {
if(event->angleDelta().y() > 0) {
scale(1.1, 1.1); // 放大
} else {
scale(0.9, 0.9); // 缩小
}
}
// 图形旋转(按住Ctrl+拖动)
void CustomGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
if(event->modifiers() == Qt::ControlModifier) {
m_startPos = event->scenePos();
} else {
QGraphicsItem::mousePressEvent(event);
}
}
void CustomGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
if(event->modifiers() == Qt::ControlModifier) {
qreal delta = (event->scenePos() - m_startPos).manhattanLength();
setRotation(rotation() + delta / 2); // 每像素旋转0.5度
m_startPos = event->scenePos();
} else {
QGraphicsItem::mouseMoveEvent(event);
}
}
三、交互功能实现
1. 图形选择与操作
// 多选处理
void MainWindow::keyPressEvent(QKeyEvent *event) {
if(event->key() == Qt::Key_Control) {
view->setDragMode(QGraphicsView::RubberBandDrag);
}
}
// 组合操作
void MainWindow::onGroupAction() {
QList<QGraphicsItem *> selected = scene->selectedItems();
if(selected.size() < 2) return;
QGraphicsItemGroup *group = new QGraphicsItemGroup;
for(auto item : selected) {
group->addToGroup(item);
}
scene->addItem(group);
}
// 反选功能
void MainWindow::onInvertSelection() {
QList<QGraphicsItem *> allItems = scene->items();
for(auto item : allItems) {
item->setSelected(!item->isSelected());
}
}
四、界面设计
1. 工具栏配置
// 创建工具栏
QToolBar *toolbar = addToolBar("绘图工具");
// 添加绘图按钮
QAction *rectAction = new QAction(QIcon(":/icons/rect.png"), "矩形", this);
connect(rectAction, &QAction::triggered, [=]{
scene->addItem(new CustomGraphicsRectItem);
});
// 添加缩放控件
QSpinBox *zoomSpinBox = new QSpinBox;
zoomSpinBox->setRange(10, 400);
zoomSpinBox->setValue(100);
connect(zoomSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), [=](int val){
view->setTransform(QTransform::fromScale(val/100.0, val/100.0));
});
toolbar->addWidget(zoomSpinBox);
五、性能优化方案
1. 双缓冲绘图
// 在自定义图形项中启用双缓冲
void CustomGraphicsItem::paint(QPainter *painter, ...) {
painter->setRenderHint(QPainter::Antialiasing);
painter->setRenderHint(QPainter::SmoothPixmapTransform);
// ... 绘制逻辑
}
2. 批量更新
// 启用场景批量更新
void MainWindow::batchUpdate() {
scene->blockSignals(true);
scene->prepareGeometryChange();
// 执行多个图形操作
scene->blockSignals(false);
scene->update();
}
六、扩展功能实现
1. 文件操作
// 保存为SVG格式
void MainWindow::onSaveSvg() {
QSvgGenerator generator;
generator.setFileName("drawing.svg");
generator.setSize(QSize(800,600));
QPainter painter(&generator);
scene->render(painter);
}
// 导入图像
void MainWindow::onImportImage() {
QString fileName = QFileDialog::getOpenFileName(this, "导入图片", "", "Images (*.png *.jpg)");
if(!fileName.isEmpty()) {
QGraphicsPixmapItem *item = new QGraphicsPixmapItem(QPixmap(fileName));
scene->addItem(item);
}
}
七、调试技巧
1. 坐标系调试
// 在状态栏显示坐标
void MainWindow::mouseMoveEvent(QMouseEvent *event) {
QPointF scenePos = view->mapToScene(event->pos());
statusBar()->showMessage(QString("Scene: (%1, %2)").arg(scenePos.x()).arg(scenePos.y()));
}
2. 性能监控
// 绘制耗时统计
QElapsedTimer timer;
timer.start();
// ... 绘制操作
qDebug() << "绘制耗时:" << timer.elapsed() << "ms";
参考代码 qt 绘图软件,实现简单图形的绘制,缩放等功能 www.youwenfan.com/contentcnj/69827.html
八、完整工程结构
DrawingApp/
├── Src/
│ ├── main.cpp
│ ├── mainwindow.cpp
│ ├── graphicsview.cpp
│ └── customitem.cpp
├── Inc/
│ ├── mainwindow.h
│ ├── graphicsview.h
│ └── customitem.h
├── Res/
│ ├── icons/ # 图标资源
│ └── styles/ # 样式表
└── CMakeLists.txt
九、关键技术点
-
图形变换矩阵
使用
QTransform实现复合变换:QTransform transform; transform.translate(100, 100); // 平移 transform.rotate(45); // 旋转 transform.scale(2, 2); // 缩放 item->setTransform(transform); -
事件过滤器
实现全局快捷键:
qApp->installEventFilter(this); bool MainWindow::eventFilter(QObject *obj, QEvent *event) { if(event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); if(keyEvent->key() == Qt::Key_Z) { // 撤销操作 return true; } } return QMainWindow::eventFilter(obj, event); }
浙公网安备 33010602011771号