Làm cách nào để xây dựng giao diện người dùng đồ họa trong C ++? [đóng cửa]


270

Tất cả các chương trình C ++ của tôi cho đến nay đều sử dụng giao diện dòng lệnh và ngôn ngữ duy nhất tôi có kinh nghiệm là PHP không hỗ trợ GUI.

Tôi bắt đầu từ đâu với lập trình giao diện người dùng đồ họa trong C ++? Làm thế nào để tôi tạo một cái?


4
Nó phụ thuộc. Bạn đang nhắm mục tiêu loại hệ điều hành nào? Nhiều khung GUI là dành riêng cho hệ điều hành.
Michael Ratanapintha

3
HĐH / nền tảng gì? Hoặc, nếu bạn quan tâm đến việc viết các ứng dụng GUI đa nền tảng, vui lòng nói như vậy - những điều này tạo ra sự khác biệt lớn cho C ++ ...
Shog9

3
PHP DOES hỗ trợ viết chương trình GUI. Không có lý do gì bạn không thể chạy các chương trình PHP từ dòng lệnh và có các thư viện gui như PHP-GTK gtk.php.net và PHP-Qt php-qt.org có thể giúp bạn cũng có thể đánh giá lý do tại sao bạn cần c ++. Viết GUI bằng c ++ khó hơn so với nhiều ngôn ngữ khác và bạn có thể gói mã c ++ của mình vào các thư viện có thể gọi được từ Python hoặc C # hoặc PHP hoặc mã hóa GUI dễ dàng hơn một chút.
kibibu

6
Câu hỏi của bạn rất rộng đến nỗi tôi nghĩ rằng bạn không chỉ muốn tên của bộ công cụ hoặc thậm chí chỉ là một số hướng dẫn. Bạn muốn một số cuốn sách , những cuốn sách cung cấp cho bạn nhiều hơn API hoặc ví dụ, thực sự cung cấp cho bạn các khái niệm. KTC đề xuất một số cách bên dưới, nhưng tôi muốn đề xuất, bất kỳ bộ công cụ nào bạn chọn để bắt đầu chơi, hãy đảm bảo tìm thấy một bộ công cụ bạn có thể đọc.
quark

6
"Viết GUI bằng c ++ khó hơn so với nhiều ngôn ngữ khác" Bạn dựa trên cơ sở nào để khẳng định điều này?
piotr

Câu trả lời:


163

Về cơ bản, hệ thống cửa sổ của hệ điều hành sẽ hiển thị một số lệnh gọi API mà bạn có thể thực hiện để thực hiện các công việc như tạo cửa sổ hoặc đặt nút trên cửa sổ. Về cơ bản, bạn nhận được một bộ các tệp tiêu đề và bạn có thể gọi các hàm trong các thư viện đã nhập đó, giống như bạn làm với stdlib và printf.

Mỗi hệ điều hành đi kèm với bộ công cụ GUI riêng, bộ tệp tiêu đề và lệnh gọi API và cách thức hoạt động riêng của chúng. Ngoài ra còn có các bộ công cụ đa nền tảng như GTK , QtwxWidgets giúp bạn xây dựng các chương trình hoạt động ở bất cứ đâu. Họ đạt được điều này bằng cách có cùng các lệnh gọi API trên mỗi nền tảng, nhưng cách triển khai khác nhau cho các hàm API đó gọi đến các lệnh gọi API hệ điều hành gốc.

Một điểm chung của tất cả chúng đều có điểm chung, khác với chương trình CLI, là một thứ gọi là vòng lặp sự kiện. Ý tưởng cơ bản có phần phức tạp và khó nén, nhưng về bản chất, điều đó có nghĩa là không có địa ngục nào xảy ra trong lớp chính / chức năng chính của bạn, ngoại trừ:

  • kiểm tra hàng đợi sự kiện nếu có bất kỳ sự kiện mới
  • nếu có, hãy gửi những sự kiện đó đến những người xử lý thích hợp
  • khi bạn đã hoàn tất, điều khiển năng suất trở lại hệ điều hành (thường với một số loại lệnh gọi chức năng "ngủ" hoặc "chọn" hoặc "nhường" đặc biệt)
  • sau đó hàm năng suất sẽ trở lại khi hệ điều hành hoàn thành và bạn có một vòng lặp khác.

Có rất nhiều tài nguyên về lập trình dựa trên sự kiện. Nếu bạn có bất kỳ kinh nghiệm nào với JavaScript, thì đó cũng là một ý tưởng cơ bản, ngoại trừ bạn, người viết kịch bản không có quyền truy cập hoặc kiểm soát chính vòng lặp sự kiện hoặc những sự kiện nào có, công việc duy nhất của bạn là viết và đăng ký trình xử lý.

Nhìn chung, bạn nên nhớ rằng lập trình GUI cực kỳ phức tạp và khó khăn. Nếu bạn có tùy chọn, việc tích hợp một máy chủ web nhúng vào chương trình của bạn và có giao diện dựa trên HTML / web thực sự dễ dàng hơn nhiều. Một ngoại lệ mà tôi đã gặp phải là của Apple Cocoa + Xcode + xây dựng giao diện + hướng dẫn mà làm cho nó dễ dàng với môi trường dễ tiếp cận nhất đối với những người mới đến lập trình GUI mà tôi đã nhìn thấy.


