ฉันจะสร้างส่วนต่อประสานผู้ใช้แบบกราฟิกใน C ++ ได้อย่างไร [ปิด]


270

โปรแกรม C ++ ทั้งหมดของฉันจนถึงตอนนี้ใช้อินเตอร์เฟสบรรทัดคำสั่งและภาษาอื่น ๆ ที่ฉันมีประสบการณ์คือ PHP ซึ่งไม่รองรับ GUI

ฉันจะเริ่มต้นด้วยการเขียนโปรแกรมอินเทอร์เฟซผู้ใช้แบบกราฟิกใน C ++ ได้ที่ไหน ฉันจะสร้างได้อย่างไร


4
มันขึ้นอยู่กับ. คุณกำหนดเป้าหมายระบบปฏิบัติการประเภทใด เฟรมเวิร์ก GUI จำนวนมากมีเฉพาะระบบปฏิบัติการ
Michael Ratanapintha

3
ระบบปฏิบัติการ / แพลตฟอร์มคืออะไร หรือถ้าคุณกำลังสนใจในการเขียนข้ามแพลตฟอร์มแอพพลิเค GUI โปรดพูดดังนั้น - สิ่งเหล่านี้ทำให้ใหญ่แตกต่างกันสำหรับ C ++ ...
Shog9

3
PHP DOES รองรับการเขียนโปรแกรม GUI ไม่มีเหตุผลที่คุณไม่สามารถเรียกใช้โปรแกรม PHP จากบรรทัดคำสั่งและมีห้องสมุด gui เช่น PHP-GTK gtk.php.netและ PHP-Qt php-qt.orgที่สามารถช่วยคุณได้อาจต้องการประเมินว่าทำไมคุณถึงต้องการ C ++ การเขียน GUIs ใน c ++ นั้นยากกว่าในหลาย ๆ ภาษาและคุณอาจรวมรหัส c ++ ของคุณเข้ากับไลบรารีที่เรียกได้จาก Python หรือ C # หรือ PHP หรือสิ่งที่ง่ายกว่าเล็กน้อยในการใช้โค้ด GUI สำหรับ
kibibu

6
คำถามของคุณกว้างมากจนฉันคิดว่าคุณไม่ต้องการแค่ชื่อชุดเครื่องมือหรือแม้แต่แบบฝึกหัด คุณต้องการหนังสือบางเล่มหนังสือที่ให้คุณมากกว่า API หรือตัวอย่างที่ให้แนวคิดกับคุณ KTC แนะนำบางส่วนด้านล่าง แต่ฉันอยากจะแนะนำชุดเครื่องมืออะไรก็ตามที่คุณเลือกที่จะเริ่มเล่นด้วยตรวจสอบให้แน่ใจว่าได้ค้นหาชุดที่คุณสามารถอ่านได้เช่นกัน
quark

6
"การเขียน GUIs ใน c ++ นั้นยากกว่าในหลายภาษาอื่น ๆ " ในสิ่งที่คุณอ้างสิทธิ์นี้
piotr

คำตอบ:


163

โดยพื้นฐานแล้วระบบหน้าต่างของระบบปฏิบัติการจะเปิดเผยการเรียก API บางอย่างที่คุณสามารถทำงานได้เช่นสร้างหน้าต่างหรือวางปุ่มบนหน้าต่าง โดยทั่วไปคุณจะได้รับชุดของไฟล์ส่วนหัวและคุณสามารถเรียกฟังก์ชั่นในห้องสมุดที่นำเข้าเหล่านั้นเช่นเดียวกับที่คุณจะทำอย่างไรกับ STDLIB printfและ

