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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableView автоматически выделять первую строку  (Прочитано 8215 раз)
Barmaglodd
Гость
« : Май 12, 2008, 09:38 »

Ситуация такая: есть QTableView, отображает какую-то модель, модель выбросила reset(), хочется, чтобы QTableView автоматом выделило первую строку (если такая есть). Повесить обработчик на reset() не могу, т.к. слоты вызываются в произвольном порядке, и QTableView может ещё не обновиться. QItemSelectionModel на reset тоже не реагирует. Наследоваться от QTableView и копаться в коде не хочется. Грустный Может есть какое-то простое решение?
Записан
sikuda
Гость
« Ответ #1 : Май 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.
Записан
Barmaglodd
Гость
« Ответ #2 : Май 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. Так что тоже отпадает.
Хочется простого решения, а я его пока не вижу Грустный
Записан
Alex03
Гость
« Ответ #3 : Май 30, 2008, 11:27 »

А модель то поди reset не сама выкдывает?
Записан
Barmaglodd
Гость
« Ответ #4 : Май 30, 2008, 13:50 »

Т.е. вы предлагаете в каждом месте кода, которое потенциально вызовет reset() у модели, руками вызывать selectRow у соответствующего QTableView? Уж лучше я наследника от QTableView сделаю, чем такие костыли.
Записан
Sergeich
Гость
« Ответ #5 : Май 30, 2008, 13:58 »

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

void YourView::onModelReset()
{
  selectRow ( 0 );
}
« Последнее редактирование: Май 30, 2008, 14:00 от Sergeich » Записан
Barmaglodd
Гость
« Ответ #6 : Май 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() позже вызова встроенного обработчика вьюшки?
Записан
Sergeich
Гость
« Ответ #7 : Май 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 каким-нить разумным интервалом.
Записан
AlekseyK
Гость
« Ответ #8 : Сентябрь 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.
Непонимающий
Записан
MoPDoBoPoT
Гость
« Ответ #9 : Сентябрь 18, 2009, 15:49 »

Простите, а это не то, что нужно
Улыбающийся Нет, это делает слияние ячеек таблицы в одну.
Записан
AlekseyK
Гость
« Ответ #10 : Сентябрь 18, 2009, 16:25 »

Ага, спасибо, а то непонятно было, что значит Span Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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