QT-C ++ vs Generic C ++ และ STL [ปิด]


19

เคยแปรงฟันบน C ++ ของฉันเมื่อเร็ว ๆ นี้บน Ubuntu QQ ฉันชอบกรอบ Qt สำหรับทุกสิ่งโดยเฉพาะอย่างยิ่งการสร้าง GUI ฉันคุ้นเคยกับมันมากเมื่อใช้ PyQt ในช่วงไม่กี่ปีที่ผ่านมา

เมื่อใช้ PyQt ฉันมีปัญหาบางอย่างที่ตอนนี้เด่นชัดมากขึ้นเมื่อใช้ C ++ กับ Qt: Qt มีส่วนขยายจำนวนมากเป็น C ++ ซึ่งเป็น Qt เฉพาะ - QString เป็นเพียงตัวอย่างทั่วไปไม่พูดถึงการรวบรวมขยะอัตโนมัติ เป็นไปได้ที่จะเขียนแอปพลิเคชัน Qt โดยใช้ C ++ โดยไม่ต้องรู้อะไรมากมายเกี่ยวกับ C ++ และ STL

ฉันอาจต้องเข้าสู่ตลาดงานอีกครั้งในไม่ช้าและฉันต้องการพิจารณาตำแหน่ง C ++ - แต่ฉันกลัวว่าการผูกมัดตัวเองมากเกินไปกับ Qt จะจำกัดความสามารถของฉันในการทำงานกับ C ++ ทั่วไปซึ่งครั้งหนึ่งเคยเป็นที่น่ากลัวมาก ตอนนี้อยู่เฉยนานและเป็นสนิม

ฉันควรหลีกเลี่ยง Qt หรือไม่ ฉันควรจะใช้ WxWidgets หรือ GTK ++ เพื่อสร้าง GUI หรือไม่

เฟรมเวิร์ก GUI ที่ดีที่สุดในการใช้ที่อนุญาต / ต้องการการใช้งานทั่วไป C ++ และ STL คืออะไร ฉันจะทำให้ตัวเองเป็นที่ต้องการของตลาดมากที่สุดในฐานะโปรแกรมเมอร์ C ++ เมื่อพูดถึง GUI GUI และอื่น ๆ ได้อย่างไร?

คำตอบ:


15

ฉันจะไม่งดใช้ Qt ด้วยเหตุผลเหล่านั้น คุณไม่จำเป็นต้องใช้คลาสยูทิลิตี้ของ Qt ทั้งหมด สำหรับสิ่งที่แทนที่ STL คุณจะถูกบังคับให้ใช้ QString และ QStringList นอกจากนี้มักจะมีโปรแกรมมากกว่า GUI คุณสามารถใช้ C ++ ทั่วไปเฉพาะสำหรับส่วนที่เหลือของโปรแกรมของคุณและใช้ Qt เฉพาะสำหรับ GUI

ในความคิดของฉันการทำงานกับ STL นั้นเกี่ยวกับการทำความเข้าใจว่ามีการใช้โครงสร้างข้อมูลพื้นฐานใดบ้างและมีความซับซ้อนมากน้อยเพียงใดดังนั้นคุณควรใช้แต่ละคอนเทนเนอร์ และเมื่อพูดถึงการเขียนโปรแกรม C ++ มันเป็นเรื่องเกี่ยวกับการรู้วิธีใช้ส่วนหัว <algorithm> ที่สำคัญซึ่งควรทำงานกับคอนเทนเนอร์ของ Qt ด้วยเนื่องจากมันเข้ากันได้กับ STL

ฉันไม่เห็นอันตรายมากนักในการใช้ส่วนขยายทั้งหมดที่ Qt ให้ไว้ตราบใดที่คุณรู้ (หรืออย่างน้อยก็มีความคิดทั่วไป) ว่าจะนำไปใช้อย่างไรภายใน ตรวจสอบให้แน่ใจว่าคุณรู้ว่าสิ่งต่างๆเช่น Q_OBJECT, SIGNAL (), SLOT (), foreach () ไม่ใช่เวทมนต์ แต่มาโครที่ขยายไปยังคำสั่ง C ++ ที่ถูกต้อง ตัวอย่างเช่นมันไม่ทั้งหมดที่ซับซ้อนในการทำความเข้าใจว่าการแชร์คลาสและความสัมพันธ์ระหว่างผู้ปกครองกับลูกนั้นทำให้ Qt รู้สึกเหมือน Java มากขึ้นอย่างไร คุณสามารถลองสร้างฟังก์ชันการทำงานบางอย่างในโครงการแยกต่างหากเพื่อดูว่าคุณสามารถทำได้ด้วย C ++ ทั่วไปหรือไม่และไม่รู้สึกแย่ที่จะใช้มันใน Qt

