QT-C ++ so với C ++ chung và STL [đã đóng]


19

Gần đây đã cập nhật C ++ của tôi trên Ubuntu QQ. Tôi yêu khung Qt cho mọi thứ, đặc biệt là xây dựng GUI. Tôi đã trở nên khá quen thuộc với nó khi sử dụng PyQt trong vài năm qua.

Khi sử dụng PyQt, tôi gặp một số vấn đề rõ ràng hơn khi sử dụng C ++ với Qt: Qt có nhiều phần mở rộng cho C ++, cụ thể là Qt - QString chỉ là một ví dụ phổ biến, không đề cập đến việc thu gom rác tự động. Có thể viết các ứng dụng Qt bằng C ++ mà không biết nhiều về C ++ và STL.

Tôi có thể phải sớm quay lại thị trường việc làm và tôi muốn có thể xem xét các vị trí C ++ - nhưng tôi sợ ràng buộc bản thân quá nhiều với Qt sẽ hạn chế khả năng làm việc với C ++ chung, vốn đã từng rất ghê gớm nhưng bây giờ dài im lìm và rỉ sét.

Tôi có nên tránh Qt? Tôi có nên sử dụng WxWidgets hoặc GTK ++ để xây dựng GUI không?

Khung GUI tốt nhất để sử dụng cho phép / yêu cầu sử dụng nhiều nhất C ++ và STL là gì? Làm cách nào để tôi biến mình thành một lập trình viên C ++ dễ tiếp thị nhất khi nói đến các khung GUI, v.v.?

Câu trả lời:


15

Tôi sẽ không kiềm chế sử dụng Qt chỉ vì những lý do đó. Bạn không bắt buộc phải sử dụng tất cả các lớp tiện ích của Qt; đối với những cái thay thế STL, nhiều nhất bạn sẽ bị buộc phải sử dụng QString và, có thể, QStringList. Ngoài ra, thường có nhiều chương trình hơn GUI. Bạn luôn có thể sử dụng C ++ chung cho phần còn lại của chương trình và sử dụng Qt chỉ cho GUI.

Theo tôi, làm việc với STL là tìm hiểu thêm về cấu trúc dữ liệu cơ bản được sử dụng và mức độ phức tạp của chúng, và do đó, tại thời điểm nào bạn nên sử dụng mỗi container. Và khi nói đến lập trình C ++, điều đặc biệt là biết cách sử dụng tiêu đề <Thuật toán> rất cần thiết, cũng hoạt động trên các thùng chứa của Qt, vì chúng tương thích với STL.

Tôi không thấy nhiều tác hại khi sử dụng tất cả các tiện ích mở rộng mà Qt cung cấp, miễn là bạn biết (hoặc ít nhất có một ý tưởng chung về) cách chúng được triển khai trong nội bộ. Hãy chắc chắn rằng bạn biết rằng những thứ như Q_OB DỰ ÁN, TÍN HIỆU (), SLOT (), foreach (), không phải là phép thuật, mà là các macro mở rộng thành các câu lệnh C ++ hợp lệ. Ví dụ, không quá phức tạp để hiểu làm thế nào các lớp được chia sẻ ngầm và các mối quan hệ cha-con làm cho Qt cảm thấy giống Java hơn được triển khai. Bạn luôn có thể thử tạo lại một số chức năng trong một dự án riêng biệt để xem liệu bạn có thể làm điều đó với C ++ chung hay không, và sau đó không cảm thấy tệ khi sử dụng chúng trong Qt.

Ngoài ra, hãy xem các thư viện Boost. Chúng cung cấp các tiện ích bổ sung mà thư viện C ++ tiêu chuẩn không có, và là một cách thực sự tốt để đến gần hơn với C ++ chung, vì về cơ bản chúng tuân theo các quy ước tương tự như C ++ chung. Một số thư viện có các lớp templated khá phức tạp và chỉ đơn giản là cố gắng hiểu cách chúng hoạt động, bản thân nó là một nghiên cứu tốt trong C ++. Boost có nhiều tiện ích không thể tìm thấy trong Qt và các tiện ích khác triển khai các khái niệm tương tự hoặc tương tự như một số lớp của Qt và có thể được sử dụng thay thế chúng.

Nếu bạn tham gia vào thị trường việc làm làm việc với C ++, rất có thể bạn sẽ làm việc với Qt hoặc một khung công tác khác, tương tự như nó, sẽ có các lớp tiện ích riêng cố gắng làm cho C ++ đơn giản hơn.


4
+1 cho "Bạn luôn có thể sử dụng C ++ chung cho phần còn lại của chương trình và chỉ sử dụng Qt cho GUI."
Md Mahbubur Rahman

@MahbuburRAaman - vâng - đây là lời khuyên tuyệt vời. Chỉ sử dụng Qt cho GUI và những gì cần thiết để nối lại. Viết phần còn lại bằng Generic C ++, STL, Boost - các công cụ được sử dụng phổ biến.
Vector

5

Tôi đồng ý với hầu hết sự khen ngợi cao của Qt, nhưng câu hỏi đặt ra là khung GUI nào tốt nhất để sử dụng cho phép / yêu cầu sử dụng nhiều nhất C ++ và STL chung? Về mặt này, Qt là một bệnh tâm thần phân liệt nhỏ: nó sao chép các thùng chứa STL và thuật toán với các vòng xoắn của chính nó. Nó cũng cung cấp các container, khác với STL. Khả năng tương tác giữa Qt và STL không phải lúc nào cũng thuận buồm xuôi gió. Trong một số trường hợp phải mất một vài cuộc gọi chức năng để có được từ std::stringđến QStringvà ngược lại.

