Qt绘图与图形视图之常见图形、路径、文字、图片的绘制介绍

往期回顾

【QT进阶】Qt线程与并发之QtConcurrent的简单介绍-CSDN博客

【QT进阶】Qt线程与并发之QtConcurrent返回值与run方法的参数说明-CSDN博客

Qt绘图与图形视图之绘图技术知识点的简单介绍-CSDN博客

 Qt绘图与图形视图之常见图形、路径、文字、图片的绘制介绍

一、最终效果

实现常见18种图形、路径、文字、图片的绘制,点击左侧对应图形,右侧会自动绘制

二、主要设计实现

 1、主要思路

看ui界面,主要分为两个类,一个QListWidget设置左边列表模式,虽然但是,这里没有用这个,而是改用了对象树;另一个就是很基础的一个widget窗口类,用来做画板,放绘制的图案

2、各个类具体实现

2.1、darwType.h

先设置好有哪些绘图类型,方便一会区分调用

#pragma once

enum class DRAW_TYPE
{
    point,
    multipoints,
    line,
    arc,
    rect,
    roundrect,
    chord,
    ellipse,
    polygon,
    polyline,
    ConvexPloygon,
    lines,
    path,
    pie,
    image,
    pixmap,
    draw_text,
    draw_erase,
    draw_fillpath,
    draw_fillrect
};
2.2、Widget 
2.2.1、初始化对象树

初始化对象树,设置为不可编辑,并创建水平布局搭建出整体框架

Widget::Widget(QWidget* parent)
    : QWidget(parent)
{
    setWindowTitle(u8"draw all");

    QHBoxLayout* pHLay = new QHBoxLayout(this);
    m_pLeftTree = new QTreeView(this); //对象树
    m_pLeftTree->setEditTriggers(QAbstractItemView::NoEditTriggers);  //设置不可编辑
    m_pLeftTree->setFixedWidth(300); 

    m_pPaintWidget = new CPaintWidget(this);
    pHLay->addWidget(m_pLeftTree); 
    pHLay->addWidget(m_pPaintWidget);

    treeView();
}
2.2.2、设置对象树的ui界面

设置对象树的ui界面,搭建出上图左边的样式,这里用了一个QStandardItemModel和QStandardItem,注意看其设置方式:

void Widget::treeView()
{
    m_pLeftTree->setFrameShape(QFrame::NoFrame);

    QStandardItemModel* model = new QStandardItemModel(m_pLeftTree);
    //设置水平表头标签为"draw all"。
    model->setHorizontalHeaderLabels(QStringList() << "draw all");

    QStandardItem* pParentItem = NULL;
    QStandardItem* pChildItem = NULL;

    // 点
    pParentItem = new QStandardItem(QIcon(":/resources/point.png"), "draw ponit");
    model->appendRow(pParentItem);

    pChildItem = new QStandardItem(QIcon(":/resources/point.png"), "point");
    pParentItem->appendRow(pChildItem);

    pChildItem = new QStandardItem(QIcon(":/resources/multipoints.png"), "multipoints");
    pParentItem->appendRow(pChildItem);

    m_pLeftTree->setModel(model);

    connect(m_pLeftTree, &QAbstractItemView::clicked, this, &Widget::treeViewExpand);
}
2.2.3、实现点击item绘制对应图形

获取每个item的data值,并转为QString类型,通过data值判断属于哪个类型,从而决定当用户点击后右边窗口绘画哪个图案并及时更新  

void Widget::treeViewExpand(const QModelIndex& index)
{
    //点击的item的下标的数据值转为QString类型,然后拿去判断
    //根据数据值设置对应的窗口显示类型,并更新
    QString text = index.data().toString();

    if (text.compare("point") == 0)
    {
        m_pPaintWidget->setDrawType(DRAW_TYPE::point);
        m_pPaintWidget->update();  //不更新就不会立即显示
    }
    else if (text.compare("multipoints") == 0)
    {
        m_pPaintWidget->setDrawType(DRAW_TYPE::multipoints);
        m_pPaintWidget->update();  
    }
}
2.3、CPaintWidget 
2.3.1、初始化界面

初始化界面并设置初始显示图

