QT-C ++ vs Genel C ++ ve STL [kapalı]


19

Ubuntu QQ'da son zamanlarda C ++ ile uğraşıyorum. Her şey için Qt çerçevesini, özellikle GUI'leri inşa etmeyi seviyorum. Son birkaç yıldır PyQt kullanırken oldukça aşina oldum.

PyQt kullanırken, Qt ile C ++ kullanırken artık daha belirgin olan bazı sorunlar vardı: Qt, Ct'ye özgü Qt'ye özgü birçok uzantıya sahip - QString, otomatik çöp toplamadan bahsetmiyorum, sadece yaygın bir örnek. C ++ ve STL hakkında çok fazla bilgi sahibi olmadan C ++ kullanarak Qt uygulamaları yazmak mümkündür.

Kısa süre sonra iş piyasasına tekrar girmek zorunda kalabilirim ve C ++ pozisyonlarını göz önünde bulundurmak istiyorum - ama kendimi Qt'ye çok fazla bağlamaktan korkuyorum, bir zamanlar oldukça zorlu olan genel C ++ ile çalışma yeteneklerimi sınırlayacağım ama şimdi uzun uykuda ve paslı.

Qt kaçınmalı mıyım? GUI'ler oluşturmak için WxWidgets veya GTK ++ kullanarak daha iyi olur muyum?

Jenerik C ++ ve STL'nin en çok kullanılmasını sağlayan / gerektiren en iyi GUI çerçevesi nedir? GUI çerçeveleri vb. Söz konusu olduğunda kendimi en çok C ++ programcısı olarak pazarlayabilirim?

Yanıtlar:


15

Sadece bu nedenlerle Qt kullanmaktan kaçınmam. Tüm Qt yardımcı sınıflarını kullanmanız gerekmez; STL'nin yerini alanlar için en çok QString ve muhtemelen QStringList kullanmak zorunda kalacaksınız. Ayrıca, genellikle bir programda GUI'den çok daha fazlası vardır. Programınızın geri kalanı için her zaman yalnızca genel C ++ kullanabilir ve yalnızca GUI için Qt kullanabilirsiniz.

Kanımca, STL ile çalışmak daha çok altta yatan veri yapılarının nasıl kullanıldığını ve karmaşıklıklarını ve sonuç olarak her bir kabı hangi zamanlarda kullanmanız gerektiğini anlamakla ilgilidir. Ve C ++ programlama söz konusu olduğunda, özellikle STL uyumlu oldukları için Qt kapsayıcılarında da çalışması gereken çok önemli <algoritma> başlığının nasıl kullanılacağını bilmekle ilgilidir.

Dahili olarak nasıl uygulandığını bildiğiniz (veya en azından genel bir fikre sahip olduğunuz sürece) Qt'nin sağladığı tüm bu uzantıları kullanmanın çok fazla zarar görmüyorum. Q_OBJECT, SIGNAL (), SLOT (), foreach () gibi şeylerin sihir olmadığını, ancak geçerli C ++ ifadelerine genişleyen makrolar olduğunu bildiğinizden emin olun. Örneğin, Qt'yi Java benzeri hissettiren örtülü olarak paylaşılan sınıfların ve ebeveyn-çocuk ilişkilerinin nasıl uygulandığını anlamak o kadar karmaşık değildir. Her zaman ayrı bir projede bazı işlevleri yeniden oluşturmayı deneyebilirsiniz, sadece genel C ++ ile yapıp yapamayacağınızı görmek ve daha sonra bunları Qt'de kullanmak için kötü hissetmemek için.

Ayrıca, Boost kütüphanelerine de bir göz atın. Standart C ++ kütüphanesinin sağlamadığı ekstra yardımcı programlar sağlarlar ve genel C ++ ile aynı kuralları izledikleri için genel C ++ 'a biraz daha yakın olmanın gerçekten iyi bir yoludur. Bazı kütüphaneler oldukça karmaşık şablonlara sahiptir ve nasıl çalıştıklarını anlamaya çalışmak kendi başına C ++ 'da iyi bir çalışmadır. Boost, Qt'da bulunamayan birçok yardımcı programa ve Qt sınıflarından bazılarıyla aynı veya benzer kavramları uygulayan ve onların yerine kullanılabilecek başka yardımcı programlara sahiptir.

C ++ ile çalışan iş piyasasına çarparsanız, Qt ya da C ++ ile daha basit hale getirmeye çalışan kendi yardımcı sınıflarına sahip olacak başka bir çerçeve ile çalışacaksınız.


4
+1 için "Programınızın geri kalanı için her zaman yalnızca genel C ++ kullanabilirsiniz ve yalnızca GUI için Qt kullanabilirsiniz."
Md Mahbubur Rahman

@MahbuburRAaman - evet - bu mükemmel bir tavsiye. Qt'yi sadece GUI ve arkaya takmak için gerekenleri kullanın. Geri kalanını Generic C ++, STL, Boost - evrensel olarak kullanılan araçlar kullanarak yazın.
Vektör

5

