Проверка Qt-Qlist содержит пользовательский класс - PullRequest
3 голосов
/ 19 января 2012

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

Т.е. в 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;
}
}

Ответы [ 2 ]

5 голосов
/ 19 января 2012

Эта строка:

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

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

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

qDebug()<< (*c1 == *c2);
2 голосов
/ 19 января 2012

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

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

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

Для QList::contains() вы можете перегружать operator==(), как вы уже сделали.второй вопрос, @Joachim Pileborg правильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...