最近学习Qt 自定义绘画时碰到两个问题,问题如下:
自定义绘画图形,采用重写QPaintEvent,发现绘画不起作用;
1、Qpainter不刷新,解决方法:在触发刷新是,调用updata()函数强行更新。

问题

其中Qpainter 的父类应该是具体绘画的widget;
对于QGraphiscView:我所碰到的问题如下:

输出:
QPainter::fillPath: Painter not active
QPainter::setPen: Painter not active
QPainter::restore: Unbalanced save/restore
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setRenderHint: Painter must be active to set rendering hints
QPainter::save: Painter not active
QPainter::translate: Painter not active
QPainter::setPen: Painter not active


void ViewPager::paintEvent(QPaintEvent *e)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.save();m_indicatorYpos = m_scene->height() - m_indicatorPadding\-m_ViewButtonMagin - m_ViewItemH - 10;painter.translate(width() / 2,m_indicatorYpos);QPen pen;pen.setColor(m_colorBorder);pen.setWidth(3);painter.setPen(pen);int startToCenter = (m_indicatorCircleMargin / 2 + m_indicatorCircleR) * (m_pagesCount - 1);for (int i = 0; i < m_pagesCount; i++){int center = -startToCenter + i * (m_indicatorCircleMargin + 2 * m_indicatorCircleR);painter.drawEllipse(QPoint(center, 0), m_indicatorCircleR, m_indicatorCircleR);}float currentPoint =  startToCenter * (m_count - 1)*1.0f;qDebug() << "repaint" << m_count;QPainterPath path;path.addEllipse(QPointF(currentPoint, 0), m_indicatorCircleR, m_indicatorCircleR);painter.fillPath(path, m_colorFill);/*绘制指示圆孔两边的线段*/pen.setWidth(4);pen.setColor(m_colorBorder);pen.setStyle(Qt::SolidLine);pen.setCapStyle(Qt::RoundCap);pen.setJoinStyle(Qt::BevelJoin);painter.setPen(pen);QLine leftLine(-200, 0, -50, 0);QLine rightLine(50,0, 200, 0);painter.drawLine(leftLine);painter.drawLine(rightLine);painter.restore();//    QWGraphicsView::paintEvent(e);
}

经过思考:
发现问题出现在:
QPainter painter(this);,经过查询帮助手册:
如下
大概意思是,QGraphicsView 绘画图形是在Viewport上绘画, 通过使用viewport() 可获取绘画窗口,因此,QPainter painter(this),不应该在QGraphicsView上申请画家,而是在viewport上申请画家。

解决

只需要修改 **QPainter painter(this->viewport());**即可解决问题,

问题:


单击按键图形无变化。按键槽函数如下:

void ViewPager::onRightClicked()
{m_direct = Right;m_count++;if(m_count > 2){m_count = 0;}this->update();
}void ViewPager::onLeftClicked()
{m_direct = Left;m_count--;if(m_count < 0){m_count = 2;}this->update();
}

经过测试:每次点击按键,paintEvent都执行了,为什么没有刷新显示到窗口上。

解决

后面经过思考,修改代码如下:
this->update()修改为this->viewport()->update();问题解决。效果如下:

单击右键:

总结:

对于使用自定义绘画时, 申请的画家parent应该为实际的绘画窗口,并不一定全是this,需要强制更新绘画,采用实际绘画窗口update()函数即可。

