首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重涂QTreeWidget

重涂QTreeWidget
EN

Stack Overflow用户
提问于 2018-12-03 08:14:17
回答 3查看 808关注 0票数 4

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

代码语言:javascript
运行
复制
void TreeWidget::updated()
{
    /* some actions with cells */

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

但line this->update(); (或this->repaint();)没有给出结果。小部件只在我单击它时重新绘制。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-03 08:23:48

继承自QAbstractScrollArea作为QTreeWidget的类具有viewport(),它是必须更新的小部件,因此在您的示例中,解决方案是:

代码语言:javascript
运行
复制
viewport()->update();

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

代码语言:javascript
运行
复制
QMetaObject::invokeMethod(viewport(), "update", Qt::QueuedConnection)
票数 3
EN

Stack Overflow用户

发布于 2018-12-03 08:58:55

这就是解决办法:

代码语言:javascript
运行
复制
viewport()->update();
票数 1
EN

Stack Overflow用户

发布于 2018-12-05 10:11:45

我学到了一件有趣的事。结果是,您只能从主线程更新Qt中的小部件。我的函数updated()是由另一个线程调用的,因此this->update()无法工作。然而,Qt中的所有插槽都是在主线程中执行的,无论从哪里调用它们。在这种情况下,正确的解决方案是将this->update()封装在槽内。如下所示:

代码语言:javascript
运行
复制
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()那么漂亮的解决方案,但更正确。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53589796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档