Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: CJ1 от Июня 09, 2012, 09:42



Название: Непростая сортировка QTableWidget
Отправлено: CJ1 от Июня 09, 2012, 09:42
Вот вопрос.
Есть QTableWidget.
В него заносятся данные, соответственно сперва строки, затем столбцы.

Нужно сделать так.
Сортировка по нулевому столбцу.

При заполнении таблицы, если встречается слово Казахстан, то эта строчка должна стать первой!
Далее если встречается слово Россия, то эта строчка должна стать первой после всех строчек с надписью Казахстан!

Как так можно переносить строчки то?


Название: Re: Непростая сортировка QTableWidget
Отправлено: _OLEGator_ от Июня 09, 2012, 10:07
Видимо переопределить сортировку в модели:
Код
C++ (Qt)
void QAbstractItemModel::sort ( int column, Qt::SortOrder order = Qt::AscendingOrder ) [virtual]


Название: Re: Непростая сортировка QTableWidget
Отправлено: GreatSnake от Июня 09, 2012, 11:12
Перегружаешь у QTableWidgetItem operator<
Код
C++ (Qt)
bool YourTableWidgetItem::operator< ( const QTableWidgetItem & other ) const
{
   if( this->column() == 0 && other.column() == 0 )
   {
      if( this->text().contains( "Казахстан" ) )
        return true;
      if( other.text().contains( "Казахстан" ) )
        return false;
      if( this->text().contains( "Россия" ) )
        return true;
      if( other.text().contains( "Россия" ) )
        return false;
   }
   return this->QTableWidgetItem::operator<( other );
}
 

далее либо создаёшь и добавляешь сам новый элемент производного класса либо через
Код
C++ (Qt)
void QTableWidget::setItemPrototype ( const QTableWidgetItem * item )
указываешь QTableWidget использовать его.



Название: Re: Непростая сортировка QTableWidget
Отправлено: CJ1 от Июня 09, 2012, 13:37
Неполучается наследовать класс

Вот пишу
Код
C++ (Qt)
#ifndef ITEM_H
#define ITEM_H
#include <QTableWidgetItem>
#include <QTableWidget>
 
class ItemSort : public QTableWidgetItem
{
   Q_OBJECT
public:
  explicit  ItemSort();
   ~ItemSort();
 
//   bool operator< ( const QTableWidgetItem & other ) const;
}
 
#endif // ITEM_H
 


и тут
Код
C++ (Qt)
#include <QTableWidgetItem>
#include <QTableWidget>
ItemSort(): QTableWidgetItem("")
{
 
}
 

Дает кучу ошибок


Название: Re: Непростая сортировка QTableWidget
Отправлено: GreatSnake от Июня 09, 2012, 13:40
Убери Q_OBJECT.


Название: Re: Непростая сортировка QTableWidget
Отправлено: CJ1 от Июня 09, 2012, 13:46
Точно!
Но теперь пишу так

Код:
class ItemSort : public QTableWidgetItem
{

public:
   explicit  ItemSort();
    ~ItemSort();

   virtual bool operator< ( const QTableWidgetItem & other ) const;
}


Код:
ItemSort::ItemSort(): QTableWidgetItem()
{

}


bool ItemSort::operator< ( const QTableWidgetItem & other ) const
{
    if( this->column() == 0 && other.column() == 0 )
    {
       if( this->text().contains( "Казахстан" ) )
         return true;
       if( other.text().contains( "Казахстан" ) )
         return false;
       if( this->text().contains( "Россия" ) )
         return true;
       if( other.text().contains( "Россия" ) )
         return false;
    }
    return this->QTableWidgetItem::operator<( other );
}


И говорит

C:\TorgBD-build-desktop-Qt_4_7_4_for_Desktop_-_MSVC2008__Qt_SDK_________\..\TorgBD\Item.cpp:10: ошибка: C2533: ItemSort::{ctor}: Є®­бвагЄв®ал ­Ґ а §аҐиҐ­л ¤«п ў®§ўа й Ґ¬®Ј® вЁЇ


Название: Re: Непростая сортировка QTableWidget
Отправлено: CJ1 от Июня 09, 2012, 13:52
На конструктор ругается


Название: Re: Непростая сортировка QTableWidget
Отправлено: GreatSnake от Июня 09, 2012, 13:54

Цитата: MSDN
Compiler Error C2533
'identifier' : constructors not allowed a return type
A constructor cannot a value or have a return type (not even a void return type).


Название: Re: Непростая сортировка QTableWidget
Отправлено: CJ1 от Июня 09, 2012, 13:59
Тоесть конструкторы тут не допускаются?

Убрал конструктор теперь компилится....


Название: Re: Непростая сортировка QTableWidget
Отправлено: CJ1 от Июня 09, 2012, 14:07
Также не сортируется! Объясните доходчиво! В чем тут суть?