Ben Qt yüksek övgü çoğu katılıyorum, ama soru genel C ++ ve STL en fazla kullanımını sağlayan / gerektiren kullanmak için en iyi GUI çerçeve nedir? Bu açıdan Qt biraz şizofreniktir: STL kaplarını ve algoritmaları kendi bükülmeleri ile çoğaltır. Ayrıca STL'den farklı kaplar da sağlar. Qt ve STL arasındaki birlikte çalışabilirlik her zaman düzgün yelken değildir. Bazı durumlarda aldığım için birkaç işlev çağrıları alır std::stringetmek QStringve geri.

wxWidgets, yalnızca STL kaplarını kullanan STL oluşturma için bir seçeneğe sahiptir - Qt durumunda olduğu gibi evde yetiştirilen değiştirmelerle paralel bir evren yoktur. Ayrıca standart olmayan uzantılara ihtiyaç duymadan standart bir C ++ derleyicisiyle derlenir. Dikkate değer kaliteli bir GUI çerçevesidir.

Ayrıca GTK + etrafında bir C ++ sarıcı olan gtkmm'ye de bakabilirsiniz. İlk gereksiniminizi karşılamanız Qt.


1
'wxWidgets, yalnızca STL kaplarını kullanan STL oluşturma için bir seçeneğe sahiptir ...' - Anlıyorum - bunu bilmek ÖNEMLİ. 'Bazı durumlarda std :: string'den QString'e ulaşmak için birkaç işlev çağrısı gerekir' - anlaşıldı - Henüz araştırmadım. GTK ve Wx'e biraz aşinayım - ama Qt en azından benim bakış açımla karşılaştırıldığında parlıyor gibi görünüyor - C ++ ilk dilim değil - Clipper / Delphi dünyasından geldim ve C ++ öğrendim çünkü Win ile uğraşmak zorunda kaldım 32'ler vb.
Vektör

2

Std :: string veya std :: iostream veya std :: vector gibi belirli STL kütüphanelerini kullanmama konusunda çok fazla endişe etmem. QT-eşdeğerleri farklı bir lezzete sahiptir, ancak herhangi bir problem yapmak için çok uzak değildir.

Bence daha idiyomatik fark, newtahsis için kullanılan programlama tarzı gibi görünüyor . Bir QT programı için bu Gui kısmı için iyi olabilirken, C ++ ve RAII'nin erdemleri aslında yığın üzerinde yığın yerine çok fazla veri tutabilmenizdir. GUI olmayan kod yazmaya geçerken bunu hatırlamanız gerekir.


1
anlatmaya çalıştığım nokta yığın tahsisinin genellikle kötü olmaması değil, yerel değişkenler için en iyi şey değil. GUI sınıfları uzun yaşama eğilimindedir ve en iyi öbek üzerinde tahsis edilir, sadece geçici olarak ihtiyaç duyulan yerel değişkenler yığında iyi yaşar. Garbace Collection ile C # yakında yakında yok edilecek, bu yüzden yığın da iyidir. Ancak manuel new/deleteçağrılar ile bu o kadar kolay ve hata eğilimli değildir. Kritik bölümlerde (büyük verilerin işlenmesi) bu bir fark yaratabilir, özellikle deleteçağrılar oldukça yavaş olabilir.
wirrbel

1
bu, 10000 UI Nesneleri sorunu değil, bir zamanlar şeyleri tahsis etmenin daha akıllı yollarına (Toplu tahsis veya çok sayıda akıllı yazılı destek sınıfı, vb.) Sonuç: yığın fena değil, akıllıca kullanılmalıdır. Qt yolu bazen başka şeyler için ölçeklenmez. Bence hala muhteşem bir araç.
wirrbel

Peki ya C ++ 11? akıllı işaretçiler vb endişelerinizi hafifletmek gibi görünüyor. Şimdi onunla uğraşmaya başlıyorum. Dediğim gibi Qt KICKS BUTT. Planım GUI için Qt kullanmak ve C ++ 11 kullanarak yapabileceğim her şeyi yapmak. Qt ve C ++ 11'in bir kombinasyonunun büyük bir kazanan olabileceğini hissediyorum (bu noktada itirafla uzaktan).
Vektör

2
Demek istediğim var: C ++ ile birçok seçeneğiniz var, c ++ ile akıllıca seçmelisiniz. Akıllı işaretçilerin de sorunları var. C # ile bıkmış çok şey daha iyi yapar dlang.org bir göz atabilirsiniz (GCed).
wirrbel

Bu arada C ++ 11'i destekleyen bir alet zinciri bir araya getirmeliyim. Şu anda codelite kullanıyorum - çok güzel IDE - ama kutunun dışında (GNU derleyici) 11'i desteklemiyor, az önce öğrendim ... Belki ben içine 11 uyumlu bir derleyici takabilirsiniz. D veya Boo vb.İle başlamamak - sözünü ettiğim gibi, iş piyasasına oldukça yakın bir zamanda vurmak zorunda kalabilirim ve pazarlanabilirlik için ana dillere sahip olmak istiyorum, 'tek seferlik' değil. Python bir sürü iş var - çok kötü Python'a artık dayanamıyorum!
Vektör
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.