2012-01-19 4 views
2

に含まれています。あなただけの比較メソッドをオーバーライドする必要がJavaでQt- QListにチェックがカスタムクラスをロードのQt QListにの比較メカニズムを無効にする方法はありますカスタムクラス

すなわち。

私はcustomclassモデルと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内のオブジェクトを格納できるようにするために、クラスは、以下のものが必要コンパイラによって暗黙的に生成されたコンストラクタおよび代入演算子で十分です。あなたのクラスが所有者の問題をカバーするためには明示的なコピー/割り当てが必要です。あなたがすでに行っているよう

QList::contains()のためには、operator==()をオーバーロードすることができます。 2番目の質問については

、@Joachim Pileborgは正しいです。私の上記のポストMyCustomClassで

+0

1つの変更は、QObjectを継承しません。私がQObjectから継承するときQList containsは機能しません。 (上記の私のコードが同じであると仮定すると) – user609530

+0

はい、 'QObject'派生クラスのインスタンスはコンテナの値として使用できません。 'QObject'を格納する必要がある場合は、それらにポインタを格納します。 – laalto