QWidget.paintevent() 与 QLabel.setPixmap()

Posted

技术标签:

【中文标题】QWidget.paintevent() 与 QLabel.setPixmap()【英文标题】:QWidget.paintevent() vs QLabel.setPixmap() 【发布时间】:2015-06-17 12:32:04 【问题描述】:

我正在尝试抓取一个小部件并将其显示在另一个小部件中。 哪个更便宜?

1- 使用 QWidget.paintevent()

void MonitoringWidget::paintEvent(QPaintEvent *event)

    if (m_mirrorWidget)
        QPixmap mirrorPix = m_mirrorWidget->grab();
        QPainter p(this);
//        p.drawPixmap(this->rect(),mirrorPix,mirrorPix.rect());
        p.drawPixmap(ui->mirrorFrame->geometry(),mirrorPix,mirrorPix.rect());
        update();
    
   return;

2- QLabel.setPixmap()?

QLabel mirrorLabel;
QPixmap mirrorPix = m_mirrorWidget->grab();
mirrorLabel.setPixmap(mirrorPix )

谢谢

【问题讨论】:

你只会调用一次setPixmap(如果你只需要初始化小部件),但paintEvent可以调用多次(取决于很多事情)。所以,最好使用setPixmap 必须不要在paintEvent中调用update。 paintEvent() 中调用 update() 不是问题,尽管可能也不明智。它不会导致递归(因为它只会发布另一个绘制事件)。但是,调用 repaint() 可以。 【参考方案1】:

我会重写MonitoringWidget::paintEvent(),然后使用被监控小部件的QWidget::render()将被监控小部件渲染到MonitoringWidget中。

这应该大致相当于被监控的小部件本身在接收到绘制事件时将执行的操作。

此外,您可能需要在受监控的小部件和监视器之间建立一些链接,以响应受监控的小部件的更新。我可以想象 MonitoringWidget 会在被监控的小部件中安装一个事件过滤器,然后在那里响应绘制事件。

【讨论】:

以上是关于QWidget.paintevent() 与 QLabel.setPixmap()的主要内容,如果未能解决你的问题,请参考以下文章

QWidget paintEvent 无故停止调用

QTest 覆盖漆法

如何在 Qt 中获取应用程序字体颜色

QL Server 实用脚本

ql语句中left join和inner join中的on与where的区别分析

查询与 Hive QL 中另一列中的每个值关联的最短字符串值的更有效方法