重绘 QTreeWidget

Repaint QTreeWidget

我有一个基于 QTreeWidget 的简单 class。在某些情况下(当列之一的值更新时),我需要重新绘制它。我有一个函数,当我需要更新我的小部件时调用:

void TreeWidget::updated()
{
    /* some actions with cells */

    /* here need to repaint widget */
    this->update();
    /* also I'm tried this->repaint(); */
}

但是行 this->update();(或 this->repaint();)没有给出任何结果。小部件仅在我单击时重绘。

那么如何重新绘制我的小部件?

继承自 QAbstractScrollArea as QTreeWidget have viewport() 的 类 是必须更新的小部件,因此在您的情况下,解决方案是:

viewport()->update();

如果你想从另一个线程调用更新,你可以使用 QMetaObject::invokeMethod():

QMetaObject::invokeMethod(viewport(), "update", Qt::QueuedConnection)

这是解决方案:

viewport()->update();

我学到了一件有趣的事。事实证明,您只能从主线程更新 Qt 中的小部件。我的函数 updated() 被另一个线程调用,所以 this->update() 没有起作用。然而,Qt 中的所有插槽都只在主线程中执行,无论它们是从哪里调用的。在这种情况下,正确的解决方案是将 this->update() 包装在插槽内。像这样:

TreeWidget::TreeWidget() 
{
   /* ... */
   connect(this, SIGNAL(signal_update()), this, SLOT(slot_update()));
   /* ... */
}

void TreeWidget::updated()
{
    /* some actions with cells */

    emit signal_update();
}

void TreeWidget::slot_update()
{
    this->update();
}

是的,这是一个不如 this->viewport()->update() 漂亮但更正确的解决方案。