Qt中 QPainter 刷新出现的问题相关推荐

  1. Qt中QPainter的使用

    Qt中QPainter的使用 GUI用户界面的优点是通过提供可视化的工具为客户提供便利的操作,界面上的按钮.编辑框等都是通过绘图得到的.Qt的二维绘图基本功能是使用QPainter在绘图设备上绘图,通 ...

  2. QT 中QPainter绘制文字、图片

    1. 把字符串绘制在QPixmap上 QPixmap MainWindow::text2Pixmap(QString text) { QFontMetrics fmt(m_font); QPixmap ...

  3. Qt中QPainter基本绘图

    QWidget 派系的只能在paintEvent中进行重绘:如果你想要很好的交互功能的话推荐QGraphicsView框架,自定义Item的绘制在paint函数:如果你想利用线程绘制的话,你可以创建个 ...

  4. 【转】QT中窗口刷新事件的学习总结

    一.主要理解一下几个方法和属性: 1.QWidget * QScrollView::viewport () const 2.void QWidget::paintEvent ( QPaintEvent ...

  5. qt中实现左右分割线_一种快速刷新richedit中内嵌动画的方法的实现

    在IM中使用动画表情是一种非常有趣的方式,然而选择一种合适的方式来实现却并不容易. 一般来说,除了自己去实现一个富文本控件,目前主要的解决方案有3种: 1.使用浏览器做容器. 2.使用QT提供的Ric ...

  6. Qt中的QDialog

    文章目录 1 Qt中的QDialog 1.1 QDialog简介 1.2 模态对话框和非模态对话框 1.3 对话框的返回值 2 登陆对话框实例分析 2.1 分析 2.2 代码实现 2.3 登录对话框的 ...

  7. QT 中的 Graphics View 系统

    这个框架是一个相对成熟的渲染引擎的上层框架,通常也可以会叫做 Scene - View. 在QT中,GraphicsView是一个与QWdiget系列一点点不一样的系统.这个系统主要由下面几个框架类构 ...

  8. Qt中update()和repaint()的区别

    转载:https://blog.csdn.net/qq_35396127/article/details/77745204 解释1 voidQWidget::repaint ( int x, int ...

  9. Qt中的OpenGL

    Qt还是本人可移植GUI程序开发的首选,不过Qt开发普通的应用程序是行,但是据说效率太低,以至于像某些人说的那种刷新看得到一条条横线?这点我比较纳闷,就我使用的感觉,虽然Qt不以效率著称,但是事实上有 ...

最新文章

  1. 写了六个相同功能的函数之后,我学到了什么
  2. AI一分钟|外媒:AI将消灭资本主义;特斯拉再遭唱空:量产存疑外加事故不断...
  3. Winforn中实现ZedGraph自定义添加右键菜单项(附源码下载)
  4. Python面向对象基础示例_创建对象
  5. [js] AudioContext有什么应用场景?
  6. win2008 php mysql zend phpmyadmin_Windows2008 最新版Apache2.PHP5.MySQL6.PHPMyadmin.ZendOptimizer安装图解...
  7. 制作openstack-centos镜像
  8. Basic4android v3.50 发布
  9. 真是虚惊一场的i_like_cpp
  10. POJ - 2392 朴素多重背包 + 贪心 WA与AC代码细节分析
  11. php openssl 处理pkcs8,openssl生成RSA格式私钥,转换为通用型PKCS8格式
  12. 输出100以内的所有素数
  13. 从技术问题变成RPWT -----------------猛禽
  14. QC DCP PD SCP FCP等充电协议
  15. 改进YOLOv5系列:最新ConvNeXt结合YOLO | CVPR2022 多种搭配,即插即用 | Backbone主干CNN模型
  16. 如何给女朋友解释什么是面向对象编程?
  17. Gartner 魔力四象限
  18. 常州和南京计算机工资水平,南京和苏州哪一个城市工资高?六张图带你看懂江苏各市平均工资情况...
  19. 转载 各大流行linux版本评价
  20. 1.计算机网络的发展,计算机网络的形成与发展

热门文章

  1. 第二十章 分布式任务调度中心DolphinScheduler架构设计
  2. gaussian安装教程linux,linux下Gaussian安装与运行.docx
  3. Zabbix监控整合OneAlert报警平台实现邮件、短信、微信、电话多方式报警
  4. 微信小程序npm导入weui
  5. 数字旋转方阵c语言主函数,数据结构——递归求数字旋转方阵
  6. 无障碍模式设计:别让无障碍,成为一种障碍
  7. 操作系统课程设计--在Linux环境下模拟实现简单命令解释器(C++代码)
  8. 导入rasterio时的玄学错误:在命令行模式下可以导入,在代码文件中导入却会报错
  9. python调用大漠getcursorpos,GetCursorPos()函数
  10. 格式塔理论主要是用计算机,就5个法则,轻松掌握格式塔理论!