Gerade stieß ich auf ein seltsames Verhalten von Qt-Framework beim Aufrufen überladener C++ - Methoden aus Qml und versuchen, den Grund dafür zu verstehen. Lassen Sie uns sagen, ich habe eine QList<QVariant>
-artige Klasse mit den folgenden Methoden:Qt/Qml und Methode Überladungen
...
Q_SLOT void append(const QVariant &item);
Q_SLOT void append(const QVariantList &items);
Q_SLOT void insert(int index, const QVariant &item);
Q_SLOT void insert(int index, const QVariantList &items);
...
QML:
onclicked: {
var itemCount = myListObject.size();
myListObject.insert(itemCount, "Item " + (itemCount + 1));
}
Qt entscheidet irgendwie die void insert(int index, const QVariantList &items)
Überlastung mit items
Argument
ein
eine leere null QVariant
QVariantList
gesetzt aufzurufen anstelle der void insert(int index, const QVariant &item)
Überladung mit QString
verpackt in QVariant
.
Nun, wenn ich die Reihenfolge der Erklärungen wie folgt ändern, funktioniert es wie erwartet:
Q_SLOT void insert(int index, const QVariantList &items);
Q_SLOT void insert(int index, const QVariant &item);
ich nichts unter Qt-Framework in der Dokumentation in Bezug auf die Reihenfolge der Erklärungen finden konnten, und wie es wirkt sich auf die Art und Weise Methoden gelöst werden während des Aufrufs.
Kann mir bitte jemand erklären? Vielen Dank.
können Sie erwähnen, was speziell in der Javascript-Überladung System dieses Verhalten provozieren? – UmNyobe
danke für das Versuchen..Ich war nicht auf der Suche nach einer Lösung ... Lösung ist einfach - nur die Reihenfolge der Deklarationen ändern ... Ich habe versucht zu verstehen (für zukünftige Referenz) wie und warum Qt beschließt, die falsche Überladung aufzurufen und ignoriert die Datentypen einfach vollständig. Wenn die Reihenfolge geändert wird, hat es jedoch kein Problem, die richtigen Methodensignaturen zu finden. Auf der Randnotiz beschränkt Ihre Lösung meine Klasse, nur bestimmte Datentypen zu akzeptieren. – gplusplus
Tatsächlich beantwortet dies nicht die Hauptfrage, d.h. * warum * das Verhalten auftritt. Mit Blick auf dieses [alte Commit] (https://qt.gitorious.org/qt/tmartsums-qt/commit/1d7b672fd46abab51a0124ad19aad18e5d14f1a8) gibt es keinen (offensichtlichen) Grund dafür, dass es nicht funktioniert. Fehler?? – BaCaRoZzo