重绘 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()
漂亮但更正确的解决方案。
我有一个基于 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()
漂亮但更正确的解决方案。