Ersetzen von Q3PtrList durch QList

Alles rund um die Programmierung mit Qt
Antworten
mike
Beiträge: 7
Registriert: 31. Oktober 2016 18:18

Ersetzen von Q3PtrList durch QList

Beitrag von mike »

Hallo,

ich möchte eine Qt3 Anwendung auf Qt4 anpassen. Dabei habe ich die Klasse Q3PtrList durch QList ersetzt.

Nun läuft der Compiler u. a. auf folgenden Fehler:

Code: Alles auswählen

/usr/include/QtCore/qlist.h: In Instanziierung von »int QList<T>::indexOf(const T&, int) const [with T = KPIM::KScoringRule]«:
......../kde-pim/kdepim-noakonadi/libkdepim/kscoring.cpp:1037:35:   required from here
/usr/include/QtCore/qlist.h:847:24: Fehler: no match for »operator==« (operand types are »KPIM::KScoringRule« and »const KPIM::KScoringRule«)
             if (n->t() == t)
                         
In file included from /usr/include/kde4/kdemacros.h:162:0,
                 from ......../kde-pim/kdepim-noakonadi/libkdepim/kdepim_export.h:24,
                 from ......../kde-pim/kdepim-noakonadi/libkdepim/kscoring.h:21,
                 from ......../kde-pim/kdepim-noakonadi/libkdepim/kscoring.cpp:23:
Die Stelle im Quelltext ist folgende Funktion:

Code: Alles auswählen

KScoringRule *KScoringManager::addRule( KScoringRule *expr )
{
//  int i = allRules.findRef( expr );     // Alt; allRules ist vom Typ Q3PtrList
  int i = allRules.indexOf( *expr );      // Neu; Zeile 1037  allRules ist vom Typ QList
  if ( i == -1 ) {
    // only add a rule we don't know
    addRuleInternal( expr );
  } else {
    emit changedRules();
  }
  return expr;
}
http://doc.qt.io/qt-4.8/q3ptrlist.html Doku zu Q3PtrList

http://doc.qt.io/qt-4.8/qlist.html Doku zu QList


KScoringRule ist eine selbst definierte Klasse.

Ist das Problem das "const" oder generell der Typ KScoringRule?


mike
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Ersetzen von Q3PtrList durch QList

Beitrag von Christian81 »

Q3PtrList<> ist eine QList mit Pointern auf Objekte, willst Du es mit QList<> ersetzen, dann musst Du in der QList<> natürlich auch Pointer speichern und nicht Objekte. Willst Du Objekte speichern braucht QList<> den operator==() für das entsprechende Objekt - und das ist genau das was angemeckert wird.
Q3PtrList löscht m.E. auch die Pointer wenn sie entfernt werden - das macht QList<> natürlich nicht.
Und eigentlich wäre es auch sinnvoller gleich den richtigen Container-Typ zu verwenden - QVector<>
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mike
Beiträge: 7
Registriert: 31. Oktober 2016 18:18

Re: Ersetzen von Q3PtrList durch QList

Beitrag von mike »

Ich habe Q3PtrList durch QVector ersetzt, ich kann das Paket nun erfolgreich bauen.

Ich hatte QList als Ersatz gewählt weil hier darauf hingedeutet wurde:

http://doc.qt.io/qt-4.8/porting4.html

"The following table summarizes the API differences between QPtrList<T> and QList<T *>:"
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Ersetzen von Q3PtrList durch QList

Beitrag von Christian81 »

Dein Problem hatte ja auch nichts mit QVector oder QList zu tun sondern dass man einen Pointer speichern muss, was ja auch in deiner Antwort steht:

"The following table summarizes the API differences between QPtrList<T> and QList<T *>:"
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten