2017-12-25 15 views
0

Betrachten Sie die leicht modifizierten birthday_party.hexample aus den unten aufgeführten Standard-QT-Beispiellisten.`Unbekannter Methodenparameter'-Fehler während der Ausführung von QML

Im folgenden Code habe ich einen Stub test() Funktion hinzugefügt, die nur den Namen der Person mit dem übergebenen Zeiger druckt.

#ifndef BIRTHDAYPARTY_H 
#define BIRTHDAYPARTY_H 

#include <QObject> 
#include <QQmlListProperty> 

#include "person.h" 

class BirthdayParty : public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(Person *host READ host WRITE setHost) 
    Q_PROPERTY(QQmlListProperty<Person> guests READ guests) 
public: 
    BirthdayParty(QObject *parent = 0); 

    Person *host() const; 
    void setHost(Person *); 

    QQmlListProperty<Person> guests(); 
    int guestCount() const; 
    Person *guest(int) const; 

    Q_INVOKABLE Person* invite(const QString &name); 
    Q_INVOKABLE void test(Person* p); 

private: 
    Person *m_host; 
    QList<Person *> m_guests; 
}; 

#endif // BIRTHDAYPARTY_H 

Die Definition für test() ist

void BirthdayParty :: test(Person* p) 
{ 
    QString qname = p->name(); 
    std::cout << qname.toUtf8().constData() << std::endl; 
} 

Meine QML-Datei, wo ich Test nennen, ist

import QtQuick 2.0 
import People 1.0 


BirthdayParty { 
    host: Person { name: "Bob Jones" ; shoeSize: 12 } 

    guests: [ 
     Person { name: "Leo Hodges" }, 
     Person { name: "Jack Smith" }, 
     Person { name: "Anne Brown" }, 
     Person { name : "Gaurish Telang"} 
    ] 

    Component.onCompleted: 
     { 
     test(guests[0]) 
     } 
} 

nun der obige Code kompiliert und läuft gut. Wenn ich jedoch das const Qualifikationsmerkmal vor Person* p in der Argumentliste von test() hinzufüge, erhalte ich Fehler von QML zur Laufzeit! (Dh Laufzeit barfs wenn die Signatur für Test in beiden Kopf- und CPP ist void test(const Person* p))

Der Fehler, den ich zur Laufzeit erhalten, ist

qrc:example.qml:17: Error: Unknown method parameter type: const Person* 

Es scheint, mein Fehler mit dem identisch ist, berichtet here auf dem Bug -Report-Website. Ich verwende Qt 5.10, die neueste Version von Qt.

EDIT

Die Person und BirthdayParty Typen wie folgt

qmlRegisterType<BirthdayParty>("People", 1,0, "BirthdayParty"); 
qmlRegisterType<Person>("People", 1,0, "Person"); 
+0

Wie registrieren Sie Ihre Artikel? – folibis

+0

@folibis Siehe Bearbeiten. Ich habe nicht geändert, wie ich die Typen registriert habe, während ich experimentiere mit dem Zusatz "const" oben. Macht das einen Unterschied? – smilingbuddha

Antwort

0

Ok registriert werden, da ich die letzten Versionen von Qt verstehen aus QML Gussobjekt verändert hatte und vice versa Quart. Manchmal war es in der Lage, Zeiger auf Objekte, Referenzen usw. zu verwenden. Es sieht so aus, dass es jetzt anders ist, und Sie müssen den verwendeten Typ explizit angeben. In Ihrem Fall denke ich, sollten Sie die folgende Zeile zum Artikel Registrierung hinzufügen:

qRegisterMetaType<Person*>("const Person*"); 

Btw, ich rate Ihnen Referenzen anstelle von Zeigern zu verwenden, da es die Mehrdeutigkeit beseitigt.

Verwandte Themen