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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableView - не выделяется строка при QAbstractItemView::SelectRows  (Прочитано 4458 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Октябрь 25, 2014, 23:27 »

Есть у меня класс, унаследованный от QTableView. Для него я устанавливаю следующие параметры:

Код:
 setSelectionMode(QAbstractItemView::SingleSelection);
 setSelectionBehavior(QAbstractItemView::SelectRows);

Проблема в том, что не выделяется строка при ЛЕВОМ клике мышкой. Выделение строки ЛЕВЫМ кликом возможно только, если это первый клик на таблице. Все последующие клики не выделяют строку, а выделяют ячейку.

На экране происходит вот это: http://i.piccy.info/i9/dd6d85d244c18553e7c6fcb6d95ccdcc/1414267658/48572/597435/scr_362.png

Выделенная строка №4 - была выделена при первом ЛЕВОМ клике. А ячейка в строке №2 была выделена позже, при клике ЛЕВОЙ кнопки мыши.

Не могу разобраться - у меня еще что-то не настроено в QTableView? Или это могут быть проблемы из-за переназначения сигналов?

Исходник: https://github.com/xintrea/mytetra_dev/blob/experimental/src/views/recordTable/RecordTableView.cpp
Записан

Собираю информацию по крупицам
http://webhamster.ru
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Октябрь 26, 2014, 00:32 »

Проблема явно не в
Код:
setSelectionMode(QAbstractItemView::SingleSelection);
 setSelectionBehavior(QAbstractItemView::SelectRows);
, а среди почти девяти сотен вашего кода исходника RecordTableView.cpp Улыбающийся
Я видел, что вы там какие-то манипуляции с выделением делали Улыбающийся
Записан

xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #2 : Октябрь 26, 2014, 01:11 »

Проблема явно не в
Код:
setSelectionMode(QAbstractItemView::SingleSelection);
 setSelectionBehavior(QAbstractItemView::SelectRows);
, а среди почти девяти сотен вашего кода исходника RecordTableView.cpp Улыбающийся
Я видел, что вы там какие-то манипуляции с выделением делали Улыбающийся

Ну вот я закомментировал установку всех сигналов - поставил в начале функции setupSignals() return.

И поведение такое же глючное. А это практически чистый QTableView.
Записан

Собираю информацию по крупицам
http://webhamster.ru
VPS
Гость
« Ответ #3 : Октябрь 26, 2014, 14:25 »

У Вас проблемы из-за реализации слота:
Код:
virtual void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
На самом деле, если выделить новую строку и свернуть/развернуть приложение, то можно увидеть, что новая строка выделяется...

П.С.: можно в конце этого слота, вызвать метод родительского класса.
« Последнее редактирование: Октябрь 26, 2014, 19:45 от vps » Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #4 : Октябрь 27, 2014, 00:47 »

У Вас проблемы из-за реализации слота:
Код:
virtual void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
На самом деле, если выделить новую строку и свернуть/развернуть приложение, то можно увидеть, что новая строка выделяется...

П.С.: можно в конце этого слота, вызвать метод родительского класса.

Ага, спасибо, что-то я ступил. Для отладки отключил все коннекты - не помогло. Тогда для всех обработчиков прописал return в самое начало. Получилось, что selectionChanged() переопределен ничего не делающим методом, а метод базового класса как не вызывался. так и не вызывается. Исправил. Теперь при клике выделяется нормально вся строка.

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

Код:
setSelectionBehavior(QAbstractItemView::SelectRows);

Вообще не могу придумать как исправить. Вызывать искуственно selectionChanged() на ту же самую строку сразу после создания объекта - это как-то вообще криво. Есть стандартное решение?

Если быть более точным, то программная установка засветки на нужной строке с номером pos (в первой колонке):

Код:
QModelIndex selIdx=recordModel->index(pos, 0);

selectionModel()->setCurrentIndex(selIdx, QItemSelectionModel::ClearAndSelect);

вызывает выделение одной ячейки, а не всей строки. Несмотря на настройку setSelectionBehavior(QAbstractItemView::SelectRows).
« Последнее редактирование: Октябрь 27, 2014, 01:11 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
VPS
Гость
« Ответ #5 : Октябрь 27, 2014, 13:43 »

Думаю для того, чтобы выцепить правильное количество выделенных столбцов, необходимо работать с "selectionModel"...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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