Russian Qt Forum

Qt => Вопросы новичков => Тема начата: CJ1 от Июль 24, 2012, 11:58



Название: QTablewidget выборочная сортировка (Решено)
Отправлено: CJ1 от Июль 24, 2012, 11:58
Помогите пожалуйста сделать выборочную сортировку в QTableWidget.

Пользователь выделяет нужные строки, и они должны сортироваться по имени


Название: Re: QTablewidget выборочная сортировка
Отправлено: ruzik от Июль 24, 2012, 17:48
Ну, можно, например использовать это:
Код:
QList<QTableWidgetItem *> list = tableWidget->selectedItems (); //получаем выделенные ячейки
QList<QTableWidgetItem *> oldList = list;
qSort(list); //сортируем
for (int a=0; a < list.count(); a++)
     *oldList[a] = *list[a];
P.S. легко мог что либо напутать, сам код не проверял, но вроде бы все должно работать, извините если на практике получиться иначе))


Название: Re: QTablewidget выборочная сортировка
Отправлено: CJ1 от Июль 30, 2012, 12:09
Спасибо! Но сортирует криво вообще как то!


Название: Re: QTablewidget выборочная сортировка
Отправлено: CJ1 от Июль 30, 2012, 12:46
Ну помогите пожалуйсто :'(


Название: Re: QTablewidget выборочная сортировка
Отправлено: Igors от Июль 30, 2012, 12:58
Ну как сказал ruzik только надо qSort(lst.begin(), lst.end(), myLessThen) т.к. qSort(lst) будет сортировать по адресам а не по именам


Название: Re: QTablewidget выборочная сортировка
Отправлено: CJ1 от Июль 30, 2012, 13:05
А что такое myLessThen ???


Название: Re: QTablewidget выборочная сортировка
Отправлено: Igors от Июль 30, 2012, 13:12
А что такое myLessThen ???
В Ассистенте откройте страницу qSort и поищите LessThan - увидите примерчик.


Название: Re: QTablewidget выборочная сортировка
Отправлено: CJ1 от Июль 30, 2012, 13:17
ОК, извиняюсь за тупость, просто я уже двое суток не сплю ))))


