Перекрасить QTreeWidget - PullRequest
       34

Перекрасить QTreeWidget

0 голосов
/ 03 декабря 2018

У меня есть простой класс, основанный на 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 голосов
/ 03 декабря 2018

Это решение:

viewport()->update();
0 голосов
/ 05 декабря 2018

Я узнал одну интересную вещь.Как оказалось, вы можете обновлять виджеты в 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(), но более правильное.

0 голосов
/ 03 декабря 2018

Классы, которые наследуются от QAbstractScrollArea как QTreeWidget, имеют viewport(), который является виджетом, который должен быть обновлен, так что в вашем случаерешение:

viewport()->update();

Если вы хотите вызвать обновление из другого потока, вы можете использовать QMetaObject :: invokeMethod () :

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