CPaintWidget::CPaintWidget(QWidget* p)
 :QWidget(p)
{
 this->setMinimumSize(800, 600);

 //默认设置为polygon,所以运行程序时最开始显示的就是polygon
 m_drawType = DRAW_TYPE::polygon;
}
2.3.2、重写paintEvent方法

重写paintEvent方法,根据传入的type值来决定调用哪个绘图函数 

void CPaintWidget::paintEvent(QPaintEvent* event)
{
 //宽高设置为绘制图案窗口的宽高
 W = this->width();
 H = this->height();

 //根据传入的类型判断该调用哪个图案绘画函数
 switch (m_drawType)
 {
 case DRAW_TYPE::point:
  draw_point();
  break;

 case DRAW_TYPE::multipoints:
  draw_multipoints();
  break;

 default:
  break;
 }
}
2.3.3、实现绘图函数 

针对每一个图案,实现其绘图函数

//画点
void CPaintWidget::draw_point()
{
 QPainter painter(this);
 QPen pen;
 pen.setWidth(10);
 pen.setColor(Qt::red);
 pen.setStyle(Qt::SolidLine);
 painter.setPen(pen);
 painter.drawPoint(QPoint(W / 2, H / 2)); //点的位置坐标,在正中央
}

//画多个点
void CPaintWidget::draw_multipoints()
{
 QPainter painter(this);
 QPen pen;
 pen.setWidth(10);
 pen.setColor(Qt::blue);
 pen.setStyle(Qt::SolidLine);
 painter.setPen(pen);

 // 画很多点,用数组
 QPoint points[] = {
 QPoint(5 * W / 12,H / 4),
 QPoint(3 * W / 4, 5 * H / 12),
 QPoint(2 * W / 4, 5 * H / 12) };
 painter.drawPoints(points, 3); //数组名+点个数
}

3、主要知识点:QPen和QBrush

这里只是简单介绍,具体的大家可以多看看Qt助手,非常详细。

3.1、QPen 

QPen用于定义绘制线条时的样式,包括线条颜色、线条宽度、线条风格等。

可以通过QPen的构造函数或者设置函数来设置画笔的属性。

例如,可以通过setStyle()设置线条的风格,通过setWidth()设置线条的宽度,通过setColor()设置线条的颜色等。

3.2、QBrush 

QBrush用于定义填充区域的样式,包括填充颜色、填充纹理等。

可以通过QBrush的构造函数或者设置函数来设置填充样式

例如,可以通过setColor()设置填充的颜色,通过setStyle()设置填充的样式,如实色填充、纹理填充等。

3.3、常用思路 

在绘图过程中,通常会使用QPen来设置绘制线条的样式,而使用QBrush来设置填充区域的样式。通过合理地组合QPen和QBrush的属性,可以实现各种绘图效果,如绘制带有不同线条风格和填充样式的图形元素。 


以上就是Qt里常见图形、路径、文字、图片绘制的简单介绍

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT是一个跨平台的图形用户界面开发框架,可以用于实现各种应用程序,包括图形图像编辑器。 首先,我们可以使用QT图形视图框架来构建图形图像编辑器的界面。可以使用QT自带的控件来实现工具栏、菜单栏、绘图区域等界面元素。通过QT的信号槽机制,可以实现用户对界面的操作响应,例如点击菜单项或者按钮时触发相应的功能。 其次,为了实现图形图像编辑的功能,需要基于QT提供的绘图API进行开发。通过使用QT绘图函数,可以实现在绘图区域上绘制各种图形,如直线、矩形、圆形等。可以通过监听鼠标事件、键盘事件等来捕捉用户的操作,例如拖动鼠标绘制直线或者移动图形。 此外,图形图像编辑器还可以提供一些额外的功能,如选择、变换、编辑等。可以通过使用QT图形视图框架来实现图形的选择、移动、缩放等操作。可以使用QT的图像处理函数,如旋转、裁剪、滤镜等来实现图像的编辑功能。 最后,为了提升用户体验,可以结合QT的其他功能,如撤销/重做功能、多文档支持、拖放操作等。这些功能可以通过使用QT的相关类库或者自定义类来进行开发。 总而言之,QT提供了丰富的工具和功能,可以方便地实现图形图像编辑器。通过使用QT图形视图框架、绘图API和其他相关功能,可以创建一个功能完善的图形图像编辑器,满足用户的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值