Название: [Решено] Одновременое выделение ячеек в нескольких QTableWidget Отправлено: JamS007 от Августа 19, 2010, 21:38 Доброго времени суток.
Что есть: форма с 4-я QTableWidget. Пишу класс для подсветки данных в таблицах. Нужно сделать синхронное выделение ячеек в таблицах,то есть, если пользователь выделяет ячейку в одной таблице, соответствующие ячейки в остальных таблицах тоже должны выделиться. Звучит просто, да реализацию хорошую что-то подобрать не могу. Мой вариант: с помощью сигналов подключаю все 4 таблицы к классу подсветки, при выделении ячейки в одной таблице, класс подсветки автоматически выделит ячейки в остальных таблицах, но, при этом опять посылается сигнал о изменении выделения в этих таблицах, и процесс начинается сначала. Рано или поздно он заканчивается, но мне такой вариант не подходит по времени. Мое решение: при поступлении сигнала от одной таблицы, отключать все остальные таблицы от класса подсветки, изменять выделение в них, и подключить опять. Но, если честно, что-то не очень хочется так делать, может есть лучшие варианты? И вообще, дорого ли для системы подключение/отключение сигнала? Название: Re: Одновременое выделение ячеек в нескольких QTableWidget Отправлено: Авварон от Августа 19, 2010, 21:51 посмотри в сторону QItemSelectionModel и ее сигналов... может имеет смысл посоединять эти модели друг с другом?
да, коннект/дисконнект медленный (относительно - перебор списка метаметодов*перебор иерархии) Название: Re: Одновременое выделение ячеек в нескольких QTableWidget Отправлено: JamS007 от Августа 19, 2010, 22:08 QItemSelectionModel смотрел.
В том то и дело, в QTableWidget именно эта модель высылает сигнал об изменении выделения. Пробовал делать так: Код: QItemSelectionModel *model = new QItemSelectionModel(tableWidget->model()); Но данные в таблице обновляются только если навести мышку. Пробовал repaint(), не помогает. Что скажите? добавлено спустя 2 мин. Проблему с перерисовкой решил. Нужно вызывать не repaint() а update(...). Но тут возник другой вопрос: если каждый раз создавать новую модель, присваивать ее таблице и удалять старую то это как-то тоже накладно по времени. Такой способ мне кажется еще хуже чем с сигналами. Название: Re: Одновременое выделение ячеек в нескольких QTableWidget Отправлено: Авварон от Августа 20, 2010, 08:27 зачем ее вообще создавать? очищаете текущую и выделяете что надо
Название: Re: Одновременое выделение ячеек в нескольких QTableWidget Отправлено: JamS007 от Августа 20, 2010, 12:12 зачем ее вообще создавать? очищаете текущую и выделяете что надо Так это она отсылает сигналы об изменении выделения. Я пробовал сначала создать ее, выделить что нужно, и потом впихнуть в таблицу, тогда все выделяется, и сигнал не высылается. Но это как-тот тоже криво. Если пытаться ее отключить, то есть сделать так чтоб она не высылала сигналы, то соответственно по клику мыши она тоже работать не будет. Название: Re: Одновременое выделение ячеек в нескольких QTableWidget Отправлено: Авварон от Августа 20, 2010, 12:52 я бы делал один слот на все модели, который следит за изменениями. Юзер кликнул мышкой, взвели флаг, изменили 4 вьюхи, их изменения генерят сигнал, который обрабатывается этим методом но из-за флага мы скипаем рекурсивную обработку. Когда исменения закончены, флаг опускаем. Будет работать только с DirectConnection, но это вам и надо (все 4 вьюхи в гуи потоке)
Название: Re: Одновременое выделение ячеек в нескольких QTableWidget Отправлено: JamS007 от Августа 20, 2010, 13:12 Если не прав - поправьте.
Юзер кликнул мышкой, слот ловит сигнал, взводим флаг, изменяем выделения, остальные таблицы генерят сигнал, но, он не обрабатывается, до завершения текущей обработки. Где тогда смысл возводить флаг, если управление в этот слот больше не придет, до завершения его работы? Или при DirectConnection обработка текущего слота обрывается и начинается обработка нового? Название: Re: Одновременое выделение ячеек в нескольких QTableWidget Отправлено: Авварон от Августа 20, 2010, 13:18 Или при DirectConnection обработка текущего слота обрывается и начинается обработка нового? да, это именно так. Считайте что вы в месте эмита вызываете все слоты напрямую. После их обработки, контроль вернется к эмиту.Название: Re: Одновременое выделение ячеек в нескольких QTableWidget Отправлено: JamS007 от Августа 20, 2010, 13:35 Спасибо, попробовал - работает.
Авварон, вам - отдельное спасибо за внимание и терпение. |