Название: Re: Непростая сортировка QTableWidget
Отправлено: GreatSnake от Июня 09, 2012, 14:15
Также не сортируется! Объясните доходчиво! В чем тут суть?
А суть в том, что с С++ у тебя совсем беда :(

Тоесть конструкторы тут не допускаются?
Что за бред? Смотри внимательно как ты объявил ItemSort::ItemSort(). Если не видишь, то показывай здесь, только не те обрывки что выше.


Название: Re: Непростая сортировка QTableWidget
Отправлено: CJ1 от Июня 09, 2012, 14:22
Ну вот сделал с конструкторами

Код:
#ifndef ITEM_H
#define ITEM_H
#include <QTableWidgetItem>
#include <QTableWidget>

class ItemSort : public QTableWidgetItem
{

public:
   ItemSort(QString s);
   ItemSort();

   virtual bool operator< ( const QTableWidgetItem & other ) const;
};

#endif // ITEM_H



Код:
#include "dialog.h"
#include "ui_dialog.h"
#include "mainwindow.h"
#include <QtNetwork\QTcpSocket>
#include <QMessageBox>
#include "Item.h"
#include <QTableWidgetItem>
#include <QTableWidget>


ItemSort::ItemSort(QString s): QTableWidgetItem(s)
{

}

ItemSort::ItemSort(): QTableWidgetItem()
{

}


bool ItemSort::operator< ( const QTableWidgetItem & other ) const
{
    if( (this->column() == 0 && other.column() == 0) && (this->row() > 0 && other.row() > 0))
    {
  //  QMessageBox::information(0,"","");
       if( this->text().contains( "Казахстан" ) )
         return false;
       if( other.text().contains( "Казахстан" ) )
         return true;
       if( this->text().contains( "Россия" ) )
         return false;
       if( other.text().contains( "Россия" ) )
         return true;
    }
    return this->QTableWidgetItem::operator<( other );
}


Название: Re: Непростая сортировка QTableWidget
Отправлено: CJ1 от Июня 09, 2012, 14:27
setSortingEnabled нужно включать???


Название: Re: Непростая сортировка QTableWidget
Отправлено: CJ1 от Июня 09, 2012, 14:29
Или мне каждый item создовать именно с этим классом?


Название: Re: Непростая сортировка QTableWidget
Отправлено: GreatSnake от Июня 09, 2012, 14:33
Или мне каждый item создовать именно с этим классом?
Я же всё в своём первом сообщении написал.

setSortingEnabled нужно включать???
Либо включай, либо вызывай QTableWidget::sortItems().


Название: Re: Непростая сортировка QTableWidget
Отправлено: CJ1 от Июня 09, 2012, 14:35
Понятно! Правда всеравно читстая фигня получается


Название: Re: Непростая сортировка QTableWidget
Отправлено: GreatSnake от Июня 09, 2012, 14:38
Понятно! Правда всеравно читстая фигня получается
Твоя "читстая фигня" нам здесь не видна. Уж потрудись разъяснить. Или на форуме в первый раз  ???


Название: Re: Непростая сортировка QTableWidget
Отправлено: CJ1 от Июня 09, 2012, 14:39
Вобщем сортируется не так!!! А как попало! Хотя проходит через этот переопределенный метод!

И еще мне не ясно что передается в параметре other??


Название: Re: Непростая сортировка QTableWidget
Отправлено: CJ1 от Июня 09, 2012, 14:44
Аааа, все, красавчик, почитал доку, понял! Теперь все сделал верно! Спасибо всем за проявленное терпения!  :)


Название: Re: Непростая сортировка QTableWidget
Отправлено: GreatSnake от Июня 09, 2012, 14:45
Аааа, все, красавчик, почитал доку, понял! Теперь все сделал верно! Спасибо всем за проявленное терпения!  :)
???


Название: Re: Непростая сортировка QTableWidget
Отправлено: CJ1 от Июня 09, 2012, 14:50
Да, просто говорю, что все сделал и понял как делается


Название: Re: Непростая сортировка QTableWidget
Отправлено: Igors от Июня 09, 2012, 14:57
Перегружаешь у QTableWidgetItem operator<
Код
C++ (Qt)
bool YourTableWidgetItem::operator< ( const QTableWidgetItem & other ) const
{
   if( this->column() == 0 && other.column() == 0 )
   {
      if( this->text().contains( "Казахстан" ) )
        return true;
      if( other.text().contains( "Казахстан" ) )
        return false;
      if( this->text().contains( "Россия" ) )
        return true;
      if( other.text().contains( "Россия" ) )
        return false;
   }
   return this->QTableWidgetItem::operator<( other );
}
 
Я никогда не использовал таблицы (не нужно), но это "нетранзитивно" и сортировка использующая такой оператор имеет право рухнуть (что она и делает на некоторых платформах). Лучше так
Код
C++ (Qt)
enum {
pri_Kazah,
pri_Russia,
pri_Default,
};
 
inline int GetPriority( const QTableWidgetItem & itm )
{
  if (itm.text().contains("Казахстан"))  return pri_Kazah;
  if (itm.text().contains("Россия"))  return pri_Russia;
  return pri_Default;
}
 
bool YourTableWidgetItem::operator< ( const QTableWidgetItem & other ) const
{
int pr1 = GetPriority(*this);
int pr2 = GetPriority(other);
if (pr1 < pr2) return false;
if (pr1 > pr2) return true;
if (pr1 < pri_Default) return false;  // равны не значит <, нужно вернуть false
return QTableWidgetItem::operator< (other);
}
 

Ну и не стоит говорить что такая сортировка "непростая"  :)


Название: Re: Непростая сортировка QTableWidget
Отправлено: CJ1 от Июня 09, 2012, 15:01
Буду пробовать оба способа