ระบบปฏิบัติการแต่ละระบบมาพร้อมกับชุดเครื่องมือ GUI ของตัวเองชุดของไฟล์ส่วนหัวและการเรียก API และวิธีการทำสิ่งต่าง ๆ ของตนเอง นอกจากนี้ยังมีชุดเครื่องมือข้ามแพลตฟอร์มเช่นGTK , QtและwxWidgetsที่ช่วยให้คุณสร้างโปรแกรมที่ทำงานได้ทุกที่ พวกเขาประสบความสำเร็จโดยการเรียก API เดียวกันบนแต่ละแพลตฟอร์ม แต่การใช้งานที่แตกต่างกันสำหรับฟังก์ชั่น API เหล่านั้นที่เรียกใช้ไปยังการเรียก API ของระบบปฏิบัติการ

สิ่งหนึ่งที่พวกเขาทุกคนมีเหมือนกันซึ่งจะแตกต่างจากโปรแกรม CLI คือสิ่งที่เรียกว่าเหตุการณ์วนรอบ แนวคิดพื้นฐานมีค่อนข้างซับซ้อนและยากที่จะบีบอัด แต่ในสาระสำคัญมันหมายความว่าไม่มีอะไรมากที่จะเกิดขึ้นในชั้นเรียน / ฟังก์ชั่นหลักของคุณยกเว้น:

  • ตรวจสอบคิวกิจกรรมหากมีเหตุการณ์ใหม่ใด ๆ
  • หากมีให้ส่งเหตุการณ์เหล่านั้นไปยังตัวจัดการที่เหมาะสม
  • เมื่อเสร็จแล้วให้ควบคุมการส่งคืนกลับไปยังระบบปฏิบัติการ (โดยปกติจะมีการเรียกฟังก์ชั่นพิเศษ "sleep" หรือ "select" หรือ "yield")
  • ฟังก์ชั่นผลตอบแทนจะกลับมาเมื่อระบบปฏิบัติการเสร็จสิ้นและคุณมีอีกรอบ

มีทรัพยากรมากมายเกี่ยวกับการเขียนโปรแกรมตามเหตุการณ์ หากคุณมีประสบการณ์ใด ๆ เกี่ยวกับ JavaScript มันเป็นแนวคิดพื้นฐานเดียวกันยกเว้นว่าคุณผู้บันทึกไม่มีสิทธิ์เข้าถึงหรือควบคุมวนรอบเหตุการณ์เองหรือเหตุการณ์ใดที่มีอยู่งานเดียวของคุณคือการเขียนและลงทะเบียนตัวจัดการ

คุณควรทราบว่าการเขียนโปรแกรม GUI นั้นซับซ้อนและยากอย่างเหลือเชื่อโดยทั่วไป หากคุณมีตัวเลือกจริง ๆ แล้วมันง่ายกว่ามากที่จะรวมเว็บเซิร์ฟเวอร์แบบฝังในโปรแกรมของคุณและมีส่วนต่อประสานกับ HTML / เว็บ ข้อยกเว้นอย่างหนึ่งที่ฉันพบคือแอพสร้างอินเทอร์เฟซCocoa + Xcode + tutorials ที่ทำให้มันเป็นสภาพแวดล้อมที่เข้าถึงได้ง่ายที่สุดสำหรับผู้ที่เพิ่งเริ่มโปรแกรม GUI ที่ฉันเห็น


" จริง ๆ แล้วมันง่ายกว่ามากที่จะรวมเว็บเซิร์ฟเวอร์แบบฝังในโปรแกรมของคุณและมีส่วนต่อประสานกับ HTML / web " ขึ้นอยู่กับ หากคุณต้องการทำสิ่งแฟนซี (UI ที่ซับซ้อนตัวควบคุมที่กำหนดเองภาพเคลื่อนไหวและอื่น ๆ ) ใช่ หากคุณต้องการ GUI ทั่วไป (ด้วยการควบคุมตามปกติและความรู้สึกดั้งเดิม) ไม่ใช่
โอ๊ก

167

มีไลบรารี GUI แบบพกพาจำนวนมากฟรีแต่ละแห่งมีจุดแข็งและจุดอ่อนของตนเอง:

โดยเฉพาะอย่างยิ่งQt มีแบบฝึกหัดและเครื่องมือที่ช่วยให้คุณเริ่มต้นใช้งานได้ดี สนุก!

