2014-06-25 22 views
5

Q_INVOKABLE yapılmış bir C++ yöntemim var. Bu yöntemi QML'den çağırabilirim ve temel türleri döndürdüğünde (QString gibi) çalışır. Ama ben özel bir tiple yapamam. Bunu nasıl yapmalıyım? Bunun yerine bir QVariant döndürmeli miyim? İdeal olarak, mümkünse özel türümde bir işaretçi döndürmek istiyorum.Q_INVOKABLE yöntemi özel C++ türünü döndürüyor

DÜZENLEME yapmam:

qmlRegisterType<MyType>("Mine", 1, 0, "MyType"); 
    qmlEngine->rootContext()->setContextProperty("testObj", new MyType()); 

Ben testObj küresel nesne kullanın veya MyType QML bileşeni oluşturabilir. Ancak, bazı javascript kodlarında Q_INVOKABLE C++ yönteminden bir dönüş türü olarak kullanamıyorum.

cevap

2

Evet, QVariant o inşaatta özel sınıf için gitmek yoludur. Sınıfınızı kaydettiğinizden emin olun.

söyleniyor

olarak, özel türü için yerine Q_PROPERTY kullanarak düşünebilirsiniz sonra bile bir işlev çağrısı olmadan bu erişebilir. Yönteme özel parametrelere ihtiyacınız varsa ve kodu yeniden düzenleyemiyorsanız, bu açıkça bir seçenek değildir.

+0

çok teşekkürler. O zaman QVariant ile deneyeceğim. Ayrıca, bunun yerine Q_PROPERTY kullanmanın önerisi için teşekkürler. Benim durumumda, yöntem çağrısı bir nesneyi almaktır, böylece bir özellik mükemmel bir anlam ifade eder. Teşekkürler! – Korchkidu

+0

Belgelere göre, özel C++ türlerini Q_INVOKABLE yönteminden QML'ye döndürmek mümkün olmalıdır. Bu mümkün mü yoksa belgelerindeki bir hata mı? – Korchkidu

+0

@Korchkidu: Eğer türü doğru bir şekilde kaydederseniz, bence mümkündür. – lpapp

1

bu mümkündür ama bir arayüz olarak özel tip tanımlamanız gerekir. senin ana() işlevinde tüm

İlk:

Şimdi
qmlRegisterInterface<MyType>("MyType"); 

Bir nesne oluşturmak ve bir Q_INVOKABLE bir işaretçi dönmek geçebilirsiniz:

MyType* example = new MyType(parent); 
return example; 

Not:, üst nesnenin üst öğeyle birlikte silinmesini (bellek sızıntılarını önlemek için) sağlamak için üst öğeyi özel QObject öğenize aktarmak yararlı olabilir.

+0

nullptr ebeveyni sağlanırsa, qml kodunda kapsam dışına çıktığında nesne silinir, böylece bellek sızıntısı da olmaz. Gerçek bir ebeveyn sağlanırsa, nesne ebeveyniyle birlikte silinir. Ancak, bu sadece benim denemeye dayanıyor; Bu davranışla ilgili herhangi bir garanti bulamadım. – pepan

İlgili konular