QT绘图 裁剪或填充问题求助!

sanchez_78 2020-05-05 11:27:45
QT绘图时填充颜色能不能填充除了一个封闭的多边形之外的区域颜色
或者QT能不能裁剪掉除了我绘制的一块多边形外的区域

我想让上面蓝色线以外的区域被填充其他颜色或者被裁剪掉
整个是qimage的画布
...全文
359 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanchez_78 2020-05-05
  • 打赏
  • 举报
回复
引用 6 楼 Italink 的回复:
https://doc.qt.io/qt-5/qpainter.html#CompositionMode-enum 你可能要用QPainter::CompositionMode_DestinationIn 如果你只是想画一个这样形状的图形,没必要这么麻烦
请教一下,背景的色彩图是一个qimage,我是不是可以仅让圈内的部分输出到一个qlabel上面
Italink 2020-05-05
  • 打赏
  • 举报
回复
https://doc.qt.io/qt-5/qpainter.html#CompositionMode-enum 你可能要用QPainter::CompositionMode_DestinationIn 如果你只是想画一个这样形状的图形,没必要这么麻烦
sanchez_78 2020-05-05
  • 打赏
  • 举报
回复
如图我想的是保留圈内的像素颜色
sanchez_78 2020-05-05
  • 打赏
  • 举报
回复
引用 2 楼 Italink 的回复:

void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.fillRect(rect(),Qt::green);     //首先填充成绿色
    painter.setCompositionMode(QPainter::CompositionMode_Clear);    //设置为清除模式,之后的绘图会将绘图区域设置为transparent
    
    painter.setBrush(Qt::transparent);                              //启动填充,利用填充来清理
    painter.drawRect(rect().adjusted(50,50,-50,-50));               //清除内部矩形    
}

这个是在窗口的paint函数中操作,你只需要把绘图设备改为image,启动清理模式(注意用完关闭)。然后可以用fillPath或者drawpath来清理你的区域,
这样确实能做到填充四周的效果 但是我没说清楚 我我需要保留的区域内的东西也被清除了 有什么办法吗
Italink 2020-05-05
  • 打赏
  • 举报
回复

void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.fillRect(rect(),Qt::green);     //首先填充成绿色
    painter.setCompositionMode(QPainter::CompositionMode_Clear);    //设置为清除模式,之后的绘图会将绘图区域设置为transparent
    
    painter.setBrush(Qt::transparent);                              //启动填充,利用填充来清理
    painter.drawRect(rect().adjusted(50,50,-50,-50));               //清除内部矩形    
}

这个是在窗口的paint函数中操作,你只需要把绘图设备改为image,启动清理模式(注意用完关闭)。然后可以用fillPath或者drawpath来清理你的区域,
Italink 2020-05-05
  • 打赏
  • 举报
回复
当然可以,稍等,我码个代码
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于C++、Qt实现底层绘图算法的绘图系统源码+项目说明.zip # PaintWorks ## 已实现的功能 * 直线绘制 * 圆的绘制+填充 * 椭圆绘制 * 多边形绘制+填充 * 已实现基础的UI交互,切换图形绘制模式 * 已实现markDraw,为各Figure提供被选中的虚线矩形框显示 * 已实现**图形编辑** * 已实现**图形变换** - 平移:已实现各图形的平移(通过点的平移实现) - 旋转:已实现各图形的旋转(其中圆的旋转保持不变,椭圆旋转只能转90度) - 缩放:已实现各图形的缩放(直线以中点为准,圆和椭圆以中心为准,多边形以绘制的第一个点为准) * 已实现**图形裁剪** * 只实现了直线与多边形的裁剪 * 直线裁剪为梁友栋-Barsky裁剪算法,多边形裁剪为单边裁剪算法 * 对所有直线与多边形进行裁剪 * 已实现**存储图形数据** * 保存为bmp格式 * 已实现**3D六面体显示** * 使用OpenGL库函数 * 可以使用键盘控制左右旋转 * 已实现UI基础交互 * 放大缩小 对所有图形同时放大缩小,缩放基准点为各图形自己的基准点,而非鼠标 * 填充 * 裁剪 * 平移 * 直线拖动中点平移 * 圆拖动圆心平移 * 椭圆拖动中心平移 * 多边形拖动中心平移 * 聚焦(点击图形让被选中图形在最高图层显示) * 直线 * 圆 * 椭圆 * 多边形 * 旋转:拖动handle旋转 * 点:添加了三个相关支持函数 * 直线:使用点的支持函数实现 * 圆:只改变handle,其余均不动 * 椭圆:handle旋转至水平或垂直时,旋转90度 * 多边形:按键时不改变handle ## 下一步工作 ## 目前进展 * 已实现缩放改为对单个图形进行缩放,裁剪改为对单个图形进行裁剪 * 已实现交互界面新增功能 * 平移:拖动矩形中心点 * 旋转:拖动延伸出来的点 * 已实现添加删除图形、清空图形按钮 * 已添加图形选中 * 直线:检测轮廓点 * 圆、椭圆、多边形:检测轮廓点+填充点 * 画布的curCtrl变化之后,通过信号-槽机制从widget向Mainwindow发送消息,改变当前绘图模式 * 已添加颜色控制按钮 * 选择颜色之后,线条与填充均为这种颜色 * **曲线绘制&编辑&变换** * 已实现曲线绘制+拖动控制点编辑 * 曲线变换 * 平移 * 缩放 * 旋转 * 已实现选取 * isOn*函数检测该点是否在图形上 * isOn()检测该点是否在图形或标记点(markPoints,center,handle)上,isOnPlain()检测该点是否在图形本身上(不包括标记点) ## 可以改进的地方 ## tips * 解决了MainWindow直接控制当前GLWidget的问题 使用`dynamic_cast()`即可,可以不必再使用GLWidget的数组canvases(已去掉) ## bug * ~~标签页关闭之后切换图形绘制模式会导致程序崩溃~~ 已使用dynamic_cast解决 应该让QMdiSubWindow在关闭时delete掉GLWidget,可能需要重写QMdiSubWindow的` virtual void closeEvent(QCloseEvent * closeEvent)` 函数,最好是将相关信号关联到Mainwindow的一个槽函数,省得再写QMdiSubWindow了。 * ~~椭圆刚生成的时候handle有问题~~ 已解决

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