Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: gil9red от Сентябрь 24, 2012, 21:42



Название: [РЕШЕНО] Синхронная сортировка столбцов нескольких таблиц
Отправлено: gil9red от Сентябрь 24, 2012, 21:42
Здравствуйте!
помогите пожалуйста!

пытался связать два QTableWidget, так чтобы при изменении у одного
из них сортировки столбца, у другого, столбец с таким же индексом
получал такой же порядок сортировки

количество столбцов у таблиц одинаково

киньте пожалуйста минимальный рабочий пример такой реализации)


Название: Re: Синхронная сортировка столбцов нескольких таблиц
Отправлено: V1KT0P от Сентябрь 24, 2012, 22:30
Я думаю тебе стоит посмотреть в сторону QTableView и QAbstractTableModel.


Название: Re: Синхронная сортировка столбцов нескольких таблиц
Отправлено: gil9red от Сентябрь 24, 2012, 22:40
Не могу :)
можно использовать только QTableWidget

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


Название: Re: Синхронная сортировка столбцов нескольких таблиц
Отправлено: V1KT0P от Сентябрь 24, 2012, 23:08
Не могу :)
можно использовать только QTableWidget

кроме того, QTableWidget наследуется от QTableView, значит может использовать его
методы (не все), покрайней мере слот сортировки по столбцу взято у QTableView :)
И как же ты собираешься для начала отловить событие сортировки столбцов? QTableWidget вообще-то предназначен для самых примитивных случаев.


Название: Re: Синхронная сортировка столбцов нескольких таблиц
Отправлено: gil9red от Сентябрь 24, 2012, 23:24
Не могу :)
можно использовать только QTableWidget

кроме того, QTableWidget наследуется от QTableView, значит может использовать его
методы (не все), покрайней мере слот сортировки по столбцу взято у QTableView :)
И как же ты собираешься для начала отловить событие сортировки столбцов? QTableWidget вообще-то предназначен для самых примитивных случаев.

Можно использовать сигнал, идущий от горизонтального заголовка таблицы, когда
на нее щелкают мышкой

Я делал так: создавал наследника от QTableWidget, перегружал метод сортировки как слот, что то типо такого:
Код:
void UTable::sortItems(int column, Qt::SortOrder order)
{
    horizontalHeader()->setSortIndicator(column, order);
    sortByColumn(column);
}
потом механизмов слотов/сигналов соединял две таблицы в плане общей сортировки:
Код:
    connect(table1->horizontalHeader(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)),
            table1, SLOT(sortItems(int,Qt::SortOrder)));
    connect(table1->horizontalHeader(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)),
            table2, SLOT(sortItems(int,Qt::SortOrder)));

    connect(table2->horizontalHeader(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)),
            table2, SLOT(sortItems(int,Qt::SortOrder)));
    connect(table2->horizontalHeader(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)),
            table1, SLOT(sortItems(int,Qt::SortOrder)));

ну а потом, у меня падала программа, и отладчик единственное что показывал это окно дизассенблера, но проблема именно в sortItems() который в наследнике

Вот я и обратился сюда, чтобы скинули свой рабочий пример, и я в нем бы разобрался


Название: Re: Синхронная сортировка столбцов нескольких таблиц
Отправлено: V1KT0P от Сентябрь 24, 2012, 23:41
ну а потом, у меня падала программа, и отладчик единственное что показывал это окно дизассенблера, но проблема именно в sortItems() который в наследнике

Вот я и обратился сюда, чтобы скинули свой рабочий пример, и я в нем бы разобрался
Ну смотри что получается после соединения сигналами:
В 1 таблице нажимаешь на заголовок, срабатывает слот который изменяет порядок сортировки и вызывает сортировку во 2-й таблице которая тоже вызывает слот сортировки которая меняет заголовок и вызывает слот сортировки 1-й таблицы которая вызывает смену заголовка сигнал который вызывает слот сортировки 2-й таблицы которая вызывает изменение заголовка сигнал которой вызывает слот сортировки 1-й таблицы... Думаю мысль насчет рекурсии ясна? =)


Название: Re: Синхронная сортировка столбцов нескольких таблиц
Отправлено: gil9red от Сентябрь 24, 2012, 23:52
Понятно, посмотрел исходники, сигнал заголовка sortIndicatorChanged(int,Qt::SortOrder) генерируется при вызове setSortIndicator(int logicalIndex, Qt::SortOrder order), а этот метод является частью методов сортировки, моя ошибка :)


Название: Re: Синхронная сортировка столбцов нескольких таблиц
Отправлено: gil9red от Сентябрь 25, 2012, 00:15
И как тогда быть? :) каким способом реализовать это?


Название: Re: Синхронная сортировка столбцов нескольких таблиц
Отправлено: V1KT0P от Сентябрь 25, 2012, 00:22
И как тогда быть? :) каким способом реализовать это?
Добавь ссылки друг на друга и меняй напрямую, только опять же учти чтоб не было рекурсии. Либо добавляй отдельную функцию которая не вызывает изменение у другой таблицы. Либо добавь переменную блокировки вызова функции другой таблицы, тогда устанавливаешь ее в true, вызываешь функцию а когда она отработает false.


Название: Re: Синхронная сортировка столбцов нескольких таблиц
Отправлено: gil9red от Сентябрь 26, 2012, 00:07
Понятно :)
что нибудь придумаю :)
спасибо, V1KT0P :)