2013-08-13 65 views
7

Xem xét trường hợp GUI đơn giản hiển thị đầu ra của tính toán khá phức tạp.QML trong ứng dụng C++ hoặc ngược lại

Bây giờ, tôi muốn viết GUI đẹp, tùy chỉnh sử dụng QML.
Tôi cũng muốn viết ứng dụng nền của mình trong QT C++.

Tôi đang ngồi ở phía trước của tài liệu QT và tự hỏi nếu tôi
1) nên viết một ứng dụng QML và bằng cách nào đó nhúng C lớp học của tôi ++ trong đó (đó là hoàn toàn có thể) hoặc nếu tôi
2) nên viết một ứng dụng C++ và bằng cách nào đó nhúng GUI QML trong đó và thay đổi các thuộc tính QML từ các lớp học của tôi (đó là một lần nữa có thể)

tôi đã viết tất cả mọi thứ trong C++ sử dụng QT Widgets cho GUI. Tôi chỉ muốn chuyển GUI sang QML và giữ các lớp C++ mặc dù tôi sẵn sàng viết lại giao diện cho GUI.

thể Anser:

Các giải pháp rõ rệt dưới đây đề nghị giữ C++ lớp và giao diện GUI độc quyền thông qua tín hiệu và khe. Vì vậy, về cơ bản tôi đã kết thúc với một main.cpp mà instantiates tầng lớp lao động chính của tôi và hiển thị giao diện QML như thế này:

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

sau đó tôi đã thêm myClass và đã cho tôi một đối tượng để thực hiện kết nối:

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

Khi triển khai các khe và tín hiệu trong các lớp C++, bạn phải sử dụng các đối tượng QVariant để truyền dữ liệu. Tệp QML sau đó triển khai SIGNALS, ví dụ: cho các nút được nhấp và SLOTS để nhận dữ liệu hiển thị.

Đây chính là điều tôi mong đợi. Sự thay đổi duy nhất đối với mã không phải GUI của tôi là thực hiện tất cả các tương tác thông qua SIGNALS và SLOTS. Bây giờ tôi thậm chí có thể sử dụng cả GUI (QML/Widgets) cho ứng dụng của tôi.

+1

Tôi đã thêm câu trả lời toàn diện. Tôi cũng giải thích tại sao đây là một câu hỏi hay với giải pháp có giá trị. – HWende

+0

