2012-01-19 3 views
2

Есть ли способ переопределить механизм сравнения Qt QList, загружаемый пользовательскими классами.Проверка Qt-Qlist содержит с пользовательским классом

i.e В java вам просто нужно переопределить метод сравнения.

У меня есть модель QList с моей моделью пользовательского класса.

QList <CustomClass *>list; 
CustomClass *c1=new CustomClass(); 
c1.name= "john"; 
list.append(c2); 
CustomClass *c2=new CustomClass(); 
c2.name= "john"; 

qDebug()<<list.contains(c2); //false 

//Secondly I have overridden the equals '==' operator and still getting false 
qDebug()<< (c1 == c2); //false, why ? 
qDebug()<< (c1->operator ==(*c2)); //true 

class CustomClass 
{ 
QString name; 
bool operator==(const CustomClass& other)const 
{ 
    if(this->name==(other.name)) 
    { 
     return true; 
    } 
    return false; 
} 
} 

ответ

5

Эта линия:

qDebug()<< (c1 == c2); //false, why ? 

Это false, потому что вы не сравниваете фактические примеры, но указатели.

Попробуйте вместо этого:

qDebug()<< (*c1 == *c2); 
1

Для первого вопроса, то вам нужно хранить реальные объекты, а не только указатели на них. Для того, чтобы иметь возможность хранить объект в контейнере, Qt, таких как QList, класс должен иметь следующее:

  • конструктор по умолчанию
  • конструктор копирования
  • оператор присваивания

В этом case, конструкторы и оператор присваивания, неявно генерируемые компилятором, будут достаточными. Если ваш класс имел, например, членов указателя, вам понадобится явная копия/присвоение, чтобы покрыть проблемы с владением.

За QList::contains() вы можете перегрузить operator==(), как вы уже это сделали.

Для второго вопроса, @Joachim Pileborg является правильным.

+0

Одно изменение, в моем выше сообщении MyCustomClass не наследуется от QObject. Когда я унаследовал от QObject, список QList не работает. (Предположим, что мой код выше аналогичен) – user609530

+0

Да, экземпляры класса, полученные из QObject, не могут использоваться в качестве значений в контейнерах. Если вам нужно сохранить 'QObject', сохраните указатели на них. – laalto

Смежные вопросы