Russian Qt Forum

Qt => Общие вопросы => Тема начата: cresta от Июль 31, 2007, 13:20



Название: Сортировка QPtrList
Отправлено: 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) не вызывается.
   
    Что здесь неправильно?
   
    Можно конечно и вручныю отсортровать, но хотелось бы понять в чем дело?
   
    Спасибо.


Название: Сортировка QPtrList
Отправлено: SABROG от Июль 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;
}


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

qt 3.3


Название: Сортировка QPtrList
Отправлено: pastor от Июль 31, 2007, 20:28
2 cresta: Ткни меня носом в то место, где ты переопределил метод compareItems для QPtrList. Не удивительно что она у теьбя не вызываеться ))))


Название: Сортировка QPtrList
Отправлено: cresta от Июль 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 );


Название: Сортировка QPtrList
Отправлено: SABROG от Июль 31, 2007, 21:31
функция qSort() есть в 3.3 ?


Название: Сортировка QPtrList
Отправлено: cresta от Июль 31, 2007, 21:41
quicksort в 3.3 нет.
Да собственно нарисовать функцию сортировки и отсортировать не проблема. И qSort у меня есть реализованый.
Хотел просто понять механизм вызова callback функции.
 Видимо надо сверху над классом делать ещё класс, чтобы перекрыть в нем метод compareitems() наследуемого класса.
Блин, как это всё громоздко :(


Название: Сортировка QPtrList
Отправлено: pastor от Июль 31, 2007, 22:04
2 cresta: Тебе нужно наследоваться от QPtrList и переопределить метод compareitems со своей реализацией. По другому никак.


Название: Сортировка QPtrList
Отправлено: cresta от Август 01, 2007, 11:15
Ну раз только с наследованием, проще самому отсортировать.

Спасибо всем.