2013-08-13 12 views
7

Rozważmy przypadek prostego GUI wyświetlającego wyniki dość skomplikowanych obliczeń.QML w aplikacji C++ lub odwrotnie

Teraz chciałbym napisać ładny, niestandardowy GUI, używając QML.
Chciałbym również napisać moją aplikację w tle w QT C++.

siedzę przed dokumentacji QT i zastanawiam gdybym
1) Należy napisać aplikację QML i jakoś osadzić moich klas C++ w nim (co jest absolutnie możliwe), czy ja
2) powinien napisać C++ aplikację i jakoś osadzić QML GUI w nim i modyfikowanie właściwości QML z moich klas (co jest znowu możliwe)

pisałem już wszystko w C++ przy użyciu QT widżety dla GUI. Chcę tylko przenieść GUI do QML i zachować klasy C++, mimo że jestem gotów przepisać interfejs GUI.

Możliwa anser:

Zaznaczony rozwiązanie poniżej sugeruje utrzymywanie klas C++ i interfejs GUI wyłącznie poprzez mechanizm sygnałów i slotów. Więc w zasadzie skończyło się z main.cpp że instancję mój główny klasę robotniczą i wyświetla GUI QML takiego:

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

potem dodaną myClass i got me obiektu do zrobienia połączenia:

MyClass myClass; 
QQuickItem* item = viewer.rootObject(); 
QObject::connect(item, SIGNAL(buttonClicked()), &myClass, SLOT(mySlot())); 
QObject::connect(&myClass, SIGNAL(mySignal(QVariant)), item, SLOT(updateGUI(QVariant))); 

Podczas implementacji gniazd i sygnałów w klasach C++ należy użyć obiektów QVariant do przesłania danych. Plik QML następnie implementuje SIGNALS np. dla klikniętych przycisków i SZCZOTEK do odbioru danych do wyświetlenia.

To jest dokładnie to, na co miałem nadzieję. Jedyną zmianą w moim kodzie nie GUI było wykonanie wszystkich interakcji za pośrednictwem SYGNAŁÓW i SZTUR. Teraz mogę korzystać z obu GUI (QML/Widgets) dla mojej aplikacji.

+1

Dodałem wyczerpującą odpowiedź. Wyjaśniłem również, dlaczego jest to dobre pytanie z cennym rozwiązaniem. – HWende

+0

