Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Racheengel от Март 30, 2010, 11:21



Название: QTreeWidgetItem::setText() тормозит
Отправлено: Racheengel от Март 30, 2010, 11:21
всем привет,

у меня вопрос: замечал ли кто в Qt 4.5/4.6 торможение при выполнении QTreeWidgetItem::setText(0, "text")?

при заполнении QTreeWidget итемами, после где-то 20-30 штук итемов, начинаются жуткие тормоза. Причем только когда устанавливается текст 0-й колонке (для 1,2 и последующих все работает нормально).
очень странный баг, проявляется и в винде, и в линуксе...


Название: Re: QTreeWidgetItem::setText() тормозит
Отправлено: Пантер от Март 30, 2010, 11:35
Используй MVC. Или отключи отрисовку на время заполнения.


Название: Re: QTreeWidgetItem::setText() тормозит
Отправлено: GreatSnake от Март 30, 2010, 11:36
Сортировку перед изменением элементов отключаете?
Ещё может влиять режим QHeaderView::ResizeToContents.


Название: Re: QTreeWidgetItem::setText() тормозит
Отправлено: Racheengel от Март 30, 2010, 11:45
сортировка, отрисовка, сигналы - все отключено.
ресайз хедера тоже выключал.
setUniformRowHeights(true) сделал.
не помогает ничего...


Название: Re: QTreeWidgetItem::setText() тормозит
Отправлено: Пантер от Март 30, 2010, 11:48
Закинь сюда компилябельный пример.


Название: Re: QTreeWidgetItem::setText() тормозит
Отправлено: Racheengel от Март 30, 2010, 12:24
методом супертыка, помогло следующее:

// до заполнения TreeWidget:
    ui.treeView->header()->setResizeMode(0, QHeaderView::Fixed);
    ui.treeView->header()->setResizeMode(1, QHeaderView::Fixed);
    ui.treeView->header()->setResizeMode(2, QHeaderView::Fixed);

// тут заполняем...
    for (int i = 0; i < 1000; i++)
    {
        QTreeWidgetItem *item = new QTreeWidgetItem(ui.treeView);
        item->setText(0, QString("%1").arg(i+1));
        item->setText(1, "some text");
        item->setText(2, "some text");
        item->setData(0,1000,0);
        item->setData(0,1001,0);
        item->setData(0,1002,0);
        item->setData(0,1003,0);
        item->setBackground(0, Qt::gray);
        item->setBackground(2, Qt::gray);
        ui.treeView->addTopLevelItem(item);
    }

// после заполнения TreeWidget:

    ui.treeView->header()->setResizeMode(0, QHeaderView::ResizeToContents);
    ui.treeView->header()->setResizeMode(1, QHeaderView::ResizeToContents);
    ui.treeView->header()->setResizeMode(2, QHeaderView::ResizeToContents);


Название: Re: QTreeWidgetItem::setText() тормозит
Отправлено: GreatSnake от Март 30, 2010, 12:38
Я бы ещё отказался от использования QTreeWidgetItem::setData() для своих нужд, т.к. он очень тажелый, если не требуется через сигнал QTreeWidget::itemChanged() следить за изменением свойств ячейки.
Намного оптимальнее будет перегрузить QTreeWidgetItem.


Название: Re: QTreeWidgetItem::setText() тормозит
Отправлено: Racheengel от Март 30, 2010, 12:46
да, я тоже думаю заменить 4 setData() одним... просто нужно в хэндлер клика по итему передавать эти данные...