2012-08-04 12 views
6

Bir QML + Qt uygulaması yazıyorum. bir sınıf aşağıdaki gibi tanımlanır:C++ Modeli'ni QML'ye nasıl getirilir

class MainClass : public QObject 
{ 
    Q_OBJECT 

public: 
    rosterItemModel m_rosterItemModel; 
. 
. 
. 
} 

rosterItemModel modeli QAbstractListModel türetilmiş bir sınıftır. Ben MainClass bu fonksiyonu kullanarak bölümünü QML maruz:

qmlRegisterType<MainClass>("CPPIntegrate", 1, 0, "MainClass"); 

Şimdi QML bir ListView özelliği modellemek için MainClass bu modeli (m_rosterItemModel) atamak istiyoruz. Aşağıdaki yolları denedim ama bunların hiçbiri yararlı :(

  • Ben Q_PROPERTY kullanarak bir MÜLK'ün olarak m_rosterItemModel ilan etmeye çalıştık. ben yapamazdım o QAbstractListModel olduğunu söyledi çünkü o değil kopyalamaya karşı mümkün.
  • Ben MainClass bir Q_INVOKABLE işlevini kullanarak QML dosyasında m_rosterItemModel için bir işaretçi almaya çalıştı. Ama yararlı çok değildi.

birisi bana yardımcı olabilir mi?

cevap

6

Gerekli herhangi bir metatip kayıt olmamalıdır.

QQmlContext* context = view->rootContext(); //view is the QDeclarativeView 
context->setContextProperty("_rosterItemModel", &mainClassInstance->m_rosterItemModel); 

QML günlerde kullan: pointer ile

model: _rosterItemModel 

QObject en değil kopyalayıp constructible ve önemlidir, çünkü Tek ihtiyacınız setContextProperty arayıp pointer tarafından modelini geçmektir için Onları kopyalamak onların semantiklerini yine de (bir "kimliğine" sahip oldukları gibi) bozardı.

Modele doğrudan kayıt yaptırmanın alternatifi, ana sınıfın örneğini kaydettirmek ve Q_INVOKABLE kullanmaktır. MainClass In: QML yılında

context->setContextProperty("_mainInstance", mainClassInstance); 

:

Q_INVOKABLE RosterItemModel* rosterItemModel() const; 

mainClass bir örneğini kaydedilmesi (mainClassInstance yine bir işaretçi olarak kabul edilir)

model: _mainInstance.rosterItemModel() 
+0

I qmlRegisterType kullanarak QML için MainClass kayıtlı MainClass {id: mc} gibi bir örneği oluşturarak, MainClass sinyallerini ve yuvalarını QML'de kolayca kullanabilmeniz için. Her neyse. teşekkürler u :) – saeed

+2

Deneyimden, ikinci durumda da necassary'de model sınıfını kaydettiriyor gibi görünüyor: 'qmlRegisterType (" CPPIntegrate ", 1, 0," MainClass ");' Ayrıca, 'const' kullanarak değiştirici birlikte çalışmayı kırıyor gibi görünüyor. Son ilginç bit, daima başlığın Q_PROPERTY ve Q_INVOKABLE bildirimlerindeki tam ad alanı yeterliliği ile sınıfa başvurmaktır. Ayrıca, eğer bazı temel sınıf (QAbstractItemModel gibi) işaretçisini döndürmeyi düşünürse, birlikte çalışabilirlik tekrar başarısız olur, bu yüzden dikkat edin. – mlvljr

+0

mainClassInstance nasıl edinilir? – Brent81

İlgili konular