Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Январь 29, 2009, 23:57



Название: Глючит скроллинг в QTableWidget. Qt 4.4.1
Отправлено: xintrea от Январь 29, 2009, 23:57
Здравствуйте!


Попробовал на днях использовать виджет QTableWidget, сделал логику, наворотил что надо, сегодня доделал до рабочего состояния... Начал играться, и обнаружил, что всё нормально работает, кроме скроллинга. Какие-то глюки при скроллинге вверх-вниз. Что слайдером, что графическими кнопками, что клавиатурой.

В ячейках то появляются, то исчезают строки. Иногда рисуются только верхние или нижние части букв. Если окно свернуть-развернуть, то строки в ячейках все становятся нормально видны. Qt 4.4.1.

Есть ли какой-то метод побороть глюк, не меняя версию Qt? Попробовал делать hide()/show() для виджета QTableWidget, не помогает, строки как были криво отрисованы, так и остаются. Что можно еще сделать?


Название: Re: Глючит скроллинг в QTableWidget. Qt 4.4.1
Отправлено: Dendy от Январь 30, 2009, 00:33
А с отрисовкой вы сами ничего не делали? Механизм рисования содержисого не переопределяли?


Название: Re: Глючит скроллинг в QTableWidget. Qt 4.4.1
Отправлено: xintrea от Январь 30, 2009, 01:33
А с отрисовкой вы сами ничего не делали? Механизм рисования содержисого не переопределяли?

Нет. Заполняю строки, вывожу на экран.

Кстати, глюк появляется только если скрыть заголовки столбцов. Если заголовки видны, глюков нет. А у меня каждый сантиметр на счету, содержимое столбцов понятно из контекста, посему заголовки ненужны.

findtableview->horizontalHeader()->hide();

В результате получаю то, что имею.


Название: Re: Глючит скроллинг в QTableWidget. Qt 4.4.1
Отправлено: Dendy от Январь 30, 2009, 01:51
Поподробнее. Что кроется под словами "вывожу на экран"?


Название: Re: Глючит скроллинг в QTableWidget. Qt 4.4.1
Отправлено: xintrea от Январь 30, 2009, 02:21
Поподробнее. Что кроется под словами "вывожу на экран"?

Вначале вызов clear_all()

Код:
void findtablewidget::clear_all(void)
{
 // Таблица очищается
 findtableview->setRowCount(0);
 findtableview->setColumnCount(0);
 
  // Устанавливается в таблице две колонки
 findtableview->setColumnCount(2);
}

Потом несколько add_row() и все.

Код:
void findtablewidget::add_row(QString title, QString tags)
{
 int i=findtableview->rowCount();

 findtableview->insertRow(i);

 QTableWidgetItem *item_title=new QTableWidgetItem(title);
 QTableWidgetItem *item_info=new QTableWidgetItem(tags);
 
 findtableview->setItem(i,0,item_title);
 findtableview->setItem(i,1,item_info);
}


findtableview - это QTableWidget.


Название: Re: Глючит скроллинг в QTableWidget. Qt 4.4.1
Отправлено: Dendy от Январь 30, 2009, 02:54
Скорее всего баг в Qt. Если не последняя версия - обновитесь. Попробуйте снапшот. Если баг останется - проверьте совпадает ли прямоугольник на отрисовку с реальным что видно на экране:

Код
C++ (Qt)
findtableview->viewport()->installEventFilter( this );
...
bool This::eventFilter( QObject * o, QEvent * e )
{
 if ( o == findtableview->viewport() && e->type() == QEvent::Paint )
 {
   QPaintEvent * pe = static_cast<QPaintEvent*>( e );
   qDebug() << "Rect to paint:" << pe->rect();
   qDebug() << "Visible rect:" << findtableview->viewport()->visibleRegion()->boundingRect();
   return false;
 }
 return false;
}
 


Название: Re: Глючит скроллинг в QTableWidget. Qt 4.4.1
Отправлено: xintrea от Январь 30, 2009, 14:12
Скорее всего баг в Qt. Если не последняя версия - обновитесь. Попробуйте снапшот. Если баг останется - проверьте совпадает ли прямоугольник на отрисовку с реальным что видно на экране

Еще не обновился, на текущей версии имею такое (двигаю слайдером)

Цитировать
Rect to paint: QRect(0,0 812x111)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,0 812x111)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,82 812x29)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,0 812x111)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,0 812x111)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,0 812x18)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,0 812x40)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,0 812x40)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,0 812x40)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,91 812x20)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,91 812x20)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,0 812x40)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,0 812x40)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,0 812x40)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,91 812x20)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,91 812x20)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,91 812x20)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,91 812x20)
Visible rect: QRect(0,0 812x111)

Rect to paint: QRect(0,102 812x9)
Visible rect: QRect(0,0 812x111)

Код
C++ (Qt)
qDebug() << "Visible rect:" << findtableview->viewport()->visibleRegion()->boundingRect();
 

Тогда уж так

Код
C++ (Qt)
qDebug() << "Visible rect:" << (findtableview->viewport()->visibleRegion()).boundingRect();
 

иначе не компилится.


Название: Re: Глючит скроллинг в QTableWidget. Qt 4.4.1
Отправлено: xintrea от Январь 30, 2009, 16:13
А вот какой лог если заголовки видны и отрисовка правильная.
Честнагря не понимаю, показывают ли ети числа отсутсвие проблемы в таком режиме?

Цитировать
Rect to paint: QRect(0,0 812x86)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,0 812x86)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,66 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,66 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,66 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,66 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,66 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,72 812x14)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,0 812x14)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,0 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,0 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,0 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,0 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,0 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,66 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,66 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,66 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,66 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,0 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,0 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,0 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,0 812x20)
Visible rect: QRect(0,0 812x86)

Rect to paint: QRect(0,0 812x86)
Visible rect: QRect(0,0 812x86)


Название: Re: Глючит скроллинг в QTableWidget. Qt 4.4.1
Отправлено: Dendy от Январь 30, 2009, 16:26
Видно, что события приходят правильно. Значит нужно смотреть кто неправильно их обрабатывает. А делает это QTableWidget или QTableView в своих методах рисования содержимого.