как перекрасить QListWidget после изменения заголовка элемента QListZWidget - PullRequest
1 голос
/ 22 августа 2011

Я изменяю заголовок QListWidgetItem (текст QListWidgetItem), нажимая кнопку на пользовательском интерфейсе, и при этом я также вызываю repaint () и update (), но заголовок не меняется (обновляется) до тех пор, пока мы не нажмем кнопку QlistWidget Area.Пожалуйста, помогите мне.Заранее спасибо

Ответы [ 4 ]

3 голосов
/ 29 июля 2015

в источнике я нашел это:

void QAbstractItemView::update(const QModelIndex &index)
{
    Q_D(QAbstractItemView);
    if (index.isValid()) {
        const QRect rect = visualRect(index);
        //this test is important for peformance reason
        //For example in dataChanged we simply update all the cells without checking
        //it can be a major bottleneck to update rects that aren't even part of the viewport
        if (d->viewport->rect().intersects(rect))
            d->viewport->update(rect);
    }
}

Итак, без действительного индекса ничего не произойдет.

Однако то, что, кажется, работает (по крайней мере для меня):

viewport()->update();

, что также имеет смысл, поскольку это вызывается QT (с прямоугольником, чтобы быть более производительным, но это необязательно).

1 голос
/ 12 сентября 2018

Похоже, это связано с давней ошибкой в ​​Qt (не могу найти номер), где сигнал dataChanged НЕ запускает перерисовку, если ЕДИНСТВЕННАЯ вещь, которая изменилась на значке.Он не проверяет Qt::DecorationRole, чтобы увидеть, изменилось ли оно.

Если вы вносите изменение из «представления», вы можете принудительно обновить ...
, но если имеется несколько представлений,это не изменит другие, только текущее.

Мое предложение, которое работает, и намного дешевле, чем сброс модели, и обновит все представления.

ОбернитеdataChanged сигнал вызова, с layoutAboutToBeChanged() и layoutChanged(), например:

layoutAboutToBeChanged();
"call functionality that change the icon to be shown"
emit dataChanged( index, index ); // does nothing
layoutChanged(); // forces a repaint of visible data on all open views
0 голосов
/ 11 ноября 2014

Может показаться оскорбительным, но сфокусировать виджет списка, это заставит перекрасить. Работает без вызова repaint () или update ().

QWidget::setFocus()
0 голосов
/ 24 августа 2011

Используйте статическую функцию QCoreApplication::processEvents() для принудительного перерисовки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...