我有一个基于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();
)没有任何结果。小部件仅在单击时才重涂。
那么我该如何重绘窗口小部件?
答案 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()
不太漂亮,但更正确。