Russian Qt Forum
Июнь 15, 2024, 23:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

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

Вобщем есть 3 столбца.
Нужно сделать сортировку так.
Сперва первый столбец сортируется так.
Если идет слово казахстан. То он на первое место встает, потом если идет слово Россия то она становится на второе место, а остольное по алфавиту.
Затем в третьем столбце сортируется так, все что относится к казахстану сортируется по алфавиту, потом Все что относится к России сортируется по алфавиту в третьем столбике,
Никак не могу придумать алгоритм...


И еще... Как можно из QString например такого 111\r\n222
Сделать QStringList
  • 111
  • [2] 222
« Последнее редактирование: Октябрь 03, 2012, 11:42 от CJ1 » Записан
Sancho_s_rancho
Гость
« Ответ #1 : Октябрь 03, 2012, 11:41 »

Вобщем есть 3 столбца.
Нужно сделать сортировку так.
Сперва первый столбец сортируется так.
Если идет слово казахстан. То он на первое место встает, потом если идет слово Россия то она становится на второе место, а остольное по алфавиту.
Затем в третьем столбце сортируется так, все что относится к казахстану сортируется по алфавиту, потом Все что относится к России сортируется по алфавиту в третьем столбике,
Никак не могу придумать алгоритм...
Я знаю как поставить Россию на первое место, а Казахстан на второе, а все остальное по алфавиту. А вот Казахстан на первое - это невозможно  Смеющийся
PS отсортируй все по алфавиту, а потом просто добавь эти два слова в том порядке,  в котором надобно
Записан
mutineer
Гость
« Ответ #2 : Октябрь 03, 2012, 11:42 »

Ну по поводу первого столбца все просто - Казахстан меньше любых значений, Россия меньше всех, кроме Казахстана, а остальные значения сравниваются по обычным правилам
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Был точно такой же вопрос, поищите напр "Казахстан"
Записан
mutineer
Гость
« Ответ #4 : Октябрь 03, 2012, 11:47 »

И еще... Как можно из QString например такого 111\r\n222
Сделать QStringList
  • 111
  • [2] 222
QString::split()
Записан
CJ1
Гость
« Ответ #5 : Октябрь 03, 2012, 11:47 »

Не такой... Там только сортировка по первому столбику
А мне нужно чтоб в добавок и по третему
Записан
CJ1
Гость
« Ответ #6 : Октябрь 03, 2012, 12:01 »

Вот такой код работает почти правильно!
Код
C++ (Qt)
bool ItemSort::operator< ( const QTableWidgetItem & other ) const
{
       if( (this->column() == 0 && other.column() == 0 && other.row() > 0 && this->row() >0))
       {
 
           if( this->text().toLower().trimmed().startsWith( "каз" )|| this->text().toLower().trimmed().startsWith( "кз" ))
               return true;
           if( other.text().toLower().trimmed().startsWith( "каз" )|| other.text().toLower().trimmed().startsWith( "кз" ))
               return false;
 
           if( this->text().toLower().trimmed().startsWith( "рос" )|| other.text().toLower().trimmed().startsWith( "рф" ))
               return true;
           if( other.text().toLower().trimmed().startsWith( "рос" )|| other.text().toLower().trimmed().startsWith( "рф" ))
               return false;
       }
   return false;//QTableWidgetItem::operator<( other );
}
 

Но третий столбик не сортируется
Записан
mutineer
Гость
« Ответ #7 : Октябрь 03, 2012, 12:16 »

Да и первый после России вряд ли по алфавиту сортируется
Записан
CJ1
Гость
« Ответ #8 : Октябрь 03, 2012, 12:22 »

сортируются.
Ну вообще в какую сторону копать чтоб сортировать по двум столбцам?
Записан
mutineer
Гость
« Ответ #9 : Октябрь 03, 2012, 12:26 »

Можешь покопать в сторону model/view и QSortFilterProxyModel
Записан
CJ1
Гость
« Ответ #10 : Октябрь 03, 2012, 12:53 »

Понял! Сперва сортирую по 3 столбику а потом по первому
                ItemSort * it = new ItemSort();
                tables->setItemPrototype(it);
                tables->sortItems(2,Qt::DescendingOrder);
                tables->sortItems(0);
Записан
CJ1
Гость
« Ответ #11 : Октябрь 03, 2012, 13:14 »

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

Сообщений: 11445


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

Начало кода возьмете из летней темы.

Код
C++ (Qt)
//  if (pr1 < pri_Default) return false;
//  return QTableWidgetItem::operator< (other);
 
// заменить на
QTableWidgetItem * itm1 = tableWidget()->itemAt(row(), 3);
QTableWidgetItem * itm2 = tableWidget()->itemAt(other.row(), 3);
return *itm1 < *itm2;
 
И проверки на "рф", регистр и др. вынесите в ф-цию GetPriority, не разводите свинарник
Записан
CJ1
Гость
« Ответ #13 : Октябрь 03, 2012, 13:31 »

Я не совсем понял, модно по подробнее?
Записан
CJ1
Гость
« Ответ #14 : Октябрь 03, 2012, 13:49 »

Вот сделал!
Вообще не сортирует!
Код
C++ (Qt)
bool ItemSort::operator< ( const QTableWidgetItem & other )const
{
 
    if (this->row() == 0){
        return false;
 
    }
    if (other.row() == 0) {
        return false;
    }
    int pr1 = GetPriority(*this);
    int pr2 = GetPriority(other);
    if (pr1 > pr2) return false;
    if (pr1 < pr2) return true;
 
    QTableWidgetItem * itm1 = _table->itemAt(2,row());
    QTableWidgetItem * itm2 = _table->itemAt(2,other.row());
    return *itm1 < *itm2;
 
 
}
 
 
И еще мне надо строчку 0 исключить из сортировки!
« Последнее редактирование: Октябрь 03, 2012, 14:05 от CJ1 » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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