อย่างไรก็ตามโปรดทราบว่าคุณควรหลีกเลี่ยงการใช้งานเฉพาะแพลตฟอร์มเช่น Win32 API หรือ MFC ที่เชื่อมโยงคุณโดยไม่จำเป็นบนแพลตฟอร์มใด ๆ โดยแทบไม่มีประโยชน์


25
ส่วนตัวฉันคิดว่าการเขียนโปรแกรมไปยัง Win32 API นั้นสวยงาม ฉันชอบมากกว่าการใช้ Qt และสิ่งนั้นเองและในนั้นมีประโยชน์ บางทีนั่นอาจเป็นเพียงฉัน
mrduclaw

6
ประสบการณ์ส่วนตัวของฉันตรงกันข้าม Win32 API ทำให้ฉันยุ่งยากมากกว่า API อื่น ๆ
vog

17
@mrduclaw "ฉันคิดว่าการเขียนโปรแกรมเพื่อ Win32 API นั้นสวยงาม" ฉันลองใช้ค่าใช้จ่ายในการเขียนรหัสแบบพกพา (โปรดทราบว่าฉันใช้คำว่า "ลอง" เพราะมีข้อยกเว้น ... ) การเขียนโค้ดที่ไม่ใช่พกพาถือเป็น "สวยงาม" ได้อย่างไร?
เทรเวอร์บอยด์สมิ ธ

11
@ เทรเวอร์บอยด์สมิ ธ : เป้าหมายที่แตกต่างกันฉันคิดว่า เกือบจะไม่มีรหัสที่ฉันเคยเขียนอย่างมืออาชีพอาจเป็นข้ามแพลตฟอร์มได้ดังนั้นจึงไม่เคยเป็นปัญหาสำหรับฉันเลย
mrduclaw

1
คำถามหนึ่งล้านดอลลาร์คือพวกที่สร้างผู้ฝึกสอนเกมให้ exe เล็ก ๆ และโปรแกรมของพวกเขามี UI ที่สวยงามดังนั้นฉันจึงสงสัยว่าพวกเขาสร้าง UI ได้อย่างไรพวกเขาไม่ได้ให้บริการบุคคลที่สามเหล่านี้ด้วยหรือไม่
user889030

74

OS อัลกอริทึมอิสระ " การสร้างแอปพลิเคชัน GUI ใน C ++ ในสามขั้นตอน ":

  1. ติดตั้งQt Creator

    ป้อนคำอธิบายรูปภาพที่นี่

  2. สร้างโครงการใหม่ (แอปพลิเคชัน Qt Widgets)

    ป้อนคำอธิบายรูปภาพที่นี่

  3. สร้างมัน

ขอแสดงความยินดีคุณมี GUI แรกของคุณใน C ++

ตอนนี้คุณพร้อมที่จะอ่านเอกสารจำนวนมากเพื่อสร้างสิ่งที่ซับซ้อนกว่าแอปพลิเคชัน GUI "Hello world"


ในอดีตฉันมีปัญหากับ GUI อื่น ๆ ที่ไม่เป็นมิตรกับผู้เริ่มต้น แต่ Qt มีแบบฝึกหัดที่ยอดเยี่ยม ขอบคุณสำหรับคำแนะนำ!
JD

23

