Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: JamS007 от Август 19, 2010, 21:38



Название: [Решено] Одновременое выделение ячеек в нескольких 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());
    QModelIndex index = tableWidget->model()->index(0,0);
    model->select(index,QItemSelectionModel::Select);

    tableWidget->setSelectionModel(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
Спасибо, попробовал - работает.

Авварон, вам - отдельное спасибо за внимание и терпение.