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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Одновременое выделение ячеек в нескольких QTableWidget  (Прочитано 5536 раз)
JamS007
Гость
« : Август 19, 2010, 21:38 »

Доброго времени суток.

Что есть: форма с 4-я QTableWidget. Пишу класс для подсветки данных в таблицах. Нужно сделать синхронное выделение ячеек в таблицах,то есть, если пользователь выделяет ячейку в одной таблице, соответствующие ячейки в остальных таблицах тоже должны выделиться.  Звучит просто, да реализацию хорошую что-то подобрать не могу.

Мой вариант: с помощью сигналов подключаю все 4 таблицы к классу подсветки, при выделении ячейки в одной таблице, класс подсветки автоматически выделит ячейки в остальных таблицах, но, при этом опять посылается сигнал о изменении выделения в этих таблицах, и процесс начинается сначала. Рано или поздно он заканчивается, но мне такой вариант не подходит по времени.

Мое решение: при поступлении сигнала от одной таблицы, отключать все остальные таблицы от класса подсветки, изменять выделение в них, и подключить опять.

Но, если честно, что-то не очень хочется так делать, может есть лучшие варианты? И вообще, дорого ли для системы подключение/отключение сигнала?
« Последнее редактирование: Август 20, 2010, 13:36 от JamS007 » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Август 19, 2010, 21:51 »

посмотри в сторону QItemSelectionModel и ее сигналов... может имеет смысл посоединять эти модели друг с другом?
да, коннект/дисконнект медленный (относительно - перебор списка метаметодов*перебор иерархии)
Записан
JamS007
Гость
« Ответ #2 : Август 19, 2010, 22:08 »

QItemSelectionModel смотрел.

В том то и дело, в QTableWidget именно эта модель высылает сигнал об изменении выделения.
Пробовал делать так:
Код:
QItemSelectionModel *model = new QItemSelectionModel(tableWidget->model());
    QModelIndex index = tableWidget->model()->index(0,0);
    model->select(index,QItemSelectionModel::Select);

    tableWidget->setSelectionModel(model);

Но данные в таблице обновляются только если навести мышку. Пробовал repaint(), не помогает. Что скажите?


добавлено спустя 2 мин.
Проблему с перерисовкой решил. Нужно вызывать не repaint() а update(...). Но тут возник другой вопрос: если каждый раз создавать новую модель, присваивать ее таблице и удалять старую то это как-то тоже накладно по времени. Такой способ мне кажется еще хуже чем с сигналами.
« Последнее редактирование: Август 19, 2010, 22:14 от JamS007 » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Август 20, 2010, 08:27 »

зачем ее вообще создавать? очищаете текущую и выделяете что надо
Записан
JamS007
Гость
« Ответ #4 : Август 20, 2010, 12:12 »

зачем ее вообще создавать? очищаете текущую и выделяете что надо

Так это она отсылает сигналы об изменении выделения. Я пробовал сначала создать ее, выделить что нужно, и потом впихнуть в таблицу, тогда все выделяется, и сигнал не высылается. Но это как-тот тоже криво.

Если пытаться ее отключить, то есть сделать так чтоб она не высылала сигналы, то соответственно по клику мыши она тоже работать не будет.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Август 20, 2010, 12:52 »

я бы делал один слот на все модели, который следит за изменениями. Юзер кликнул мышкой, взвели флаг, изменили 4 вьюхи, их изменения генерят сигнал, который обрабатывается этим методом но из-за флага мы скипаем рекурсивную обработку. Когда исменения закончены, флаг опускаем. Будет работать только с DirectConnection, но это вам и надо (все 4 вьюхи в гуи потоке)
Записан
JamS007
Гость
« Ответ #6 : Август 20, 2010, 13:12 »

Если не прав - поправьте.

Юзер кликнул мышкой, слот ловит сигнал, взводим флаг, изменяем выделения, остальные таблицы генерят сигнал, но, он не обрабатывается, до завершения текущей обработки. Где тогда смысл возводить флаг, если управление в этот слот больше не придет, до завершения его работы?

Или при DirectConnection обработка текущего слота обрывается и начинается обработка нового?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #7 : Август 20, 2010, 13:18 »

Или при DirectConnection обработка текущего слота обрывается и начинается обработка нового?
да, это именно так. Считайте что вы в месте эмита вызываете все слоты напрямую. После их обработки, контроль вернется к эмиту.
Записан
JamS007
Гость
« Ответ #8 : Август 20, 2010, 13:35 »

Спасибо, попробовал - работает.

Авварон, вам - отдельное спасибо за внимание и терпение.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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