รับความคิดเห็นของ "พูด Windows XP เป็นตัวอย่าง" แล้วตัวเลือกของคุณคือ:

  • ติดต่อโดยตรงกับระบบปฏิบัติการผ่าน API ซึ่งสำหรับ Microsoft Windows เป็นสายแปลกใจแปลกใจของ Windows API การอ้างอิงที่ชัดเจนสำหรับ WinAPI คือไมโครซอฟท์เว็บไซต์ MSDN ที่เป็นที่นิยมกวดวิชาเริ่มต้นออนไลน์ที่เป็นtheForger ของ Win32 API กวดวิชาเขียนโปรแกรม หนังสือคลาสสิกสำหรับชาร์ลส์ที่เป็น Petzold ของการเขียนโปรแกรมของ Windows รุ่นที่

  • ใช้แพลตฟอร์มเฉพาะ (ทั้งในแง่ของ OS และคอมไพเลอร์) ไลบรารีเฉพาะเช่นMFCซึ่งตัด WinAPI ลงในคลาส C ++ การอ้างอิงสำหรับนั้นคือ MSDN อีกครั้ง หนังสือคลาสสิกที่เป็นเจฟฟ์โพรไซิสของการเขียนโปรแกรม Windows ด้วย MFC พิมพ์ครั้งที่ หากคุณกำลังใช้พูด CodeGear C ++ Builder แล้วตัวเลือกที่นี่เป็นVCL

  • ใช้ไลบรารีข้ามแพลตฟอร์มเช่นGTK + (wrapper C ++: gtkmm ), Qt , wxWidgetsหรือFLTKที่ห่อ API ของระบบปฏิบัติการเฉพาะ ข้อดีของสิ่งเหล่านี้คือโดยทั่วไปโปรแกรมของคุณสามารถรวบรวมสำหรับระบบปฏิบัติการที่แตกต่างกันโดยไม่ต้องเปลี่ยนซอร์สโค้ด ดังที่ได้กล่าวไปแล้วพวกเขาแต่ละคนมีจุดแข็งและจุดอ่อนของตนเอง ข้อควรพิจารณาประการหนึ่งเมื่อเลือกว่าจะใช้อันไหนเป็นใบอนุญาต สำหรับตัวอย่างที่ระบุ GTK + & gtkmm เป็นลิขสิทธิ์ภายใต้ LGPL, Qt อยู่ภายใต้ใบอนุญาตต่างๆรวมถึงตัวเลือกกรรมสิทธิ์ wxWidgets อยู่ภายใต้ใบอนุญาต wxWindows ของตัวเอง (เปลี่ยนชื่อเป็นใบอนุญาต wxWidgets) และ FLTK อยู่ภายใต้ LGPL โดยมีข้อยกเว้น สำหรับการอ้างอิงการสอนและหรือหนังสือให้อ้างอิงเว็บไซต์ของแต่ละคนเพื่อดูรายละเอียด


9
MFC เป็นสิ่งที่ชั่วร้าย ฉันต้องการใช้ WIN API หากไม่มีตัวเลือกอื่น
the_drow

@the_drow เกี่ยวกับsourceforge.net/projects/win32-framework
Jerry Jeremiah

18

เนื่องจากฉันเป็นที่ที่คุณอยู่ในตอนนี้ฉันคิดว่าฉันสามารถ "ตอบ" คุณได้

ความจริงก็คือไม่มีวิธีง่ายๆในการสร้าง GUI GUI ขึ้นอยู่กับแพลตฟอร์มและรหัสเฉพาะของ OS เป็นอย่างมากนั่นคือเหตุผลที่คุณควรเริ่มอ่านเอกสารแพลตฟอร์ม / ระบบปฏิบัติการเป้าหมายของคุณใน API การจัดการหน้าต่าง ข้อดีคือมีห้องสมุดมากมายที่ตอบสนองข้อ จำกัด เหล่านี้และความแตกต่างของสถาปัตยกรรมนามธรรมใน API แบบหลายแพลตฟอร์มเดียว สิ่งที่แนะนำก่อนหน้านี้คือ GTK และ Qt เป็นห้องสมุดบางส่วน

แต่สิ่งเหล่านี้ก็ซับซ้อนเกินไปเนื่องจากแนวคิดใหม่จำนวนมากประเภทข้อมูลเนมสเปซและคลาสได้รับการแนะนำทั้งหมดในคราวเดียว ด้วยเหตุนี้พวกเขาจึงมาพร้อมกับตัวแก้ไข GUI WYSIWYG บางตัว พวกเขาทำซอฟต์แวร์โปรแกรมมิ่งกับ GUI ได้