Название: Re: QTablewidget выборочная сортировка
Отправлено: CJ1 от Июль 30, 2012, 13:31
 :'( :'( :'( :'( не выходит... говорит кучу ошибок


Название: Re: QTablewidget выборочная сортировка
Отправлено: CJ1 от Июль 30, 2012, 13:34
Теперь вот так сделал!
Код:
bool caseInsensitiveLessThan(const QTableWidgetItem *s1, const QTableWidgetItem *s2)
{
    return s1->text().toLower() < s2->text().toLower();
}



void MainWindow::on_pushButton_4_clicked()
{
    QList<QTableWidgetItem *> list = ui->tableWidget_2->selectedItems (); //получаем выделенные ячейки
     QList<QTableWidgetItem *> oldList  = list;



    qSort(list.begin(), list.end(),caseInsensitiveLessThan); //сортируем
    for (int a=0; a < list.count(); a++){
         *oldList[a] = *list[a];

    }
    ui->tableWidget_2->reset();
}

И всеравно косяки


Название: Re: QTablewidget выборочная сортировка
Отправлено: CJ1 от Июль 30, 2012, 13:35
А еще сортируются не по строкам а только те которые выделенны


Название: Re: QTablewidget выборочная сортировка
Отправлено: Igors от Июль 30, 2012, 13:47
А еще сортируются не по строкам а только те которые выделенны
??? Так как же надо? Вы писали
Пользователь выделяет нужные строки, и они должны сортироваться по имени
Ну значит не выделенные не трогаются. Или как  ???

В текущей реализации ошибку я вижу
Код:
for (int a=0; a < list.count(); a++){
         *oldList[a] = *list[a];
   
Так мы затираем элемент который может понадобиться позже. А вот как исправить - надо подумать. Ожидайте  :)


Название: Re: QTablewidget выборочная сортировка
Отправлено: CJ1 от Июль 30, 2012, 13:57
Нужно так, просто выделяем несколько строк, и при нажатии на кнопки, строки сортируются по имени!

Я щас вообще думать не могу  :'( :'(
Но нужно срочно!


Название: Re: QTablewidget выборочная сортировка
Отправлено: Igors от Июль 30, 2012, 15:26
Я щас вообще думать не могу  :'( :'(
Но нужно срочно!
Ну ладно, попробую помочь-спасти Пятачка :)

Код
C++ (Qt)
bool CompareRows( const QTableWidgetItem * item0, const QTableWidgetItem * item1 )
{
return item0->row() < item1->row();
}
 
bool CompareNames( const QTableWidgetItem & item0, const QTableWidgetItem & item1 )
{
return item0.text().toLower() < item1.text().toLower();
}
 
void MainWindow::on_pushButton_4_clicked()
{
       QList<QTableWidgetItem *> list = ui->tableWidget_2->selectedItems ();
qSort(lst.begin(), lst.end(), CompareRows);
 
QList <QTableWidgetItem> tmp;
for (int i = 0; i < lst.size(); ++i)
tmp.push_back(*lst[i]);
qSort(tmp.begin(), tmp.end(), CompareNames);
 
for (int i = 0; i < lst.size(); ++i)
*lst[i] = tmp[i];
 
       ui->tableWidget_2->reset();
}
 


Название: Re: QTablewidget выборочная сортировка
Отправлено: CJ1 от Июль 30, 2012, 15:49
Блиииин! Не то! Так строки не сортируются, они только как попало местами меняются! :'(


Название: Re: QTablewidget выборочная сортировка
Отправлено: Igors от Июль 30, 2012, 16:00
Блиииин! Не то! Так строки не сортируются, они только как попало местами меняются! :'(
Проект выкладывайте - быстрее дело будет


Название: Re: QTablewidget выборочная сортировка
Отправлено: CJ1 от Июль 30, 2012, 16:04
Проект состоит из клиента, сервера, и огромной БД на mysql. Это законченный проект для фирмы, который я написал! Но они потребовали дебильную сортировку!

Тоесть в точности как в excell есть функция сортировать от А до Я


Название: Re: QTablewidget выборочная сортировка
Отправлено: Igors от Июль 30, 2012, 16:10
Проект состоит из клиента, сервера, и огромной БД на mysql. Это законченный проект для фирмы, который я написал! Но они потребовали дебильную сортировку!

Тоесть в точности как в excell есть функция сортировать от А до Я
Никто и не просил полный рабочий проект. Нарисуйте окно с таблицей, заполните чем-нибудь, подключите кнопку - вот и все.

Edit: подразумевается что общая сортировка выключена - айтемы показываются в том порядке что были созданы. Если это не так то конечно будет месить хтозна-шо


Название: Re: QTablewidget выборочная сортировка
Отправлено: CJ1 от Июль 30, 2012, 16:24
Вот! http://narod.ru/disk/58404876001.4feb231b71ca0bd74654a575cee996f4/mmm.rar.html (http://narod.ru/disk/58404876001.4feb231b71ca0bd74654a575cee996f4/mmm.rar.html)

Строки должны сортироваться чтоб получилось

а строка а
б строка б
с строка с
р строка р


Название: Re: QTablewidget выборочная сортировка
Отправлено: DmitryM от Июль 30, 2012, 17:02
У вбюшки есть свойство sortingEnabled, кликаешь по шапке столбца и все сортируется.
Код
C++ (Qt)
void sortByColumn ( int column, Qt::SortOrder order )
Qt::SortOrder:
Qt::AscendingOrder 0 The items are sorted ascending e.g. starts with 'AAA' ends with 'ZZZ' in Latin-1 locales
Qt::DescendingOrder 1 The items are sorted descending e.g. starts with 'ZZZ' ends with 'AAA' in Latin-1 locales
 
Ну и пишешь QSortFilterProxyModel


Название: Re: QTablewidget выборочная сортировка
Отправлено: Igors от Июль 30, 2012, 18:31
Вот! http://narod.ru/disk/58404876001.4feb231b71ca0bd74654a575cee996f4/mmm.rar.html (http://narod.ru/disk/58404876001.4feb231b71ca0bd74654a575cee996f4/mmm.rar.html)

Строки должны сортироваться чтоб получилось

а строка а
б строка б
с строка с
р строка р
В аттаче измененные файлы. Запускаете выбираете ячейки, давите кнопку. Используется метод "грубой силы" - меняется сама модель. Чтобы вернуть взад Вам придется перезарядить всю модель (т.е. где-то хранить еще и исходные данные).

Понятно что нормальным, цивильным решением вроде выглядит QSortFilterProxyModel. Однако я затрудняюсь написать такую сортировку - она получается нетранзитивной. И хз как это должно работать - ну ладно, как-то отсортировали, потом selection изменилось - опять сортировать или как? Ведь "оставить как было сортировано по кнопке" не выходит. Поэтому возможно менять модель и есть разумно. Ну то уже Вам виднее.


Название: Re: QTablewidget выборочная сортировка
Отправлено: CJ1 от Июль 31, 2012, 07:53
Igors Спасибо вам огромное просто!!!! Это то что нужно! Только еще вот с мелким изменением )))
Код:
    QTableWidget * tbl = ui->tableWidget;

    QList <QTableWidgetItem *> nlst = tbl->selectedItems();
    QList <QTableWidgetItem *> lst;
    int testcolumn = nlst[0]->column();
    for (int i = 0; i < nlst.count(); i++){
        if (nlst[i]->column() == testcolumn){
            lst.push_back(nlst[i]);
        }
    }

    if (!lst.size()) return;


Вы просто меня спасли!!!!  :)