Liên quan: [Qt Designer C++ hoặc QML cho GUI] (http://stackoverflow.com/q/4610073/514235) – iammilind

Trả lời

7

Chỉ cần viết logic cốt lõi của bạn trong C++, giao tiếp với tín hiệu và khe, và bạn có thể sử dụng cùng một thành phần với các tiện ích và cũng với QML.

Nó không phải là khoa học tên lửa, logic C++ cho phép sử dụng với C++ và QML, JS logic - chỉ QML. C++ và API Qt là giải pháp âm thanh hơn, bởi vì từ JS bạn không thực sự có quyền truy cập vào nhiều chức năng của API Qt, chỉ có một vài phương thức được "chuyển" vào thế giới QML. Nhưng tất cả các thùng chứa dữ liệu hiệu suất cao và bản thân hiệu suất thực hiện đều nằm trong C++.

Nếu bạn chỉ cần hiển thị kết quả và bàn điều khiển không đủ tốt, tôi muốn giữ QtWidgets hơn, vì việc thêm mô-đun khai báo làm chậm quá trình biên dịch xuống đáng kể. Module widget bây giờ là độc lập, vì vậy bạn đang bổ sung thêm module "extra" ngay cả với QtWidgets (trong Qt4 nó là một phần của QtGui) nhưng nó nhẹ hơn.Sau khi bạn sử dụng các widget để tạo mẫu cho logic lõi của mình, bạn có thể triển khai một giao diện QML và chỉ cần móc nối các tín hiệu/khe/thuộc tính hiện có và các ràng buộc bằng cách sử dụng chúng.

Và không, bạn không nhúng QML vào các lớp C++, đó là cách khác, C++ là lớp cấp thấp hơn, được sử dụng để tạo các thành phần QML. Đối với sự khởi tạo thực tế, bạn có thể thực hiện cả hai cách - nếu bạn đăng ký lớp cơ sở QObject cho công cụ QML, bạn có thể khởi tạo nó trong QML. Hoặc bạn có thể khởi tạo lớp trong C++ và chỉ làm cho nó có sẵn trong ngữ cảnh QML - nó không thực sự quan trọng. Nếu bạn cần một đối tượng duy nhất, bạn tốt hơn khởi tạo nó trong C++ trong hàm main() và làm cho nó sẵn sàng trong ngữ cảnh QML, nếu nó là thành phần bạn dự định khởi tạo rất nhiều - sau đó tạo thành phần QML.

Bạn có thể tạo mẫu lõi logic bằng JS trong QML và sau đó chuyển nó sang C++ nếu bạn muốn. Có vẻ như gấp đôi nỗ lực, nhưng nếu bạn làm cho giường của bạn đúng thì nó thực sự là một sự gia tăng năng suất, bởi vì prototyping nhanh hơn nhiều trong QML, việc bắt lỗi là an toàn hơn nhiều và nhiều thông tin hơn, và nếu bạn tạo API tốt, hãy chuyển mã JS đến C++ thường là một mối phiền toái nhỏ - thay thế một số var s bằng các loại bê tông, thay thế một số . bằng -> và các nội dung tương tự.

Bất kỳ "tính toán phức tạp nào" mà bạn thực sự muốn cuối cùng thực hiện trong C++. Mỗi khi tính toán được hoàn thành, bạn có thể phát ra nó đơn giản như một tín hiệu, và tự động hiển thị kết quả cho bất kỳ khe nào mà tín hiệu được kết nối, là trong một widget hoặc trong QML, hoặc thậm chí cả hai cùng một lúc.

+0

Có vẻ như bạn đã đúng. Tôi đã tìm ra cách để làm điều đó trong một bản demo nhỏ và nó chính xác phù hợp với nhu cầu của tôi. Việc trao đổi thông tin với các tín hiệu (ví dụ: từ các tương tác GUI) và các khe cắm rất dễ dàng và tôi thích rằng tôi có thể "cắm" nền cho các GUI khác nhau theo cách này. Các tập tin QML cung cấp một vài khe cắm để nhận được tất cả mọi thứ để hiển thị và đó là nó. Cảm ơn! – HWende

+0

@HWende - bạn được hoan nghênh, hãy xem bản chỉnh sửa cuối cùng của tôi liên quan đến sự khởi tạo thực tế của lớp C++. Xem câu trả lời này nếu bạn cần trợ giúp về việc khởi tạo và đăng ký các lớp C++ cho QML: http://stackoverflow.com/questions/16002310/qml-how-to-draw-multiple-rectangulars-in-random-places/16004056# 16004056 – dtech

0

Điều này rất dựa trên ý kiến. Không thể trả lời 'đúng'. Đối với tôi nó là 'dễ dàng hơn' để viết trong QML và 'mở rộng' qml với các plugin Qt. Đó là bởi vì tôi đã làm một dự án lớn theo cách này. Những người khác có thể có kinh nghiệm khác và có thể vì điều đó giống như một cách tiếp cận khác. Không có 'câu chuyện cuộc sống' nào của chúng tôi có thể giúp bạn nhiều.

+0

Rất có khả năng một phương pháp sẽ dễ dàng hơn khi tôi không có kinh nghiệm theo cả hai cách. Một phương pháp có lẽ là nhiều hơn "người mới bắt đầu thân thiện" và một người biết cả hai phương pháp có thể biết cái nào. Thử một lần đi! – HWende

+0

Nó không phải là ý kiến ​​dựa trên, nó là kinh nghiệm, logic và lý do dựa. Một trong những lựa chọn rõ ràng là phản tác dụng và cách tiếp cận xấu, phương pháp khác là thực hành tốt, được khuyến nghị. -1 để ghi nhãn nó bằng "không có câu trả lời đúng có thể" ... – dtech

+0

Nếu bạn nói như vậy. Ý kiến ​​của tôi: Vô nghĩa. Mọi dự án đều khác nhau. Mỗi gui là khác nhau. Để giải thích ở đây khi một cách tiếp cận tốt hơn so với cách tiếp cận khác có thể lấp đầy sách. Bạn có giao diện người dùng lớn và phức tạp không? Chỉ có một vài điều khiển tiêu chuẩn? Cách tiếp cận nào là đúng đắn phải được quyết định mới cho mọi dự án. Nó không chỉ phụ thuộc vào lý do kỹ thuật thuần túy mà còn dựa trên trải nghiệm kỹ thuật của nhóm của bạn. Họ có kinh nghiệm nhiều hơn trong C++ hoặc trong qml không? Họ có thời gian để đi vào các khái niệm mới không? – Greenflow

Các vấn đề liên quan