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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Помогите с сортировкой QTableWidget  (Прочитано 8331 раз)
CJ1
Гость
« Ответ #15 : Октябрь 03, 2012, 14:12 »

Ну помогите пожалуста!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Октябрь 03, 2012, 14:23 »

И еще мне надо строчку 0 исключить из сортировки!
Наверное имеется ввиду "поставить первой". Тогда Вы это сделали неправильно. Проверьте без этих изменений. Если и без них не работает - выложите проект
Записан
CJ1
Гость
« Ответ #17 : Октябрь 03, 2012, 14:30 »

У меня получилось!
Сделал так
Код
C++ (Qt)
enum {
pri_Kazah,
pri_Russia,
pri_Default,
};
 
inline int GetPriority( const QTableWidgetItem & itm )
{
  if (itm.text().toLower().trimmed().startsWith( "каз" )|| itm.text().toLower().trimmed().startsWith( "кз" ))  return pri_Kazah;
  if (itm.text().toLower().trimmed().startsWith( "рос" )|| itm.text().toLower().trimmed().startsWith( "рф" ))  return pri_Russia;
  return pri_Default;
}
 
bool ItemSort::operator< ( const QTableWidgetItem & other )const
{
 
    if (this->row() == 0){
        return false;
 
    }
    if (other.row() == 0) {
        return false;
    }
    if (other.column() == 0 && this->column() == 0) {
       int pr1 = GetPriority(*this);
       int pr2 = GetPriority(other);
       if (pr1 > pr2) return false;
       if (pr1 < pr2) return true;
 
       return QTableWidgetItem::operator< (other);
    }
 
    return QTableWidgetItem::operator< (other);
 
 
}

А потом
Код
C++ (Qt)
               ItemSort * it = new ItemSort(tables);
 
               tables->setItemPrototype(it);
               tables->sortItems(2);
               tables->sortItems(0);
Записан
CJ1
Гость
« Ответ #18 : Октябрь 03, 2012, 14:30 »

Цитировать
Проверьте без этих изменений

Без изменений первая строчка бегает
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Октябрь 03, 2012, 16:32 »

А потом
Код
C++ (Qt)
               ItemSort * it = new ItemSort(tables);
 
               tables->setItemPrototype(it);
               tables->sortItems(2);
               tables->sortItems(0);
 
Так будет по именам нулевого столбца, а не 2-го  Улыбающийся

Код
C++ (Qt)
inline int GetPriority( const QTableWidgetItem & itm )
{
  if (itm.text().toLower().trimmed().startsWith( "каз" )|| itm.text().toLower().trimmed().startsWith( "кз" ))  return pri_Kazah;
  if (itm.text().toLower().trimmed().startsWith( "рос" )|| itm.text().toLower().trimmed().startsWith( "рф" ))  return pri_Russia;
  return pri_Default;
}
 
О таком тексте говорят "писал не ленивый программист"  Улыбающийся
Записан
CJ1
Гость
« Ответ #20 : Октябрь 03, 2012, 17:14 »

Код:
Так будет по именам нулевого столбца, а не 2-го  

Нет, именно так мне и нужно!
Он по обоим столбцам сортирует


Код:
О таком тексте говорят "писал не ленивый программист"  

А как по другому?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Октябрь 03, 2012, 17:27 »

А как по другому?
Хотя бы так
Код
C++ (Qt)
inline int GetPriority( const QTableWidgetItem & itm )
{
  if (itm.row() == 0) return pri_Row0;
  QString txt = itm.text().toLower().trimmed();
  if (txt.startsWith( "каз" )|| txt.startsWith( "кз" ))  return pri_Kazah;
  if (txt.startsWith( "рос" )|| txt.startsWith( "рф" ))  return pri_Russia;
  return pri_Default;
}
 

Нет, именно так мне и нужно!
Он по обоим столбцам сортирует
Он сортирует сначала по одному, потом по другому, поэтому в общем случае результаты первой сортировки утеряны
Записан
CJ1
Гость
« Ответ #22 : Октябрь 03, 2012, 18:01 »

Смотри. Вот мне нужно было так.
Допустим рассортировал он столбец 0.
Сначало выходят все Казахстан.
Вот потом он делает сортировку по третему столбцу но именно до казахстан и так далее
Пример


Казахстан    Ам
Казахстан    Ар
Казахстан    Бы
Казахстан    Си
Казахстан    т
Россия       ААА
Россия       ма
Россия       но
Россия       при
Россия       яв
Записан
VPS
Гость
« Ответ #23 : Октябрь 03, 2012, 18:20 »

Советую посмотреть книгу Бланшет,Саммерфилд - "QT4 Программирование GUI на С++".
Там есть пример создания приложения электронной таблицы с возможностью групповой сортировки (глава 3 -> spreadsheet )...
Я думаю, что можно и под Ваши требования переделать...

Дополнение:
Если отталкиваться от того примера, то можно попробовать  добавить ещё один унарный предикат, для алгоритма std::partition, в котором для названий стран "Казахстан" и "Россия" возвращать true.
Потом в методе sort класса Spreadsheet вместо простого вызова функции:
Код:
qStableSort(rows.begin(), rows.end(), compare);
сначала вызвать функцию std::partition, а уже затем для каждого поддиапазона вызывать qStableSort.

« Последнее редактирование: Октябрь 03, 2012, 23:48 от VPS » Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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