เพื่อสรุปผลยังมี "สภาพแวดล้อม" ที่ไม่เสียค่าใช้จ่ายสำหรับการพัฒนา GUI เช่น Visual Studio จาก Microsoft สำหรับผู้ที่มีพื้นหลังประสบการณ์Delphiแล้ว Visual Studio อาจคุ้นเคยมากกว่า นอกจากนี้ยังมีทางเลือกฟรีให้กับสภาพแวดล้อม Visual Studio แบบเต็มที่จัดทำจาก Microsoft: Visual Studio Expressซึ่งเกินพอสำหรับการเริ่มต้นในการพัฒนา GUI


15

ฉันพบเว็บไซต์ที่มีบทช่วยสอน "แบบง่าย": http://www.winprog.org/tutorial/start.html


8
นี่เป็นการแนะนำ Win32 API ซึ่งเป็นวิธีการเขียนโปรแกรม GUI ระดับต่ำมากซึ่งเชื่อมโยงคุณกับแพลตฟอร์ม Windows ฉันจะไม่แนะนำที่
vog

17
มันเป็นตัวเลือกที่ถูกต้อง ฉันยอมรับว่ามันอาจไม่ใช่จุดเริ่มต้นที่ดีที่สุด แต่มันไม่สมควรได้รับการโหวต
เอมิลเอช

1
ฉันรู้ว่านี่ไม่ใช่ทางออกที่ดี แต่ช่วยให้เรียนรู้ว่าระบบ gui ใน Windows ทำงานอย่างไร ฉันได้อ่านบทช่วยสอนนี้เมื่อสองสามปีก่อนและตอนนี้ฉันรู้ว่าลูปของข้อความคืออะไรและทำงานอย่างไร เมื่อทำงานกับ winforms ใน. net ความรู้นี้อาจมีประโยชน์
ZippyV

7
หากคุณกำลังจะเขียนแอปพลิเคชันบนเดสก์ท็อปก็ไม่มีทางเลือกอื่นที่จะรู้ว่าระบบปฏิบัติการแสดงผลและโต้ตอบกับผู้ใช้อย่างไร หากคุณใช้ห้องสมุดโดยไม่เข้าใจพื้นฐานคุณจะไม่เข้าใจสิ่งที่เกิดขึ้นจริง ๆ การเรียนรู้การเขียนโปรแกรม win32 gui ระดับต่ำเล็กน้อยจะใช้เวลาอย่างคุ้มค่า
Jim In Texas

@ จิมในเท็กซัส: ฉันเห็นด้วย แต่ควรจะเรียนรู้ "บิตของระดับต่ำ" หลังจากพื้นฐานดังนั้นฉันจึงยังพบว่าคำแนะนำนั้นไม่เหมาะสมสำหรับผู้เริ่มต้น
vog

3

ง่ายต่อการสร้าง. NET Windows GUI ใน C ++

ดูกวดวิชาต่อไปนี้จากMSDN คุณสามารถดาวน์โหลดทุกอย่างที่คุณต้องการ (Visual C ++ ด่วน) สำหรับฟรี

แน่นอนว่าคุณผูกตัวเองกับ. NET แต่ถ้าคุณเพิ่งเล่นไปหรือต้องการเพียงแอพพลิเคชั่น Windows คุณก็จะสบายดี (คนส่วนใหญ่ยังคงมี Windows ... สำหรับตอนนี้)


3

ฉันใช้ FLTK เพราะQtไม่ฟรี ฉันไม่ได้เลือกwxWidgetsเพราะการทดสอบครั้งแรกของฉันกับHello, World! โปรแกรมผลิตไฟล์เรียกทำงาน 24 MB, FLTK 0.8 MB ...


4
เนื่องจากการเปลี่ยนแปลงใบอนุญาต QT ฉันวางแผนที่จะเปลี่ยนเป็น QT
pernecker

2
โปรแกรม wxWidgets ของฉันเองคือ 5.9 Mb แม้ว่าจะมี
ไลบรารี่ที่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.