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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Непростая сортировка QTableWidget  (Прочитано 11436 раз)
CJ1
Гость
« : Июня 09, 2012, 09:42 »

Вот вопрос.
Есть QTableWidget.
В него заносятся данные, соответственно сперва строки, затем столбцы.

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

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

Как так можно переносить строчки то?
Записан
_OLEGator_
Гость
« Ответ #1 : Июня 09, 2012, 10:07 »

Видимо переопределить сортировку в модели:
Код
C++ (Qt)
void QAbstractItemModel::sort ( int column, Qt::SortOrder order = Qt::AscendingOrder ) [virtual]
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Июня 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 использовать его.

Записан

Qt 5.11/4.8.7 (X11/Win)
CJ1
Гость
« Ответ #3 : Июня 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("")
{
 
}
 

Дает кучу ошибок
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Июня 09, 2012, 13:40 »

Убери Q_OBJECT.
Записан

Qt 5.11/4.8.7 (X11/Win)
CJ1
Гость
« Ответ #5 : Июня 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}: Є®­бвагЄв®ал ­Ґ а §аҐиҐ­л ¤«п ў®§ўа й Ґ¬®Ј® вЁЇ
Записан
CJ1
Гость
« Ответ #6 : Июня 09, 2012, 13:52 »

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

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Июня 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).
Записан

Qt 5.11/4.8.7 (X11/Win)
CJ1
Гость
« Ответ #8 : Июня 09, 2012, 13:59 »

Тоесть конструкторы тут не допускаются?

Убрал конструктор теперь компилится....
Записан
CJ1
Гость
« Ответ #9 : Июня 09, 2012, 14:07 »

Также не сортируется! Объясните доходчиво! В чем тут суть?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Июня 09, 2012, 14:15 »

Также не сортируется! Объясните доходчиво! В чем тут суть?
А суть в том, что с С++ у тебя совсем беда Грустный

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

Qt 5.11/4.8.7 (X11/Win)
CJ1
Гость
« Ответ #11 : Июня 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 );
}
« Последнее редактирование: Июня 09, 2012, 14:25 от CJ1 » Записан
CJ1
Гость
« Ответ #12 : Июня 09, 2012, 14:27 »

setSortingEnabled нужно включать???
Записан
CJ1
Гость
« Ответ #13 : Июня 09, 2012, 14:29 »

Или мне каждый item создовать именно с этим классом?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #14 : Июня 09, 2012, 14:33 »

Или мне каждый item создовать именно с этим классом?
Я же всё в своём первом сообщении написал.

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

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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