Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Barmaglodd от Май 12, 2008, 09:38



Название: QTableView автоматически выделять первую строку
Отправлено: Barmaglodd от Май 12, 2008, 09:38
Ситуация такая: есть QTableView, отображает какую-то модель, модель выбросила reset(), хочется, чтобы QTableView автоматом выделило первую строку (если такая есть). Повесить обработчик на reset() не могу, т.к. слоты вызываются в произвольном порядке, и QTableView может ещё не обновиться. QItemSelectionModel на reset тоже не реагирует. Наследоваться от QTableView и копаться в коде не хочется. :( Может есть какое-то простое решение?


Название: Re: QTableView автоматически выделять первую строку
Отправлено: sikuda от Май 29, 2008, 15:50
Читаем Assistant
void QTableView::selectRow ( int row )   [slot]
Selects the given row in the table view if the current SelectionMode and SelectionBehavior allows rows to be selected.


Название: Re: QTableView автоматически выделять первую строку
Отправлено: Barmaglodd от Май 30, 2008, 10:24
Видимо я плохо объяснил. Я не знаю, когда и где этот selectRow вызывать.
Ситуация:
1. Модель связана с QTableView.
2. К QItemSelectionModel этого QTableView к сигналу currentRowChanged присоединён обработчик.
3. Модель выкидывает reset().
Я хочу, чтобы reset() сначала обработался в QTableView, потом автоматически выбралась первая строка, выкинулся currentRowChanged и сработал мой обработчик.
Решения, которые я вижу:
1. Повесить на reset() модели обработчик, который вызывает selectRow у QTableView. Это вариант не катит, т.к. слоты вызываются в произвольном порядке и selectRow может вызваться, когда QTableView еще не обработает reset().
2. Наследоваться от QTableView, в наследнике после обработки reset() вызывать selectRow. Не хочу мучаться и копаться в коде QTableView.
3. Наследоваться от QItemSelectionModel и учить её обрабатывать reset(). Это вариант, видимо, потянет за собой ещё и создание наследника от QTableView. Так что тоже отпадает.
Хочется простого решения, а я его пока не вижу :(


Название: Re: QTableView автоматически выделять первую строку
Отправлено: Alex03 от Май 30, 2008, 11:27
А модель то поди reset не сама выкдывает?


Название: Re: QTableView автоматически выделять первую строку
Отправлено: Barmaglodd от Май 30, 2008, 13:50
Т.е. вы предлагаете в каждом месте кода, которое потенциально вызовет reset() у модели, руками вызывать selectRow у соответствующего QTableView? Уж лучше я наследника от QTableView сделаю, чем такие костыли.


Название: Re: QTableView автоматически выделять первую строку
Отправлено: Sergeich от Май 30, 2008, 13:58
Ситуация такая: есть QTableView, отображает какую-то модель, модель выбросила reset(), хочется, чтобы QTableView автоматом выделило первую строку (если такая есть). Повесить обработчик на reset() не могу, т.к. слоты вызываются в произвольном порядке, и QTableView может ещё не обновиться.
Код:
connect( yourModel, SIGNAL(modelReset()), yourView, SLOT(onModelReset()), Qt::QueuedConnection );

void YourView::onModelReset()
{
  selectRow ( 0 );
}


Название: Re: QTableView автоматически выделять первую строку
Отправлено: Barmaglodd от Май 30, 2008, 15:05
Т.е. всё-таки наследоваться от QTableView? И, как я понял, идея в использовании Qt::QueuedConnection, который поместит вызов слота в цикл сообщений и будет пытаться его вызвать, пока не добьётся своего (When emitted, the signal is queued until the event loop is able to deliver it to the slot.)? Почему это должно обеспечить вызов onModelReset() позже вызова встроенного обработчика вьюшки?


Название: Re: QTableView автоматически выделять первую строку
Отправлено: Sergeich от Май 30, 2008, 18:52
Т.е. всё-таки наследоваться от QTableView? И, как я понял, идея в использовании Qt::QueuedConnection, который поместит вызов слота в цикл сообщений и будет пытаться его вызвать, пока не добьётся своего (When emitted, the signal is queued until the event loop is able to deliver it to the slot.)? Почему это должно обеспечить вызов onModelReset() позже вызова встроенного обработчика вьюшки?
Скорей всего, вьюшка связана с сигналами модели через DirectConnect, сначала должны обработаться все слоты вьюшки, и поставиться в очередь события типа перерисовки, а затем событие MetaCall(вызов слота через QueuedConnection). Если это не поможет, попробуй постить событие с низким приоритетом, или юзай QTimer::singleShot c каким-нить разумным интервалом.


Название: Re: QTableView автоматически выделять первую строку
Отправлено: AlekseyK от Сентябрь 17, 2009, 16:30
Простите, а это не то, что нужно:

Цитировать
void QTableView::setSpan ( int row, int column, int rowSpanCount, int columnSpanCount )

Sets the span of the table element at (row, column) to the number of rows and columns specified by (rowSpanCount, columnSpanCount).

This function was introduced in Qt 4.2.
???


Название: Re: QTableView автоматически выделять первую строку
Отправлено: MoPDoBoPoT от Сентябрь 18, 2009, 15:49
Простите, а это не то, что нужно
:) Нет, это делает слияние ячеек таблицы в одну.


Название: Re: QTableView автоматически выделять первую строку
Отправлено: AlekseyK от Сентябрь 18, 2009, 16:25
Ага, спасибо, а то непонятно было, что значит Span :)