ลองดูที่ห้องสมุด Boost พวกเขามีสาธารณูปโภคเพิ่มเติมที่ห้องสมุด C ++ มาตรฐานไม่ได้และเป็นวิธีที่ดีจริง ๆ ที่จะเข้าใกล้ C ++ ทั่วไปได้เล็กน้อยเนื่องจากพวกเขาปฏิบัติตามหลักการเดียวกันกับ C ++ ทั่วไป ห้องสมุดบางแห่งมีคลาสเทมเพลตที่ค่อนข้างซับซ้อนและเพียงพยายามที่จะเข้าใจว่ามันทำงานอย่างไรในตัวของมันเองการศึกษาที่ดีใน C ++ Boost มียูทิลิตี้มากมายที่ไม่สามารถพบได้ใน Qt และอื่น ๆ ที่ใช้แนวคิดเดียวกันหรือคล้ายกันกับคลาสของ Qt บางส่วนและสามารถใช้แทนได้

หากคุณเข้าสู่ตลาดงานที่ทำงานกับ C ++ โอกาสที่คุณจะได้ทำงานกับ Qt หรือกรอบงานอื่นที่คล้ายกับมันจะมีคลาสยูทิลิตี้ของตัวเองที่พยายามทำให้ C ++ ง่ายขึ้น


4
+1 สำหรับ "คุณสามารถใช้ C ++ ทั่วไปเฉพาะสำหรับส่วนที่เหลือของโปรแกรมของคุณและใช้ Qt เฉพาะสำหรับ GUI"
Md Mahbubur Rahman

@MahbuburRAaman - ใช่ - นี่คือคำแนะนำที่ยอดเยี่ยม ใช้ Qt เฉพาะกับ GUI และสิ่งที่จำเป็นในการติดต่อกลับ เขียนส่วนที่เหลือด้วย Generic C ++, STL, Boost - เครื่องมือที่ใช้ในระดับสากล
เวกเตอร์

5

ฉันเห็นด้วยกับการยกย่องอย่างสูงของ Qt แต่คำถามคืออะไรกรอบการใช้งาน GUI ที่ดีที่สุดที่อนุญาต / ต้องใช้ C ++ ทั่วไปและ STL มากที่สุดคืออะไร ในแง่นี้ Qt เป็นโรคจิตเภทเล็กน้อย: มันทำซ้ำคอนเทนเนอร์ STL และอัลกอริทึมกับบิดของตัวเอง นอกจากนี้ยังมีภาชนะบรรจุซึ่งแตกต่างจาก STL การทำงานร่วมกันระหว่าง Qt และ STL ไม่ราบรื่นเสมอไป ในบางกรณีอาจใช้การเรียกฟังก์ชั่นสองสามครั้งเพื่อรับจากstd::stringไปQStringและกลับ

wxWidgets มีตัวเลือกสำหรับการสร้าง STL ซึ่งใช้คอนเทนเนอร์ STL แต่เพียงผู้เดียว - ไม่มีเอกภพคู่ขนานพร้อมการทดแทนที่ปลูกในบ้านเช่นในกรณีของ Qt นอกจากนี้ยังรวบรวมกับคอมไพเลอร์ C ++ มาตรฐานโดยไม่ต้องใช้ส่วนขยายที่ไม่ได้มาตรฐาน เป็นกรอบ GUI คุณภาพที่ควรพิจารณา

นอกจากนี้คุณยังสามารถดู gtkmm ซึ่งเป็น wrapper C ++ รอบ ๆ GTK + ใกล้เคียงกับความต้องการแรกของคุณมากกว่า Qt


1
'wxWidgets มีตัวเลือกสำหรับการสร้าง STL ซึ่งใช้คอนเทนเนอร์ STL โดยเฉพาะ ... ' - ฉันเข้าใจ - นี่เป็นสิ่งสำคัญที่ต้องทราบ 'ในบางกรณีการเรียกใช้ฟังก์ชั่นบางอย่างเพื่อรับจาก std :: string ถึง QString' - เข้าใจแล้ว - ฉันยังไม่ได้ตรวจสอบ ฉันคุ้นเคยกับ GTK และ Wx นิดหน่อย แต่ Qt ดูเหมือนว่าจะเปรียบเทียบกันอย่างน้อยจากมุมมองของฉัน - C ++ ไม่ใช่ภาษาแรกของฉัน - ฉันมาจากโลก Clipper / Delphi แล้วเรียนรู้ C ++ เพราะฉันต้องรับมือกับ Win 32s เป็นต้น
เวกเตอร์

2

ฉันจะไม่กังวลมากเกินไปเกี่ยวกับการไม่ใช้ไลบรารี STL เฉพาะเช่น std :: string หรือ std :: iostream หรือ std :: vector สิ่งที่เทียบเท่าใน QT นั้นมีรสชาติที่แตกต่างกันไป แต่มันก็ไม่ได้ไกลเกินกว่าที่จะสร้างปัญหาได้

