【问题标题】:Painting inside QLabel recursively calls paintEvent在 QLabel 中绘制递归调用paintEvent
【发布时间】:2016-07-15 09:12:12
【问题描述】:

我正在使用 QLabel 在 Qt 5 应用程序中绘制图形。我没有将 QLabel 子类化,而是安装了一个事件过滤器。事件过滤器确实被调用并且在 QLabel 内绘制确实有效。问题是事件过滤器被递归调用,我的 cpu 达到 100% 的使用率。

我在这里做错了什么?

这是我的代码:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->label->installEventFilter(this);
}

bool MainWindow::eventFilter(QObject *obj, QEvent *ev)
{
    if ((obj == ui->label) && (ev->type() == QEvent::Paint))
    {
        QPixmap pix(50, 50);
        pix.fill(Qt::blue);
        ui->label->setPixmap(pix);
    }
    return false;
}

感谢您的帮助 妮莎·米勒

【问题讨论】:

  • 这是一个问得很糟糕的问题!您正在询问如何解决一些神秘问题的错误解决方案,而您甚至没有给出您要解决的问题类型。
  • @MarekR 为什么这个问题问得不好? OP 描述了该问题并发布了相关代码。
  • 就像我写的那样,你在问如何解决一些你没有描述的问题。我很确定如果你解释你想要实现什么样的功能,那么解决方案会简单得多。

标签: qt


【解决方案1】:

setPixmap() 调用 update() 将另一个绘制事件排队,导致无限循环。

Paint 事件被频繁发送,并且操作应尽可能便宜。考虑提前设置像素图以响应信号或事件或重新实现QLabel 及其paintEvent()

【讨论】:

  • 啊,这解释了递归,谢谢。我通过重用 qlabel 中的像素图解决了这个问题,所以我不必每次都设置它。
  • @NishaMiller 如果这解决了您的问题,请接受答案,以便更容易帮助其他人。
猜你喜欢
  • 2019-01-16
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
相关资源
最近更新 更多