Powiązane: [Qt Designer C++ lub QML dla GUI] (http://stackoverflow.com/q/4610073/514235) – iammilind

Odpowiedz

7

Po prostu napisz swoją podstawową logikę w C++, połącz ją z sygnałami i gniazdami, a możesz użyć tego samego komponentu z widżetami, a także z QML.

To nie jest nauka rakietowa, logika C++ pozwala na użycie z C++ i QML, logika JS - tylko QML. C++ i Qt API to bardziej dźwiękowe rozwiązanie, ponieważ z JS tak naprawdę nie masz dostępu do tak dużej funkcjonalności API Qt, tylko kilka metod jest "przeniesionych" do świata QML. Ale wszystkie pojemniki danych o wysokiej wydajności i sama wydajność wykonania są w C++.

Jeśli potrzebujesz tylko wyświetlić wyniki, a konsola nie jest wystarczająco dobra, wolę zachować QtWidgets, ponieważ dodanie deklaratywnego modułu znacznie spowalnia kompilację. Moduł widżetów jest teraz niezależny, więc dodajesz moduł "ekstra" nawet z QtWidgets (w Qt4 był on częścią QtGui), ale jest lżejszy.Po użyciu widżetów do prototypowania głównej logiki, możesz następnie zaimplementować interfejs QML i po prostu podłączyć go do istniejących sygnałów/gniazd/właściwości i powiązań za ich pomocą.

I nie, nie osadzasz QML w klasach C++, jest na odwrót, C++ jest warstwą o niskim poziomie, używaną do tworzenia komponentów QML. Jeśli chodzi o rzeczywistą instancję, możesz przejść w obie strony - jeśli zarejestrujesz klasę opartą na QObject na silniku QML, możesz utworzyć ją w QML. Możesz też utworzyć instancję klasy w C++ i udostępnić ją tylko w kontekście QML - tak naprawdę nie ma to znaczenia. Jeśli potrzebujesz pojedynczego obiektu, lepiej stwórz go w C++ w funkcji main() i udostępnij go w kontekście QML, jeśli są to komponenty, które zamierzasz utworzyć dużo - następnie utwórz komponent QML.

Mogłabyś prototypować główną logikę z JS w QML i później przesłać ją do C++, jeśli chcesz. Wygląda na to, że wymaga to dwukrotnego wysiłku, ale jeśli poprawisz swoje łóżko, oznacza to wzrost produktywności, ponieważ prototypowanie jest o wiele szybsze w QML, złapanie błędów jest znacznie bezpieczniejsze i bardziej pouczające, a jeśli dobrze zrobisz swoje API, przeniesienie kodu JS do C++ jest zwykle drobną uciążliwością - zastąp niektóre typy var s, zamień niektóre . na -> i podobne.

Dowolne "skomplikowane obliczenia", które naprawdę CHCESZ ostatecznie wykonać w C++. Za każdym razem, gdy obliczenia są zakończone, możesz po prostu wyemitować je jako sygnał i automatycznie wyświetlić wynik do dowolnego gniazda, do którego podłączony jest sygnał, czy to w widgecie, czy w QML, czy nawet w obu naraz.

+0

Wygląda tak, jak masz rację. Wymyśliłem, jak to zrobić w małej wersji demonstracyjnej i dokładnie pasuje do mojej potrzeby. Wymiana informacji z sygnałami (na przykład z interakcji GUI) i gniazdami jest łatwa i podoba mi się, że mogę "podłączyć" tło do różnych GUI w ten sposób. Plik QML udostępnia kilka gniazd do odbioru wszystkiego do wyświetlenia i to wszystko. Dzięki! – HWende

+0

@HWende - zapraszam, zobacz moją ostatnią edycję dotyczącą faktycznego utworzenia klasy C++. Zobacz tę odpowiedź, jeśli potrzebujesz pomocy z instancją i rejestracją klas C++ w QML: http://stackoverflow.com/questions/16002310/qml-how-to-draw-multiple-rectangulars-in-random-places/16004056# 16004056 – dtech

0

To jest oparte na opiniach. Brak "prawdziwej" odpowiedzi. Dla mnie łatwiej jest pisać w QML i "rozszerzać" qml z wtyczkami Qt. To dlatego, że zrobiłem duży projekt w ten sposób. Inni mogą mieć inne doświadczenia i mogą z tego powodu korzystać z innego podejścia. Żadna z naszych "historii życia" nie może ci wiele pomóc.

+0

Jest bardzo prawdopodobne, że jedna metoda jest łatwiejsza do osiągnięcia, gdy nie mam żadnego doświadczenia w obie strony. Jedna metoda jest prawdopodobnie bardziej "przyjazna dla początkujących" i ktoś, kto zna obie metody, może wiedzieć, który z nich. Spróbujmy! – HWende

+0

Nie opiera się na opiniach, jest oparte na doświadczeniu, logice i rozumowaniu. Jedną z opcji jest wyraźnie przeciwne do zamierzonego i złe podejście, druga to dobra, zalecana praktyka. -1 dla oznaczenia go "nie ma prawdziwej możliwej odpowiedzi" ... – dtech

+0

Jeśli tak powiesz. Moja ocena: Nonsens. Każdy projekt jest inny. Każde gui jest inne. Aby wyjaśnić tutaj, kiedy jedno podejście jest lepsze, niż inne mogą wypełnić książki. Czy masz duży i skomplikowany interfejs użytkownika? Tylko kilka standardowych kontroli? Które podejście jest właściwe, należy podjąć decyzję dla każdego nowego projektu. Zależy to nie tylko od czysto technicznych przyczyn, ale także od doświadczenia technicznego twojego zespołu. Czy są bardziej doświadczeni w C++ lub w qml? Czy mają czas na nowe koncepcje? – Greenflow

Powiązane problemy