ความแตกต่างที่เป็นสำนวนในความคิดของฉันดูเหมือนว่าจะเป็นรูปแบบการเขียนโปรแกรมอย่างหนักในการใช้newสำหรับการจัดสรร ในขณะที่โปรแกรม QT สิ่งนี้อาจใช้ได้สำหรับส่วน Gui ข้อดีของ C ++ และ RAII คือคุณสามารถเก็บข้อมูลจำนวนมากบนสแต็กแทนที่จะเป็นกอง เมื่อเปลี่ยนเป็นการเขียนโค้ดที่ไม่ใช่ GUI คุณควรจำได้ว่า


1
จุดที่ฉันพยายามทำไม่ใช่ว่าการจัดสรรฮีปโดยทั่วไปไม่ดีมันไม่ใช่สิ่งที่ดีที่สุดสำหรับตัวแปรท้องถิ่น คลาส GUI มีแนวโน้มที่จะมีอายุการใช้งานยาวนานและจัดสรรให้กับฮีปได้ดีที่สุดตัวแปรโลคัลที่จำเป็นสำหรับการใช้งานได้ดีบนสแต็กชั่วคราวเท่านั้น ใน C # ด้วย Garbace Collection พวกมันจะถูกทำลายในไม่ช้าดังนั้น heap ก็ใช้ได้เช่นกัน แต่ด้วยการnew/deleteโทรด้วยตนเองนี่ไม่ใช่เรื่องง่ายและเกิดข้อผิดพลาดได้ง่าย ในส่วนสำคัญ (การจัดการข้อมูลขนาดใหญ่) สิ่งนี้สามารถสร้างความแตกต่างได้โดยเฉพาะอย่างยิ่งการdeleteโทรอาจช้ามาก
wirrbel

1
นี่ไม่ใช่ปัญหาของวัตถุ UI 10,000 รายการ แต่สำหรับโครงสร้างข้อมูลต้นไม้ที่ซับซ้อนซึ่งมีรายการนับล้านรายการซึ่งสามารถใช้วิธีการจัดสรรสิ่งต่าง ๆ ได้อย่างชาญฉลาด (การจัดสรรจำนวนมากหรือคลาสบูสเตอร์เพิ่มอย่างชาญฉลาด ฯลฯ ) สรุป: ฮีปไม่เลวต้องใช้อย่างชาญฉลาด บางครั้งวิธีการ Qt ไม่ได้ปรับขนาดสำหรับสิ่งอื่น ๆ มันยังคงเป็นชุดเครื่องมือที่ยอดเยี่ยมในความคิดของฉัน
wirrbel

แล้ว C ++ 11 ล่ะ? ตัวชี้สมาร์ท ฯลฯ จะช่วยบรรเทาความกังวลของคุณได้ ฉันเพิ่งเริ่มยุ่งกับมันตอนนี้ ดังที่ฉันพูดฉันยอมรับว่า Qt KICKS BUTT แผนของฉันคือการใช้ Qt สำหรับ GUI และทำสิ่งอื่นที่ฉันสามารถใช้ C ++ 11 - ซึ่งดูเหมือนว่าจะทำให้ Boost เป็นจำนวนมากตัวอย่างเช่นล้าสมัยและปิดช่องว่างระหว่าง Java / C # และโรงเรียน C ++ เก่า ฉันได้รับความรู้สึก (ณ จุดนี้จากระยะไกลยอมรับ) ว่าการรวมกันของ Qt และ C ++ 11 สามารถเป็นผู้ชนะที่ยิ่งใหญ่
เวกเตอร์

2
ฉันคิดว่าคุณมีจุดของฉัน: คุณมีตัวเลือกมากมายกับ C ++ กับ c ++ คุณต้องเลือกอย่างชาญฉลาด ตัวชี้สมาร์ท ฯลฯ มีปัญหาเช่นกัน เบื่อกับ C # คุณอาจจะดูdlang.orgซึ่งทำสิ่งต่าง ๆ ได้ดีขึ้น (GCed)
wirrbel

ในขณะเดียวกันฉันต้องรวบรวมโซ่เครื่องมือที่สนับสนุน C ++ 11 ฉันใช้ codelite ตอนนี้ - IDE ที่ดีมาก - แต่ออกจากกล่อง (คอมไพเลอร์ GNU) ไม่รองรับ 11 เนื่องจากฉันเพิ่งค้นพบ ... บางทีฉันอาจจะ สามารถเสียบคอมไพเลอร์ที่เป็นไปตามมาตรฐาน 11 รายการ จะไม่เริ่มต้นด้วย D หรือ Boo ฯลฯ ฯลฯ - อย่างที่ฉันพูดในคำถามฉันอาจต้องตีตลาดงานอีกครั้งในไม่ช้าและฉันต้องการมีภาษากระแสหลักเพื่อความสามารถทางการตลาดไม่ใช่ 'คนที่ไม่ชอบ' งาน Python จำนวนมากออกมาจากที่นั่น - แย่มากฉันไม่สามารถทน Python อีกต่อไป!
เวกเตอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.