" Thật sự dễ dàng hơn nhiều khi chỉ tích hợp một máy chủ web nhúng vào chương trình của bạn và có giao diện dựa trên html / web. " Điều đó phụ thuộc. Nếu bạn muốn làm những thứ ưa thích (giao diện người dùng phức tạp, điều khiển tùy chỉnh, hình động, v.v.), vâng. Nếu bạn chỉ đơn giản muốn có một GUI thông thường (với các điều khiển thông thường và cảm giác tự nhiên), thì không.
Acorn

167

Có rất nhiều thư viện GUI di động miễn phí , mỗi thư viện đều có điểm mạnh và điểm yếu riêng:

Đặc biệt Qt có các hướng dẫn và công cụ tuyệt vời giúp bạn bắt đầu. Thưởng thức!

Tuy nhiên, lưu ý rằng bạn nên tránh chức năng cụ thể của nền tảng như API Win32 hoặc MFC. Điều đó ràng buộc bạn một cách không cần thiết trên một nền tảng cụ thể mà hầu như không có lợi ích.


25
Cá nhân, tôi nghĩ rằng lập trình cho API Win32 là đẹp. Tôi thích nó nhiều hơn là sử dụng Qt, và bản thân nó là một lợi ích. Có lẽ đó chỉ là tôi.
mrduclaw

6
Kinh nghiệm cá nhân của tôi là hoàn toàn ngược lại. API Win32 gây rắc rối cho tôi hơn bất kỳ API nào khác.
vog

17
@mrduclaw, "Tôi nghĩ lập trình cho API Win32 là đẹp". Tôi TRY bằng mọi giá để viết mã di động. (xin lưu ý rằng tôi đã sử dụng từ "thử" vì có ngoại lệ ...) Làm thế nào để viết mã không di động được coi là "đẹp"?
Trevor Boyd Smith

11
@Trevor Boyd Smith: Tôi cho rằng những mục tiêu khác nhau. Hầu như không có mã nào tôi từng viết một cách chuyên nghiệp có thể có thể là đa nền tảng nên điều đó không bao giờ là vấn đề đối với tôi.
mrduclaw

1
Câu hỏi đáng giá triệu đô la là những kẻ tạo ra các huấn luyện viên trò chơi chỉ cung cấp exe nhỏ và các chương trình của họ có giao diện người dùng đẹp, vì vậy tôi tự hỏi làm thế nào họ xây dựng giao diện người dùng mà họ không cung cấp cho những người bên thứ ba này?
dùng889030

74

Thuật toán độc lập của hệ điều hành " Tạo các ứng dụng GUI trong C ++ theo ba bước ":

  1. Cài đặt Qt Creator

    nhập mô tả hình ảnh ở đây

  2. Tạo dự án mới (Ứng dụng Qt Widgets)

    nhập mô tả hình ảnh ở đây

  3. Xây dựng nó.

Xin chúc mừng, bạn đã có GUI đầu tiên của mình trong C ++.

Bây giờ bạn đã sẵn sàng để đọc rất nhiều tài liệu để tạo ra thứ gì đó phức tạp hơn ứng dụng GUI "Hello world".


Trước đây, tôi gặp rắc rối với các GUI khác không đủ thân thiện với người mới bắt đầu. Nhưng, Qt có một số hướng dẫn tuyệt vời. Cảm ơn bạn đã giới thiệu!
JD

23

Đưa ra nhận xét về "nói Windows XP làm ví dụ", thì các tùy chọn của bạn là:

  • Tương tác trực tiếp với hệ điều hành thông qua API của nó, điều mà đối với Microsoft Windows là bất ngờ gọi API Windows . Tham chiếu chính xác cho WinAPI là trang web MSDN của Microsoft . Hướng dẫn dành cho người mới bắt đầu trực tuyến phổ biến cho điều đó là Hướng dẫn lập trình API Win32 củaForg . Cuốn sách kinh điển cho cuốn sách đó là Lập trình Windows của Charles Petzold , Ấn bản thứ 5 .

  • Sử dụng một nền tảng (cả về hệ điều hành và trình biên dịch) thư viện cụ thể như MFC , bao bọc WinAPI thành lớp C ++. Tham chiếu cho điều đó một lần nữa là MSDN. Một cuốn sách kinh điển cho điều đó là Lập trình Windows của Jeff Prosise với MFC, Phiên bản 2 . Nếu bạn đang sử dụng CodeGear C ++ Builder, thì tùy chọn ở đây là VCL .

  • Sử dụng thư viện đa nền tảng như GTK + (trình bao bọc C ++: gtkmm ), Qt , wxWidgets hoặc FLTKbao bọc API của hệ điều hành cụ thể. Ưu điểm của những điều này là nói chung, chương trình của bạn có thể được biên dịch cho các HĐH khác nhau mà không phải thay đổi mã nguồn. Như đã được đề cập, mỗi người đều có điểm mạnh và điểm yếu riêng. Một cân nhắc khi chọn cái nào sẽ sử dụng là giấy phép của nó. Đối với các ví dụ đã cho, GTK + & gtkmm là giấy phép theo LGPL, Qt thuộc các giấy phép khác nhau bao gồm tùy chọn độc quyền, wxWidgets thuộc Giấy phép wxWindows của riêng mình (với tên đổi tên thành Giấy phép wxWidgets) và FLTK thuộc ngoại lệ LGPL. Để tham khảo, hướng dẫn và hoặc sách, hãy tham khảo trang web của mỗi người để biết chi tiết.


