重画QTreeWidget

时间:2018-12-03 08:14:17

标签: c++ qt qt5 qtreewidget

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

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

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

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

那么我该如何重绘窗口小部件?

3 个答案:

答案 0 :(得分:2)

QAbstractScrollArea继承为QTreeWidget的类具有viewport(),这是必须更新的小部件,因此您的解决方案是:

viewport()->update();

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

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

答案 1 :(得分:0)

这是解决方案:

viewport()->update();

答案 2 :(得分:0)

我学到了一件有趣的事。事实证明,您只能从主线程更新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()不太漂亮,但更正确。