Russian Qt Forum
Ноябрь 23, 2024, 08:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Баг отрисовки в QTreeWidget  (Прочитано 6761 раз)
andrew.k
Гость
« : Октябрь 02, 2014, 15:56 »

Прилагаю во вложении очень простой тестовый проект, который воспроизводит баг.
Прошу у кого есть возможность, проверить на вашей системе и сообщить, подтверждается ли баг, какая система и версия Qt.

Воспроизводится баг так.
1. Запускаем
2. Ставим чек-бокс (заполняется виджет)
3. Выделяем любой элемент (щелкаем)
4. снимаем чек-бокс.

Получаем баг: тривиджет не перерисовался, по щелчку либо, ресайзу, либо перетащить окно можно, в общем любая перерисовка приводит к коректной отрисовке - виджет обновляется.

Если пропустить п.3 (т.е. не выделять элемент) баг не наблюдается. Если выделять баг повторяется многократно.

Вот основной код тестового проекта, смотреть в общем нечего.
Установлен ресайз по содержимому. Он видимо и является источником проблемы.
Потому как без него все работает как надо.
Код
C++ (Qt)
#include "widget.h"
#include "ui_widget.h"
 
#include <QtGui/QHeaderView>
 
Widget::Widget(QWidget *parent) :
   QDialog(parent),
   ui(new Ui::Widget)
{
   ui->setupUi(this);
 
   ui->treeWidget->header()->setResizeMode(QHeaderView::ResizeToContents);
 
   connect(ui->checkBox, SIGNAL(toggled(bool)), SLOT(fill()));
}
 
Widget::~Widget()
{
   delete ui;
}
 
void Widget::fill()
{
   ui->treeWidget->clear();
 
   new QTreeWidgetItem(ui->treeWidget, QStringList() << "1a" << "2a" << "3a");
   new QTreeWidgetItem(ui->treeWidget, QStringList() << "1b" << "2b" << "3b");
   new QTreeWidgetItem(ui->treeWidget, QStringList() << "1c" << "2c" << "3c");
 
   if(ui->checkBox->isChecked())
   {
       new QTreeWidgetItem(ui->treeWidget, QStringList() << "1e" << "2e" << "3e");
       new QTreeWidgetItem(ui->treeWidget, QStringList() << "1f" << "2f" << "3f");
       new QTreeWidgetItem(ui->treeWidget, QStringList() << "1g" << "2g" << "3g");
   }
 
//    ui->treeWidget->resizeColumnToContents(0);
}
 
Записан
Dimas
Чайник
*
Offline Offline

Сообщений: 50



Просмотр профиля
« Ответ #1 : Октябрь 02, 2014, 17:13 »

Надо так:
Код
C++ (Qt)
connect(ui->checkBox, SIGNAL(clicked(bool)), SLOT(fill()));
тогда работает
Записан

qt 4.8.6, qt 5.12.4
andrew.k
Гость
« Ответ #2 : Октябрь 02, 2014, 17:20 »

Надо так:
Код
C++ (Qt)
connect(ui->checkBox, SIGNAL(clicked(bool)), SLOT(fill()));
тогда работает

Не правда. Одинаково не работает.
Записан
Dimas
Чайник
*
Offline Offline

Сообщений: 50



Просмотр профиля
« Ответ #3 : Октябрь 02, 2014, 17:31 »

на Windows XP SP3, QT 4.8.1 работает с clicked и не работает с toggled

гы, правда, правда, вот так:
http://youtu.be/k81bEojSD-c
« Последнее редактирование: Октябрь 02, 2014, 17:44 от Dimas » Записан

qt 4.8.6, qt 5.12.4
OKTA
Гость
« Ответ #4 : Октябрь 02, 2014, 17:43 »

На Win 7, Qt 4.7.4 аналогично!
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Октябрь 02, 2014, 17:44 »

замени ui->treeWidget->clear(); на
Код
C++ (Qt)
   QList<QTreeWidgetItem *> list;
   for (int i = 0; i < ui->treeWidget->topLevelItemCount(); ++i)
       list << ui->treeWidget->topLevelItem(i);
   qDeleteAll(list);
и будет работать. тестил в 5.3.1 и 4.8.5 в 8.1

пришлось еще и ошибки в проекте фиксить чтобы скомпилить его Грустный
« Последнее редактирование: Октябрь 02, 2014, 17:46 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
OKTA
Гость
« Ответ #6 : Октябрь 02, 2014, 17:53 »

Только интересно в чем прикол clicked vs toggled  Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Октябрь 02, 2014, 17:58 »

похоже как-то с циклом событий связано. добавление qApp->processEvents(); после ui->treeWidget->clear(); фиксит поведение и с toggled.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
andrew.k
Гость
« Ответ #8 : Октябрь 02, 2014, 18:54 »

на Windows XP SP3, QT 4.8.1 работает с clicked и не работает с toggled

гы, правда, правда, вот так:
http://youtu.be/k81bEojSD-c
Теперь верю, спс за видос)
У меня не работает с обоими сигналами.
Записан
andrew.k
Гость
« Ответ #9 : Октябрь 02, 2014, 18:56 »

похоже как-то с циклом событий связано. добавление qApp->processEvents(); после ui->treeWidget->clear(); фиксит поведение и с toggled.
При этом если qApp->processEvents() добавить в конце слота (уже после создания новых элементов), то не помогает.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #10 : Октябрь 02, 2014, 18:59 »

ну это логично по-моему Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
andrew.k
Гость
« Ответ #11 : Октябрь 03, 2014, 13:37 »

ну это логично по-моему Улыбающийся
Логично было бы, если работало в любом месте.
А так получается баг не в очереди событий. Либо он какой-то комплексный.

Например, если новые элементы отличаются по размеру, то все отлично работает.
Если по размеру не отличаются, то не происходит ресайза колонок и отсюда нет обновления.

Как следствие, понятно, что ручной ресайз тоже решает проблему.
« Последнее редактирование: Октябрь 03, 2014, 13:39 от andrew.k » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.141 секунд. Запросов: 23.