9
MFC là ác. Tôi muốn sử dụng API WIN nếu tôi không có lựa chọn nào khác.
the_drow


18

Vì tôi đã ở nơi bạn đang ở ngay bây giờ, tôi nghĩ rằng tôi có thể "trả lời" bạn.

Thực tế là không có cách dễ dàng để tạo GUI. GUI phụ thuộc rất nhiều vào mã cụ thể của nền tảng và hệ điều hành, đó là lý do tại sao bạn nên bắt đầu đọc tài liệu về nền tảng / hệ điều hành mục tiêu của mình trên các API quản lý cửa sổ. Điều tốt là: có rất nhiều thư viện giải quyết những hạn chế và sự khác biệt về kiến ​​trúc trừu tượng trong một API đa nền tảng duy nhất. Những người được đề xuất trước đây, GTK và Qt, là một số trong những thư viện này.

Nhưng ngay cả những điều này là một chút quá phức tạp, vì rất nhiều khái niệm mới, kiểu dữ liệu, không gian tên và các lớp được giới thiệu, tất cả cùng một lúc. Vì lý do này, họ sử dụng để đi kèm với một số trình soạn thảo GUI WYSIWYG. Họ khá nhiều làm cho phần mềm lập trình với GUI có thể.

Tóm lại, cũng có những "môi trường" không miễn phí để phát triển GUI như Visual Studio từ Microsoft. Đối với những người có nền tảng trải nghiệm Delphi , Visual Studio có thể quen thuộc hơn. Ngoài ra còn có các lựa chọn thay thế miễn phí cho môi trường Visual Studio đầy đủ được cung cấp từ Microsoft: Visual Studio Express , quá đủ để bắt đầu phát triển GUI.


15

Tôi tìm thấy một trang web với hướng dẫn "đơn giản": http://www.winprog.org/tutorial/start.html


8
Điều này giới thiệu API Win32, một cách tiếp cận cấp thấp để lập trình GUI gắn kết bạn với nền tảng Windows. Tôi sẽ không đề nghị điều đó.
vog

17
Đó là một lựa chọn hợp lệ. Tôi đồng ý rằng nó có thể không phải là nơi tốt nhất để bắt đầu, nhưng nó không xứng đáng để bỏ phiếu.
Emil H

1
Tôi biết đây không phải là giải pháp lý tưởng nhưng nó giúp tìm hiểu cách hệ thống gui trong Windows hoạt động. Tôi đã đọc hướng dẫn này một vài năm trước và bây giờ tôi biết vòng lặp thông báo là gì và cách thức hoạt động. Khi làm việc với winforms trong .net, kiến ​​thức này có thể có ích.
ZippyV

7
Nếu bạn định viết các ứng dụng máy tính để bàn, không có gì thay thế để biết HĐH thực sự kết xuất và tương tác với người dùng như thế nào. Nếu bạn chỉ sử dụng một thư viện mà không hiểu các nguyên tắc cơ bản thì bạn sẽ không bao giờ thực sự hiểu những gì đang xảy ra. Học một chút về lập trình gui win32 cấp thấp sẽ tốn thời gian.
Jim ở Texas

@Jim Ở Texas: Tôi đồng ý, nhưng "chút mức độ thấp" này nên được học sau những điều cơ bản, vì vậy tôi vẫn thấy đề xuất đó không phù hợp cho người mới bắt đầu.
vog

3

Thật dễ dàng để tạo một .NET Windows GUI trong C ++.

Xem hướng dẫn sau từ MSDN . Bạn có thể tải xuống mọi thứ bạn cần (Visual C ++ Express) miễn phí .

Tất nhiên bạn tự ràng buộc mình với .NET, nhưng nếu bạn chỉ chơi xung quanh hoặc chỉ cần một ứng dụng Windows thì bạn sẽ ổn (hầu hết mọi người vẫn có Windows ... cho đến bây giờ).


3

Tôi sử dụng FLTK vì Qt không miễn phí. Tôi không chọn wxWidgets , vì thử nghiệm đầu tiên của tôi với một Hello, World đơn giản ! chương trình đã tạo ra một tệp thực thi 24 MB, FLTK 0,8 MB ...


4
Do thay đổi giấy phép QT, tôi dự định chuyển sang QT
pernecker

2
Chương trình wxWidgets của riêng tôi là 5,9 Mb, ngay cả với tất cả các thư viện được liên kết bên trong
msangel
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.