2013-08-13 36 views
7

Oldukça ayrıntılı bir hesaplamanın çıktısını görüntüleyen basit bir GUI örneğini düşünün.QML veya tam tersi

Şimdi QML kullanarak güzel ve özel bir GUI yazmak istiyorum.
Ayrıca arka plan uygulamamı QT C++'a yazmak istiyorum.

Ben QT belgelerine önünde otururken ve merak ediyorum eğer
1) QML ve bir şekilde kesinlikle mümkün olduğu (o benim C++ sınıfları gömmek uygulamayı) ya da eğer yazmalısınız ben
2) zaten GUI için QT Widget'lar kullanarak C++ şeyi yazdım

) yine mümkün olduğu (a C++ uygulama yazmak ve her nasılsa o QML GUI gömmek ve benim sınıfları den QML özelliklerini değiştirmek gerekir. GUI arayüzünü yeniden yazmaya istekli olmama rağmen GUI'yi QML'ye taşımak ve C++ sınıflarını tutmak istiyorum.

mümkün anser:

belirgin çözelti aşağıdaki C++ sınıfları tutulması önerilmektedir ve sinyalleri ve yuvaları sayesinde özel GUI arabirimi.

QQuickView viewer; 
viewer.setSource(QUrl("./qml/main.qml")); 
viewer.show(); 

sonra Sınıfım eklendi ve bana bağlantılarını yapmak üzere bir nesne var:

MyClass myClass; 
QQuickItem* item = viewer.rootObject(); 
QObject::connect(item, SIGNAL(buttonClicked()), &myClass, SLOT(mySlot())); 
QObject::connect(&myClass, SIGNAL(mySignal(QVariant)), item, SLOT(updateGUI(QVariant))); 
Böylece temelde benim ana işçi sınıfını başlatır ve bunun gibi QML GUI görüntüleyen bir main.cpp ile sona erdi

C++ sınıflarında yuvaları ve sinyalleri uygularken, verileri aktarmak için QVariant nesnelerini kullanmalısınız. QML dosyası daha sonra SIGNALS'i uygular örn. Görüntülenecek verileri almak için tıklanan düğmeler ve SLOTS için.

Bu tam olarak ne için umuyordum. GUI olmayan kodumdaki tek değişiklik, SIGNALS ve SLOTS aracılığıyla tüm etkileşimleri yapmaktı. Artık uygulama için hem GUI'leri (QML/Widgets) kullanabilirim.

+1

Kapsamlı bir yanıt ekledim. Bunun neden değerli bir çözümle iyi bir soru olduğunu açıkladım. – HWende

+0

Related: [GUI için Qt Designer C++ veya QML] (http://stackoverflow.com/q/4610073/514235) – iammilind

cevap

7

Sadece C++ 'daki temel mantığınızı yazın, onu sinyal ve yuvalarla bağlayın ve aynı bileşeni widget'larla ve ayrıca QML ile kullanabilirsiniz.

Bu roket bilimi değildir, C++ mantığı C++ ve QML, JS mantığı ile kullanıma izin verir - sadece QML. C++ ve Qt API'si daha sağlam bir çözümdür, çünkü JS'den Qt API'larının bu kadar işlevselliğine gerçekten erişemezsiniz, QML dünyasına yalnızca birkaç yöntem "taşınır". Ancak tüm yüksek performanslı veri kapları ve yürütme performansının kendisi C++.

Yalnızca sonuçları görüntülemeniz gerekiyorsa ve konsol yeterince iyi değilse, bildirim modülünü eklemek derlemeyi önemli ölçüde yavaşlattığından, QtWidgets'a devam etmeyi tercih ederim. Widget modülü şimdi bağımsızdır, bu yüzden QtWidgets ile (Qt4'te QtGui'nin bir parçasıydı) "ekstra" modülü ekliyorsunuz ama daha hafif.Çekirdek mantığınızı prototiplemek için widget'ları kullandıktan sonra, bir QML arayüzü uygulayabilir ve bunları kullanarak mevcut sinyal/yuva/özellik ve bağlamalara bağlayabilirsiniz.

Ve hayır, C++ sınıflarını Q ++ sınıflarına katışmazsınız, bu diğer yöntemdir, C++, QML bileşenleri oluşturmak için kullanılan daha düşük düzeyli katmandır. Asıl örnekleme için her iki yöne de gidebilirsiniz - QML motoruna bir QObject tabanlı sınıf kaydederseniz, bunu QML'de başlatabilirsiniz. Veya sınıfı C++ ile başlatabilir ve sadece QML bağlamında kullanılabilir hale getirebilirsiniz - gerçekten önemli değil. Tek bir nesneye ihtiyacınız varsa, C++ içinde main() işlevinde daha iyi bir örnek oluşturup, QML bağlamında kullanılabilir hale getirin, çok fazla örnek oluşturmayı amaçlıyorsanız, bir QML bileşeni oluşturun.

Temel mantığı, QML'deki JS ile prototip ve daha sonra isterseniz C++ 'ya taşıyabilirsiniz. İki katı çabaya benziyor, ancak yatağınızı doğru yaparsanız, bu aslında bir verimlilik artışıdır, çünkü QML'de prototipleme çok daha hızlıdır, hataları yakalamak daha güvenli ve bilgilendiricidir ve API'nizi iyi yaparsanız, JS kodunu taşıyın C++ genellikle küçük bir sıkıntı - bazı var s beton türleri ile değiştirin, bazı . yerine -> ve bunun gibi şeyler.

Nihai olarak C++ uygulamasında yapmak istediğiniz "ayrıntılı hesaplamalar". Hesaplama her tamamlandığında, bir sinyal olarak gönderebilir ve sonucu, bir widget veya QML'de veya hatta her ikisinde birden, sinyalin bağlı olduğu yuvaya otomatik olarak gösterebilirsiniz.

+0

Haklı olduğunuzu görünüyor. Küçük bir demoda nasıl yapılacağını anladım ve ihtiyacım olana tam olarak uyuyor. Sinyaller (ör., GUI etkileşimlerinden) ve yuvalarla bilgi değişimi kolaydır ve arka planı farklı GUI'lere bu şekilde "takabilmeyi" çok isterim. QML dosyası, görüntülenecek her şeyi almak için birkaç yuva sağlar ve budur. Teşekkürler! – HWende

+0

@HWende - Bir şey değil, C++ sınıfının asıl örneğiyle ilgili son düzenlemeye bakın. C++ sınıflarının QML'ye kayıt edilmesinde ve kayıt edilmesinde yardıma ihtiyacınız varsa, bu cevaba bakın: http://stackoverflow.com/questions/16002310/qml-how-to-draw-multiple-rectangulars-in-random-places/16004056# 16004056 – dtech

0

Bu görüşe dayalıdır. 'Doğru' yanıt mümkün değil. Benim için QML 'ye' Qml 'yazmak ve' Qml eklentileri ile 'uzatmak' kolay. Çünkü bu şekilde büyük bir proje yaptım. Diğerleri başka deneyimlere sahip olabilir ve bundan dolayı farklı bir yaklaşım gibi olabilir. Hayat hikayelerimizin hiçbiri size pek yardımcı olamaz.

+0

İki yöntemde hiç deneyimim olmadığında, bir yöntemin daha kolay gerçekleştirilmesi olasıdır. Bir yöntem muhtemelen daha "başlangıç ​​dostu" ve her iki yöntemi bilen biri hangisinin olduğunu biliyor olabilir. Hadi bir deneyelim! – HWende

+0

Düşünce temelli değildir, deneyim, mantık ve mantık temelidir. Seçeneklerden biri açıkça karşı üretken ve kötü bir yaklaşım, diğeri iyi, önerilen bir uygulamadır. -1 "doğru cevap yok" ile etiketlemek için ... – dtech

+0

Eğer öyle diyorsan. Benim düşüncem: Anlamsız. Her proje farklıdır. Her gui farklıdır. Bir yaklaşımın diğerinden daha iyi olduğu zamanları burada açıklayabilmek için kitapları doldurabiliriz. Büyük ve karmaşık bir kullanıcı arayüzünüz var mı? Sadece birkaç standart kontrol? Her proje için hangi yaklaşımın doğru olduğuna karar vermeliyiz. Sadece saf teknik nedenlere değil, aynı zamanda ekibinizin teknik deneyimine de bağlıdır. C++ veya qml'de daha mı deneyimliyorlar? Yeni kavramlara girmek için zamanları var mı? – Greenflow

İlgili konular