Russian Qt Forum

Qt => Model-View (MV) => Тема начата: slava_d200 от Апрель 08, 2012, 02:49



Название: [РЕШЕНО] как правильно обновить представление QTablView
Отправлено: slava_d200 от Апрель 08, 2012, 02:49
Прошу подсказки.
программно устанавливаю активную строку в QTablView

если эта строка в зоне отображения то все хорошо, а если эта строка в не зоне отображения
то QTablView не показывает ее. Что надо сделать чтобы автоматом проходила прокрутка до выбранной строки.

и второй вопрос.
QTablView настроен на выделение всей строки.

но если я устанавливаю программно активную ячейку, выделяется тока эта ячейка а не вся строка.
как сделать чтобы выделялась вся строка ?


Название: Re: как правильно обновить представление QTablView
Отправлено: V1KT0P от Апрель 08, 2012, 03:06
но если я устанавливаю программно активную ячейку, выделяется тока эта ячейка а не вся строка.
как сделать чтобы выделялась вся строка ?
Код
C++ (Qt)
void QTableView::selectRow( int row )


Название: Re: как правильно обновить представление QTablView
Отправлено: slava_d200 от Апрель 08, 2012, 03:10
но если я устанавливаю программно активную ячейку, выделяется тока эта ячейка а не вся строка.
как сделать чтобы выделялась вся строка ?
Код
C++ (Qt)
void QTableView::selectRow( int row )

СПАСИБО
помогло.


Название: Re: как правильно обновить представление QTablView
Отправлено: V1KT0P от Апрель 08, 2012, 03:12
но если я устанавливаю программно активную ячейку, выделяется тока эта ячейка а не вся строка.
как сделать чтобы выделялась вся строка ?
Код
C++ (Qt)
void QTableView::selectRow( int row )

СПАСИБО
помогло.
Можешь еще добавить:
Код
C++ (Qt)
QTableView->scrollTo(QTableView->currentIndex());
Ибо в QTableWidget например не скролит до строки если она уже выделена, даже если за пределом видимой части.


Название: Re: как правильно обновить представление QTablView
Отправлено: slava_d200 от Апрель 08, 2012, 03:15
еще раз СПАСИБО.

тока теперь встал вопрос.
а как определить выделенная строка находится в зоне видимости или нет?



Название: Re: как правильно обновить представление QTablView
Отправлено: V1KT0P от Апрель 08, 2012, 04:02
еще раз СПАСИБО.

тока теперь встал вопрос.
а как определить выделенная строка находится в зоне видимости или нет?


Если делать правильно, то наверно надо наследоваться и добавлять функцию(ибо я что-то не вижу функцию которая возвращает видимую внутреннюю область). Но можно вот такой костыль использовать:
Код
C++ (Qt)
int visibleVerticalCount = QTablView->rowCount() - QTablView->verticalScrollBar()->maximum();
int visibleStart = QTablView->verticalScrollBar()->value();
int visibleEnd = QTablView->verticalScrollBar()->value() + visibleVerticalCount;
В итоге мы получим значения с какой по какую строку видно. Но только если нижняя строка хоть на пиксель отрисовывается, то будет считаться что она видна.


Название: Re: как правильно обновить представление QTablView
Отправлено: Bepec от Апрель 08, 2012, 09:18
Помоему гораздо проще крутить каждый раз
Код:
QTableView->scrollTo(QTableView->currentIndex());

Там жеж 3 варианта прокрутки - попиксельно, поитемно и ещё какой то ;)

Если будет выделяться не чаще чем раз в 300 мс, то тормозов и лагов не будет ;)


Название: Re: как правильно обновить представление QTablView
Отправлено: slava_d200 от Апрель 08, 2012, 10:58
немогу понять.
если список большой
и я позициирую к примеру 3-ю строку.

то в некоторых случаях выделенная строка отображается самой первой и убирает верхнии 2-е строки.
а в некоторых случаях при таких же манипуляциях.

выделенная строка отображается третьей в списке и не прячет первые две строки.


Название: Re: как правильно обновить представление QTablView
Отправлено: V1KT0P от Апрель 08, 2012, 12:07
немогу понять.
если список большой
и я позициирую к примеру 3-ю строку.

то в некоторых случаях выделенная строка отображается самой первой и убирает верхнии 2-е строки.
а в некоторых случаях при таких же манипуляциях.

выделенная строка отображается третьей в списке и не прячет первые две строки.
Замени это:
Код
C++ (Qt)
QTablView->scrollTo(QTablView->currentIndex());
на это:
Код
C++ (Qt)
int row = QTablView->currentRow();
if (row > QTablView->verticalScrollBar()->maximum())
   row = QTablView->verticalScrollBar()->maximum();
QTablView->verticalScrollBar()->setValue(row);
Теперь строка будет всегда вверху, если это возможно.


Название: Re: как правильно обновить представление QTablView
Отправлено: GreatSnake от Апрель 08, 2012, 12:24
Внимательно смотрим второй аргумент QAbstractItemView::ScrollHint:
Код
C++ (Qt)
void QAbstractItemView::scrollTo( const QModelIndex& index, ScrollHint hint = EnsureVisible )
и не городим огород)


Название: Re: как правильно обновить представление QTablView
Отправлено: slava_d200 от Апрель 08, 2012, 14:38
Внимательно смотрим второй аргумент QAbstractItemView::ScrollHint:
Код
C++ (Qt)
void QAbstractItemView::scrollTo( const QModelIndex& index, ScrollHint hint = EnsureVisible )
и не городим огород)

все получилось!!!!

большое СПАСИБО всем откликнувшимся.