2015-02-15 37 views
9

Sadece Qt çerçevesinin garip bir davranışına rastladım ve Qml içerisindeki aşırı C++ yöntemlerini çağırırken ve arkasındaki sebebi anlamaya çalışırken.Qt/Qml ve yöntem aşırı yükleri

... 
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 nasılsa bir null QVariant boş QVariantList ayarlı items bağımsız değişkenle void insert(int index, const QVariantList &items) aşırı çağırmak karar verir ı aşağıdaki yöntemlerle bir QList<QVariant> benzeri sınıf var diyelim QVariantvoid insert(int index, const QVariant &item) yerine QString yüklenmiştir. Ben bildirimleri sırasını değiştirirseniz aşağıdaki gibi

Şimdi, beklendiği gibi çalışır:

Q_SLOT void insert(int index, const QVariantList &items); 
Q_SLOT void insert(int index, const QVariant &item); 

Ben bildirimleri sırasına ilişkin Qt framework belgelerine altında bir şey bulamadı ve yöntemler çözülür yolunu nasıl etkilediğini çağırma sırasında.

Birisi lütfen açıklayabilir mi? Teşekkür ederim.

cevap

3

Bu soru, JavaScript'in aşırı yüklenmesi ile ilgilidir. Bunu bir kez anladığınızda - kodunuzun "garip davranışı" nedenini anlıyorsunuz. Sadece Function overloading in Javascript - Best practices'a bir göz atın.

Birkaç kelimeyle - bir sonraki yapmanız gereken: her iki tarafta da QVariant değişkenlerini çalıştırabilmeniz için (QML ve Qt/C++) - değişkenini parametre olarak geçirin ve istediğiniz gibi Qt/C++ tarafında işleyin .

Böyle bir şey kullanabilirsiniz:

Kişisel C++ QML için oluşturulan ve geçirilen sınıf (örn olarak setContextProperty("TestObject", &tc)):

sizin QML Somewhere in
public slots: 
    Q_SLOT void insert(const int index, const QVariant &something) { 
     qDebug() << __FUNCTION__; 
     if (something.canConvert<QString>()) { 
      insertOne(index, something.toString()); 
     } else if (something.canConvert<QStringList>()) { 
      insertMany(index, something.toStringList()); 
     } 
    } 

private slots: 
    void insertOne(int index, const QString &item) { 
     qDebug() << __FUNCTION__ << index << item; 
    } 

    void insertMany(int index, const QStringList &items) { 
     qDebug() << __FUNCTION__ << index << items; 
    } 

:

Button { 
    anchors.centerIn: parent 
    text: "click me" 
    onClicked: { 
     // Next line will call insertOne 
     TestObject.insert(1, "Only one string") 
     // Next line will call insertMany 
     TestObject.insert(2, ["Lots", "of", "strings"]) 
     // Next line will call insertOne 
     TestObject.insert(3, "Item " + (3 + 1)) 
     // Next line will call insertOne with empty string 
     TestObject.insert(4, "") 
     // Next line will will warn about error on QML side: 
     // Error: Insufficient arguments 
     TestObject.insert(5) 
    } 
} 
+4

Özellikle javascript aşırı yükleme sisteminde bu davranışı kışkırttığını söyleyebilir misiniz? – UmNyobe

+1

Denediğin için teşekkürler ... Çözüm aramıyordum ... Çözüm basit - sadece açıklamaların sırasını değiştir ... Anlamaya çalışıyorum (gelecekteki referans için) ve Qt neden yanlış aşırı yükü çağırmaya karar verdi? ve sadece veri tiplerini tamamen yok sayar. Sipariş değiştiğinde, doğru yöntem imzalarına çözüm bekleyen bir sorun yoktur. Yan notta, çözümünüz sınıfımı sadece belirli veri türlerini kabul edecek şekilde sınırlandırıyor. – gplusplus

+0

Gerçekten de, bu ana soruya cevap vermiyor, yani * neden * davranış gerçekleşir. Buna bakmak için [eski taahhüt] (https://qt.gitorious.org/qt/tmartsums-qt/commit/1d7b672fd46abab51a0124ad19aad18e5d14f1a8) işe yaramayacak (görünür) bir sebep yok. Hata ?? – BaCaRoZzo

İlgili konular