重新绘制 QTreeWidget

4

我有一个基于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();)这个语句没有任何效果。只有当我点击这个小部件时,它才会重新绘制。

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


尝试使用 viewport()->update(); - eyllanesc
@eyllanesc,太好了!谢谢你! - garbart
3个回答

5

1
这是解决方案:
viewport()->update();

1
我很好奇:你的解决方案和我的有多大不同? :-) - eyllanesc

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()美观,但更加正确。


1
如果您想从另一个线程执行它,则不需要创建信号,只需使用我在更新的解决方案中提到的QMetaObject :: invokeMethod()即可 :-) - eyllanesc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接