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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сортировка QPtrList  (Прочитано 5825 раз)
cresta
Гость
« : Июль 31, 2007, 13:20 »

Добрый день. Проблема с методом sort класса QPtrList.

Создаю объекты (итемы) и запихиваю в QPtrList. Отсортировать не получается.

в файле MyList.h такой код:

Код:
class MyList : public QDialog{
    Q_OBJECT
        public:
        MyList ( QWidget *parent, const char *name, bool modal, WFlags f, Settings *set ) ;
       
        QPtrList<MyItem>    itemsList;
       
        protected:
            int compareItems ( QPtrCollection::Item item1, QPtrCollection::Item item2 );
};


в файле MyList.cpp:

Код:
void MyList::loadList (QStringList sList){
    /*
    здесь создаю итемы и добавляю
    указатели на них в QPtrList
    */
    MyItem   *myItem = new MyItem (............);
    itemsList.append(myItem);
   
    /*
    когда все итемы созданы и добавлены в QPtrList
    пытаюсь сортировать список по одному из членов итема (имя) по алфавиту
    */
    itemsList.sort();
}

int compareItems ( QPtrCollection::Item item1, QPtrCollection::Item item2 ){
    MyItem    *i1 = (MyItem*)item1;
    MyItem    *i2 = (MyItem*)item2;
   
    if ( i1->fullName > i2->fullName )
        return 1;
    else
        return -1;
}

    но функция сравнения int compareItems (QPtrCollection::Item item1, QPtrCollection::Item item2) не вызывается.
   
    Что здесь неправильно?
   
    Можно конечно и вручныю отсортровать, но хотелось бы понять в чем дело?
   
    Спасибо.
Записан
SABROG
Гость
« Ответ #1 : Июль 31, 2007, 13:41 »

А где ты передаешь указатель на свой метод сравнения ?

Код:

qSort(itemsList.begin(), itemsList.end(), compareItems);
int compareItems ( QPtrCollection::Item item1, QPtrCollection::Item item2 ){
    return (MyItem*)item1->fullName > (MyItem*)item2->fullName;
}
Записан
cresta
Гость
« Ответ #2 : Июль 31, 2007, 18:49 »

Не понял. Как передать и кому передать указатель на compareItems?
У меня есть экземпляр QPtrList. И как ему передать указатель на функцию сравнения?
Метод QPtrList::sort() никаких параметров не принимает, чтобы с ним можно было бы передать указатель.
Непонимающий

qt 3.3
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Июль 31, 2007, 20:28 »

2 cresta: Ткни меня носом в то место, где ты переопределил метод compareItems для QPtrList. Не удивительно что она у теьбя не вызываеться ))))
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
cresta
Гость
« Ответ #4 : Июль 31, 2007, 20:56 »

И как переопределить?

Когда дело касается virtual protected функций (например eventFilter), я объявляю её в файле заголовка с таким же именем eventFilter, и пишу свою реализацию eventFilter(). Моя реализация и перекрывает стандартную функцию. При этом я пишу её в файле .cpp как
void MyClass::eventFilter(){
/////
}
Т.е. MyClass является наследником класса, имеющего метод eventFilter().

Но у меня нет отдельного класса - надстройки над QPtrList, чтобы можно было бы сделать по подобию eventFilter():
int MyCoolClass::compareitems(){
///
}
Это ерунда, и вполне справедливо не компилируется, т.к. MyCoolClass не имеет такого метода: compareitems().
Что, лепить ещё один класс - оболочку над классом QPtrList?

Я конечно могу в своём классе придумать функцию compareitems(), и наполнить её нужной реализацией. но QPtrList ничего не знает о существовании в каком-то там классе какой-то там функции, которая может сравнивать итемы. Функция существовать будет, но метод класса QPtrList она не перекроет.
Есть способ перекрыть функцию класса QPtrList не прибегая к построению надстройки?

Чтобы это было проще, чем я сделал сейчас, добавляя итемы не методом append, а по месту в соответствие с алфавитом:
Код:
//insert new item in list order by fullName        
        uint pos = 0;        
        ListItem    *i;
        for ( i = itemList.first(); i!=0; i = itemList.next() ) {
            if (i->fullName > item->fullName) break;
            pos++;
        }
        itemList.insert ( pos, item );
Записан
SABROG
Гость
« Ответ #5 : Июль 31, 2007, 21:31 »

функция qSort() есть в 3.3 ?
Записан
cresta
Гость
« Ответ #6 : Июль 31, 2007, 21:41 »

quicksort в 3.3 нет.
Да собственно нарисовать функцию сортировки и отсортировать не проблема. И qSort у меня есть реализованый.
Хотел просто понять механизм вызова callback функции.
 Видимо надо сверху над классом делать ещё класс, чтобы перекрыть в нем метод compareitems() наследуемого класса.
Блин, как это всё громоздко Грустный
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Июль 31, 2007, 22:04 »

2 cresta: Тебе нужно наследоваться от QPtrList и переопределить метод compareitems со своей реализацией. По другому никак.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
cresta
Гость
« Ответ #8 : Август 01, 2007, 11:15 »

Ну раз только с наследованием, проще самому отсортировать.

Спасибо всем.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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