wxWidgets có một tùy chọn để xây dựng STL, sử dụng riêng các bộ chứa STL - không có vũ trụ song song với các thay thế được trồng tại nhà như trong trường hợp của Qt. Nó cũng biên dịch với trình biên dịch C ++ tiêu chuẩn mà không cần các phần mở rộng không chuẩn. Đây là một khung GUI chất lượng đáng để xem xét.

Bạn cũng có thể có giao diện gtkmm, đây là trình bao bọc C ++ xung quanh GTK +. Nó gần với việc thực hiện yêu cầu đầu tiên của bạn hơn Qt.


1
'wxWidgets có một tùy chọn cho bản dựng STL, sử dụng riêng các bộ chứa STL ...' - tôi hiểu - đây là điều quan trọng cần biết. 'Trong một số trường hợp, phải mất một vài lệnh gọi để chuyển từ std :: string sang QString' - đã hiểu - Tôi chưa điều tra về nó. Tôi hơi quen thuộc với GTK và Wx - nhưng Qt dường như tỏa sáng khi so sánh, ít nhất là theo quan điểm của tôi - C ++ không phải là ngôn ngữ đầu tiên của tôi - Tôi đến từ thế giới Clipper / Delphi và sau đó học C ++ vì tôi phải đối phó với Win 32s, v.v.
Vector

2

Tôi sẽ không lo lắng quá nhiều về việc không sử dụng các thư viện STL cụ thể như std :: string hoặc std :: iostream hoặc std :: vector. Tương đương QT có một hương vị khác nhau nhưng chúng không quá xa để tạo ra bất kỳ vấn đề.

Sự khác biệt thành ngữ hơn theo ý kiến ​​của tôi dường như là phong cách lập trình nặng về việc sử dụng newđể phân bổ. Mặc dù đối với chương trình QT, điều này có thể tốt cho phần Gui, nhưng ưu điểm của C ++ và RAII là, bạn thực sự có thể giữ nhiều dữ liệu trên ngăn xếp thay vì heap. Khi chuyển sang viết mã không phải GUI, bạn nên nhớ lại điều đó.


1
điểm tôi đã cố gắng thực hiện không phải là phân bổ heap nói chung là xấu, nó chỉ không phải là điều tốt nhất cho các biến cục bộ. Các lớp GUI có xu hướng sống lâu và được phân bổ tốt nhất trên heap, các biến cục bộ chỉ cần tạm thời sống tốt trên ngăn xếp. trong C # với Garbace Collection, chúng sẽ sớm bị phá hủy, vì vậy heap cũng không sao. Nhưng với new/deletecác cuộc gọi thủ công, điều này không dễ dàng và dễ bị lỗi. Trong các phần quan trọng (xử lý dữ liệu lớn) điều này có thể tạo ra sự khác biệt, đặc biệt là deletecác cuộc gọi có thể khá chậm.
wirrbel

1
đây không phải là vấn đề của 10000 Đối tượng UI nhưng đối với các cơ sở dữ liệu cây phức tạp với một triệu mục, v.v ... nơi mà trước đây có thể sử dụng các cách phân bổ thông minh hơn (Phân bổ hàng loạt hoặc nhiều lớp tăng cường được viết thông minh, v.v.). Kết luận: heap không tệ, nó phải được sử dụng thông minh. Cách Qt đôi khi không mở rộng cho các công cụ khác. Nó vẫn là một bộ công cụ tuyệt vời theo ý kiến ​​của tôi.
wirrbel

Vậy còn C ++ 11 thì sao? con trỏ thông minh, vv dường như sẽ làm giảm bớt nhiều mối quan tâm của bạn. Tôi chỉ bắt đầu lộn xộn với nó bây giờ. Như tôi đã nói, tôi đồng ý rằng Qt KICKS BUTT. Kế hoạch của tôi là sử dụng Qt cho GUI và làm bất cứ điều gì khác mà tôi có thể sử dụng C ++ 11 - có vẻ như sẽ tạo ra một lượng Boost tốt, ví dụ, lỗi thời và đóng lại ở một mức độ lớn giữa Java / C # và C ++ trường học cũ. Tôi có cảm giác (tại thời điểm này từ một khoảng cách thừa nhận) rằng sự kết hợp giữa Qt và C ++ 11 có thể là một người chiến thắng lớn.
Vector

2
Tôi nghĩ rằng bạn đã có quan điểm của tôi: Bạn có rất nhiều lựa chọn với C ++, với c ++ bạn phải chọn một cách khôn ngoan. Con trỏ thông minh, vv cũng có vấn đề. Chán ngấy với C #, bạn có thể xem dlang.org , nơi thực hiện nhiều điều tốt hơn (GCed).
wirrbel

Trong khi đó, tôi phải kết hợp một chuỗi công cụ hỗ trợ C ++ 11. Tôi sử dụng codelite ngay bây giờ - IDE rất hay - nhưng ngoài hộp (trình biên dịch GNU) thì nó không hỗ trợ 11, vì tôi vừa tìm ra ... Có lẽ tôi có thể cắm một trình biên dịch tuân thủ 11 vào nó. Sẽ không bắt đầu với D hoặc Boo, v.v. - như tôi đã nói, tôi có thể phải quay lại thị trường việc làm khá sớm và tôi muốn có ngôn ngữ chính cho thị trường, chứ không phải là 'một lần tắt'. RẤT NHIỀU công việc Python ngoài kia - quá tệ Tôi không thể chịu đựng được Python nữa!
Vector
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.