Neden daha fazla masaüstü uygulaması Qt ile yazılmış değil? [kapalı]


202

Qt ile olan deneyimimde bildiğim ve anladığım kadarıyla kütüphane öğrenmek çok iyi ve kolay. Çok iyi tasarlanmış bir API'ye sahiptir ve çapraz platformdur ve bunlar onu çekici kılan özelliklerden sadece ikisidir. Neden daha fazla programcının Qt kullanmadığını bilmek istiyorum. Buna karşı çıkan bir eksiklik var mı? Hangi kütüphaneler diğer kütüphaneleri Qt'dan daha iyi kılar? Sorun lisansla ilgili mi?


60
Yerel C ++. Çoğu geliştirici, C # gibi daha yüksek seviyeli dilleri tercih ederdi.
user16764

15
İki ucu geriye dönük uyumluluk kılıcı, birçok anakronizm, düzeltilemeyen kusurlar ve diğer kötü davranışlarla Qt bıraktı.
edA-qa mort-ora-y

26
@ user16764: "En Çok"?
Orbit'teki Hafiflik Yarışları

17
TIOBE endeksinin gerçekten doğru bir ölçü olduğunu sanmıyorum, çünkü popülerliği ölçüyor, kullanmıyor. GitHub, Bitbucket, Codeplex ve Sourceforge gibi açık kaynak havuzlarındaki kod miktarının karşılaştırılması daha doğru ölçümler verir. (Ve bu daha doğru ölçümlerin C ve C ++ 'ı 1 ve 2 numaralı noktalara koyduğuna inanıyorum - Java TIOBE endeksinde haksız bir avantaja sahip olduğu için birinci sınıf kolej kursları için kullanılıyor ve yeni programcılar tecrübeli olanlardan daha fazla vızıltı yapıyor)
Billy ONeal

12
@ Giorgio: Erm, C # 'da böyle şeyler düşünmek zorundasın. “Buna sahip olan” kavramı, “arayan delete” ın çok ötesine geçer . Akıllı işaretçilerin bunu açıkça ifade etmeleri yanlış bir dil değildir; ve eğer böyle şeyler düşünmüyorsanız, gördüğüm en üst seviyede herhangi bir dilde çöp üreteceksiniz.
Billy ONeal,

Yanıtlar:


177

Bunun kesin bir cevap olması niyetinde değilim, ancak kişisel olarak Qt kullanmamamın nedenleri bunlar. Bununla ilgili söylenecek çok şey var - yani API çoğu zaman çalışır ve platformları sorunsuz bir şekilde köprüler. Fakat Qt kullanmıyorum, çünkü:

  1. Bazı durumlarda, yerel programların göründüğü gibi görünmüyor. Tüm platformlar için doğal olarak tek bir UI tasarlamak, çeşitli görsel şekillendirme nedenleriyle makineden makineye taşınırken doğru görünmeyecektir. Örneğin, Mac makinelerinde, ayırma çubukları genellikle nispeten kalındır ve düğmeler küçüktür ve simgelerle yuvarlanmıştır. Windows makinelerde, ayırma çubukları genellikle dardır ve düğmeler daha fazla kare tasarımla daha metinseldir. Sadece her platform için bir UI yazabildiğiniz için çoğu uygulama için yapmanız gereken anlamına gelmez.
  2. Qt, bir C ++ kütüphanesi değildir. Yapı sürecini diğer kütüphanelerin çoğuyla karşılaştırıldığında daha karmaşık hale getiren ayrı bir derleme adımı gerektirir.
  3. (2) 'nin bir sonucu olarak, C ++ IDE'ler ve araçları Qt ifadelerini hata olarak işaretleyebilirler, çünkü Qt'nin özelliklerini anlamıyorlar. Bu neredeyse QtCreator veya bir metin editörü gibi sadece editör kullanımını zorlar vim.
  4. Qt, derlemeden önce kullandığınız herhangi bir makinede bulunması ve önceden yüklenmiş olması gereken büyük miktarda bir kaynaktır. Bu, inşaat ortamı oluşturmayı çok daha sıkıcı hale getirebilir.
  5. Yalnızca LGPL'de bulunur; bu, daha kısıtlayıcı veya daha az kısıtlayıcı bir lisans altında yayınlanması gerektiğinde tekli ikili dağıtımı kullanmayı zorlaştırır.
  6. Benzer şekilde yazılmış "düz ol 'yerel uygulamalar" (KDE için yazılmış ders uygulamaları hariç) ile karşılaştırıldığında son derece büyük derlenmiş ikili dosyalar üretir.

11
@Dumanumanizer: İşte LGPL lisansı ve ticari lisans var. Ticari lisans, lisans sahibinin adına binlerce dolardır ve yeniden dağıtımına izin vermez. kodlarını liberal bir lisans altında yayınlamak için, LGPL'ye bağımlılık makul değildir, ancak söz konusu geliştiriciler genellikle ticari lisans almaya hak kazanamazlar.
Billy ONeal

27
# 6, kaçınmamın en büyük nedeni. Demek istediğim, büyük, tıknaz bir program istemiyorum ve belirli bir lisansa bağlı kalmaktan hoşlanmıyorum, ama bu gerçekten benim için çok iyi, doğal bir görünüm ve his eksikliği. OSX ve Windows’un son sürümleri özellikle kendi yerel arayüzlerini güzel, hızlı ve işlevsel hale getirmek için harika bir iş çıkardılar ve benim için yaptıkları tüm çalışmalardan yararlanmayı tercih ettim; Yerli görünüşü olmayan pek çok programın bana ucuz ve saldırgan geldiğini hissediyorum (her zaman değil, ama beni biraz şaşırtıyor).
Greg Jackson

16
Numaranız 6 sayı 1. olmalıydı Bu gereğidir uzak Qt ile en büyük sorun. Çoğu durumda, yalnızca yerel API'leri kullanmaz. Yazılımımın yerel görünmesini seviyorum. Kullanıcılar da böyle. Qt ile oluşturulan ve bir Mac uygulaması gibi görünen bir Mac uygulaması hiç görmedim. Başka Mac kullanıcıları da yok ve bu tür şeyler konusunda titizler. Yalnızca yerel uygulamalar olmadığından, yalnızca yerel uygulamalar olduğu için Linux uygulamaları oluşturmak için kullanıyorsanız, platformlar arası olma avantajını kaybedersiniz.
Cody Gray

41
“yerli” bakış sorunu artık orada değil. Windows uygulamalarının eski tutarlılığı, şimdi WPF ve silverlight'ın sahip olabileceği benzersiz lekeler, parlamalar ve animasyonların temelini oluşturur. MSs'nin amiral gemisi ürününün bile bugünlerde tutarsız GUI'ye sahip olduğunu görmek için Office veya Windows 7 Kontrol paneline göz atın. Mac kullanıcıları - peki, çok geçerli bir noktaya değindiniz.
gbjbaanb

5
@TrevorBoydSmith: Üzgünüm ama yanılıyorsun. Qt, ön işleme kullanan tek çerçevedir. Dönemi. GNOME, FLTK, WX ve arkadaşlarına bakın ve bana bir ön işleme adımı gösterin. Bir tane bulamazsın. Bazı diğer kütüphaneler farklı yapı sistemlerine sahiptir, ancak günün sonunda herhangi bir C ++ derleyicisi tarafından oluşturulabilecek C ++ kütüphaneleridir. "Ham win32 benim nedenlerimde mevcut değil", # 5 ve # 6 gibi nedenlerimde mevcut.
Billy ONeal

115

İnsanların dediği gibi, her araç her soruna ve duruma uyar ...

Ama eğer C ++ programcısıysanız, Qt sizin çerçevenizdir. Rakip yok.

Karmaşık bir tıbbi görüntüleme ticari uygulaması geliştirdik ve Qt devam ediyor.

İnsanların bu konuda söyledikleri 'eksilerin' yanlış olduğunu söylemiyorum, ancak uzun bir süredir Qt'yu denemediklerini hissediyorum (her yeni versiyonda sürekli olarak iyileştiriliyor ...) Ve, çoğunlukla Dikkatli olursanız, yorumladıkları tüm konular sorun olmaz.

UI platformu tutarsızlığı: yalnızca UI widget'larını 'olduğu gibi' kullanırsanız, özelleştirmeden veya özel sanat olmadan.

Qt önişlemci aşırı yüklemesi: Sadece gerçekten ihtiyaç olmadığında sinyal yuvası mekanizmasını veya QObject devralmasını kötüye kullanıyorsanız.

Bu arada, biz hala uygulamaları C #. NET'te yazıyoruz ve uzun zamandır yapıyoruz. Bu yüzden bakış açısına sahip olduğumu düşünüyorum.

Dediğim gibi, her durum için her araç,

ama Qt şüphesiz tutarlı ve faydalı bir çerçevedir.


9
+1 Thaks! Sadece aynı şeyi yazmak istemiştim. En saçmalık "açık kaynak / ticari argüman" dır. Şaşırtıcı, ne kadar yanlış insan Açık Kaynak terimini anlıyor. Qt kullandığımdan beri Açık Kaynak'tı (1.4). Ve en adil lisansa sahipti: Qt -> ile para kazanın.
Valentin Heinitz

16
Oh ve gerçekten sanatın 50 MB ve :) video eğitimlerini ve verilerin 200 daha MBs içeren uygulamanın 10 MB dll ekleme hakkında UMURUMDA yok
Петър Петров

9
Qt için gerekli alan bugünlerde ucuz.
trusktr

5
Bu, Qt ile olan deneyimime çok uyuyor (widget çerçevesi, şimdiye kadar ciddi bir şey için QML / QtQuick'i kullanmadım). Karmaşık UI gereksinimleri ile büyük uygulamalar yazmak için uygundur. Öğrendikten sonra, çok üretken olabilirsiniz. Derleme sistemi (derleme adımı, kullanıcı arabirimi dosyaları vb. İçin ayrı derleme adımı), derleme sistemi uygun şekilde ayarlanmışsa sorun olmaz. Qmake veya cmake'yi önerebilirim.
Nils

QT 5.8'den sonra, Qt Lite adında bir proje var ve sizin özel ihtiyaçlarınız için QT miktarını en aza indirdi. Bu ticari bir özelliktir;)
SMMousavi

36

Qt ile ilgili sevmediğim her şey arasında, şablonlarla iyi oynamama durumu beni en çok rahatsız ediyor. Bunu yapamazsın:

template < typename T >
struct templated_widget : QWidget
{
  Q_OBJECT;

public signals:
  void something_happened(T);
};

Ayrıca önişlemciyle iyi oynamıyor. Bunu yapamazsın:

#define CREATE_WIDGET(name,type) \
struct name ## _widget : QWidget \
{ \
  Q_OBJECT; \
\
public signals: \
  void something_happened(type); \
}

Bu, bir sinyale yanıt veren her şeyin bir Q_OBJECT olması gerektiği gerçeğiyle karıştırıldığında, Qt'nin bir C ++ programcısı için çalışmasını zorlaştırır. Java ya da Python tarzı programlamaya alışkın olan insanlar muhtemelen daha iyi.

Aslında, geri dönüş sağlamanın ve herhangi bir functor nesnesine Qt sinyalini bağlamanın bir yolunu araştırmak ve geliştirmek için çok zaman ve çaba harcadım: http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals -in-qt adımlı-1.html

Orada yapmak istediğim tür, temelde, gerçekten de olsa, bugünlerde tamamen gereksiz olan Qt moc tarafından imkânsız olarak yapılan, her gün C ++ gelişimi.

Açıkçası, onunla sıkışmışım çünkü otomatik UI testi yapmak istiyorsanız, Qt şehirdeki MFC'den kısa olan tek oyundur ... ki bu çok 1980 (bu çok zor işte çok işe yaramaz). Bazıları WX diyebilir ama daha ciddi problemleri var. GTKmm benim ilk tercihim olacaktı, ancak sahibi tamamen çizildi ve erişilebilirlik yapmadığı için endüstri standardı test yazılımı tarafından kullanılamaz. Qt bu konuda yeterince zordur ( erişilebilirlik eklentisini değiştirdiğinizde zorlukla çalışır).


1
WX ile ilgili başlıca problemler nelerdir?
Tom Anderson

7
@Tom - özellikle yeni şeyler için kötü dokümantasyon. AUI bileşenleri, üretim bölümlerinde kullanılmasını zorlaştıran, büyük bölümlerin eksik olduğu ancak neredeyse belgelenmiştir. Olay sürecine ilişkin belgeler, en azından win32'de izlenen yol ile ilgili olarak temelde yanlıştır. Bilgisayara bağırmak için çok zaman harcadı, "Bu çalışıyor olmalı !!!" WX’in dokümanları takip etmediğini ve yaptığım şeyin ASLA işe yaramayacağını öğrenmek için derin işlem koduna geçmeden önce.
Edward Strange

1
Ayrıca mülk ızgara kütüphanesinin ana hatta kabul edilmesinden de rahatsız oldum. Bu kütüphaneyi kullandım ve onu yazan programcı adına (örneğin, kurucularda sanal fonksiyonlar denir) gerçek bilgi eksikliğine ek olarak, temel tasarım kusurlarını da gösterdim. Bu ve AUI’nin yoksul hali, daha zayıf standartlara yöneldi. Ayrıca, statik olay tablolarının büyük bir hayranı değilim, en azından olaylara cevap vermenin başka bir yolu var ... MFC'den farklı olarak, WX zaten heyecan verici olmaktan çok hoşlanıyor.
Edward Strange

Teşekkürler. Sadece biraz kullandım ve wxPython API'sı ile oldukça güzel görünüyordu. Bunun bazı kötülükleri gizleyeceğini, aynı zamanda daha ciddi sorunlara karşı koyacak kadar derin bir ilgim olmadığını da takdir ediyorum. Farkında olmak için bir şey.
Tom Anderson

1
sinyale cevap veren her şey bir Q_OBJECT olmalı, günümüzde hayır ... Şimdi, statik fonksiyonlar, fonksiyonlar ve hatta lambda fonksiyonlar bir sinyale cevap verebilir (fonksiyon işaretçilerini yuva olarak kullanabilirsiniz). No-QObject sınıflarında, örnek üyeyi bir işlev işaretçisine dönüştürmek için bir std :: bind kullanarak bunlara bağlanırsanız üye yuvaları da olabilir.
Vinícius A. Jorge

28

Qt kullanmamanın bir nedeni, Windows gibi yalnızca bir mimari için yazıyorsanız, C # /. NET (veya Mac’teki Kakao) kullanmak isteyebilirsiniz, çünkü her zaman en son çanlardan yararlanabileceklerdir. - İşletim sisteminin ihbarları.

Platformlar arası uygulamalar yazıyorsanız, Java gibi başka bir teknolojiye zaten katıldınız (yani bir "Java Mağazasında" çalışıyorsunuz). Teknoloji seçiminiz, dile özgü API'ler gibi geliştirmekte olduğunuz ekosistem tarafından belirlenebilir. Bu tür durumlarda, teknolojilerin sayısının en aza indirilmesi faydalı olabilir.

Aklıma gelebilecek üçüncü bir neden ise, Qt'nin C ++ 'a dayanıyor olması ve C ++' ın programlanması nispeten zor / tehlikeli bir dildir. Profesyoneller için bir dil olduğunu düşünüyorum. En yüksek performansa ihtiyacınız varsa ve titiz davranabiliyorsanız, C ++ muhtemelen şehirdeki en iyi oyundur. Aslında, Qt, kapsam dışında kalmaya karar verirseniz, bellek yönetimi sorunlarının çoğunu iyileştirir. Ayrıca, Qt'nin kendisi, kullanıcıyı kötü C ++ sorunlarının çoğundan yalıtmak için iyi bir iş çıkarır. Her dilin ve çerçevenin avantajları ve dezavantajları vardır. Genellikle, akşam yemeklerinde sıkça görülen advayla özetlenebilir, çok, çok karmaşık bir konudur: Hız, Kalite ve Fiyat (ancak sadece iki tane seçebilirsiniz).

Her ne kadar kurallar soruyu cevaplamaya odaklanmam gerektiğini söylese de, Billy ONeal tarafından ortaya konan sorunların bir kısmını tekrarlamak isterim.

  1. Qt gerçekten bir C ++ kütüphanesi / framework / başlık dosyalarıdır. Bu edilir artarDiğer birçok şeyin yanı sıra sinyalleri ve slotları etkinleştiren bir makro işlemci (moc) ile. Ek makro komutlarını (örneğin, Q_OBJECT gibi) dönüştürür, böylece sınıfların iç gözlemine ve C ++ 'a Objective-C işlevselliği ekleyebileceğini düşünebileceğiniz her türlü diğer özelliğe sahip olmasını sağlar. Eğer C ++ 'nın bu saflık eksikliğinden rahatsız olması için yeterince bilginiz varsa, yani bir profesyonel iseniz, o zaman 1) Q_OBJECT ve ilkini kullanmayın ya da 2) bunun için minnettar olun ve çok sınırlı köşe vakalarını programlayın bu bir soruna neden olur. "Sinyaller ve yuvalar için Boost kullanın!" Diyen kişiler için o zaman bir "problem" i diğeriyle değiştirdiğinizi hatırlatırım. Takviye çok büyük ve kötü belgeleme, korkunç API ve platformlar arası korku gibi sıkça anılan sorunları var (gcc 3 gibi eski derleyicileri düşünün).

  2. Editör desteği için bu da 1'den başlıyor, biraz katılıyorum. Aslında, Qt Oluşturan QH malzeme kullanmasanız bile, IMHO en iyi grafiksel C ++ editörüdür. Birçok profesyonel programcı emac ve vim kullanır. Ayrıca, Eclipse'in ek sözdizimini üstlendiğini düşünüyorum. Bu nedenle, Qt makrolarında (Q_OBJECT) veya sinyal / yuva eklerinde sorun yoktur. Muhtemelen bu makroları Visual Studio'da bulamayacaksınız, çünkü (katılıyorum) onlar C ++ 'a eklenmişlerdir. Ancak, C # /. NET millet, kendi özel teknikleri ile kapsanan birçok işlevselliğe sahip oldukları için Qt kullanmayacak.

  3. Qt kaynağının boyutuna gelince, bir gecede derlendiği sürece kimin umurunda? Qt 4'ü çift çekirdekli Macbook'umda "bir geceden az" olarak derledim. Umarım bu, belirli bir teknolojiyi kullanmaya ya da kullanmamaya karar vermenizin sebebi değildir. Bu gerçekten bir sorunsa, Mac, Linux ve Windows için önceden derlenmiş SDK'leri Qt web sitesinden indirebilirsiniz.

  4. Lisanslama, üç farklı seçeneğe sahiptir: 1) QT ITSELF’i değiştirmek ve paylaşmamak ya da Qt kullanıyor olmanız ve atıfta bulunmaya istekli olmamanız durumunda paylaşma ya da gizleme (marka ve imaj için çok önemli olabilir!) 2 ) GPL ve 3) LGPL. Evet, statik bağlantı ile ilgili sorunlar var (Qt'nin tümünü ikiliye yuvarlama) - ama bence daha fazlası, birinin içine göz atamadığı ve Qt (nitelik!) Kullandığınızı fark edemediği için. Digia'dan tescilli bir lisans almaya çalıştım ve bana "ne yaptığın için gerçekten ihtiyacın olmadığını" söylediler. Vay. Lisans satışı yapan bir işten.

  5. İkili / paketin boyutu, Qt malzemelerini sahip olmayan kişilere dağıtmanız gerektiği içindir: Windows zaten var mı? Visual Studio şeyler veya çalışma zamanı yüklemeniz gerekir. Mac zaten muazzam Kakao ile birlikte geliyor ve dinamik olarak bağlanabilir. Çok fazla dağıtım yapmamama rağmen ~ 50 megabayt statik dosyayı dağıtma konusunda fazla sorun bulamadım (ki bu da UPX gibi bazı ikili striptizci / sıkıştırma araçlarıyla daha da küçültebilirim). Bunu yapacak kadar umurumda değil, ama eğer bant genişliği bir sorun olsaydı, derleme betiğime UPX adımı eklerdim.

  6. "Doğal Görünüm ve Hissi" ne tanımlar? Bence "çoğu", Mac'in birleşik görünüm ve hislere en yakın olduğu konusunda hemfikir olur. Ancak burada oturup Safari, iTunes, Diyafram, Final Cut Pro, Pages vb. Sayfalarına bakıyorum ve işletim sistemi sağlayıcısı tarafından yapılmış olmalarına rağmen hiçbir şeye benzemiyorlar. Bence "hissetme" yönü daha alakalı: Widget stilleri, yanıt verebilirlik, vs. Yanıt verebilirliği önemsiyorsanız, burada Java yerine C ++ ya da diğer oldukça dinamik bir dil kullanmak için iyi bir neden. (Amaç C de kayalar, ancak Qt ile ilgili mitleri ortadan kaldırmaya çalışıyorum)

Özet olarak, bu karmaşık bir konudur. Ancak, efsanelere ve on yıllık güncel bilgilere dayanarak düşünebileceği gibi “Qt” kullanmamanın daha az neden olduğunu düşündüğümü belirtmek isterim.


1
Anlamadığım şey, bu çapraz platform kütüphanelerinin neden sadece sarmalayıcı olmadıklarını ve hatta daha iyi olmadıklarını; Cocoa, Win32, KDE / Gnome fonksiyonlarındaki hatalar, tüm özellikleriyle en iyi görünümlü kullanıcı arayüzü sağlar.
MarcusJ

2
@MarcusJ Bir araç takımının etrafına bir sarmalayıcı yazmak kesinlikle önemsiz değildir, boşver 4 veya daha fazla - ama bu kadar kolay olduğunu düşünüyorsanız, deneyebilirsiniz. Bunun yalnızca şartlı ön işleme kullanarak elde edilebileceği fikriyle ilgili olarak ... şaka yapıyor olmalısınız, değil mi?
underscore_d

@MarcusJ libui tam olarak budur (KDE desteği olmasa da).
Demi

Artık Qt / QML'yi .NET ile kullanabileceğinizi eklemek istiyorum. C ++ 'a dokunmanıza gerek yok. github.com/qmlnet/qmlnet PS: Ben yazarım.
Paul Knopf

26

Bazıları lisans veriyor. Bkz https://en.wikipedia.org/wiki/Qt_(software)#Licensing lisans tarihinin bazıları için. 2000 yılına kadar açık kaynaklara önem veren insanlar Qt kullanmamışlardı. Dönemi. (Bu aslında Gnome'un geliştirilmesinde asıl motivasyondu.) 2005 yılına kadar, Windows için özgür yazılımları serbest bırakmak isteyen insanlar Qt kullanmıyorlardı. Bu tarihten sonra bile, GPL dışında bir yazılım altında özgür yazılım isteyen insanlar, sadece Qt kullanma seçeneğine sahip değildi. Bu nedenle, bu tarihten daha eski herhangi bir özgür yazılım projesi Qt kullanamadı. Ve elbette, özel kod yazan insanlar ayrıcalık için para ödemek zorunda kaldı.

Ayrıca, başka seçeneklerin bir sıkıntısı varmış gibi görünmüyor. Örneğin , WxWidgets , GTK + ve Tk hepsi açık kaynaklı, çapraz platform araç takımlarıdır.

Üstelik uzun süredir Windows masaüstünde o kadar baskındı ki, birçok yazılım yalnızca Windows üzerinde çalışacaktı. Microsoft araç zincirini takarsanız, Microsoft'un mülkünü kullanmak başka bir şey için endişelenmekten daha kolaydır ve birçok programcı da bunu yaptı.


1
@btilly: GTK + çapraz platformdur. Örneğin, Pidgin IM istemcisi GTK + 'da yazılmıştır.
Billy ONeal

1
Tamam, ancak, bir şekilde Windows'ta çalıştırmak 'bir şekilde' mümkündür :)
Dehumanizer

6
Windows’a GIMP’i yükleyin ve bir göz atın.
user281377

2
Evet ve GIMP Windows'ta iyi çalışıyor, ancak kesinlikle Windows 7 UI görünümüne ve kullanımına uymuyor.
Alan B,

5
Pidgin muhtemelen Windows’ta daha iyi bir GTK örneği. Fantezi bir şey yapmaz, ancak 10 yıl veya daha uzun süredir uyuyor mu?
Brendan Long

14

Yukarıda tartışılan nedenlerin neredeyse hepsine katılıyorum, ancak buradaki birçok kişi, beraberinde getirdiği fazladan masraflar nedeniyle Qt kullanmayacaklarını söyledi. Buna katılmıyorum, çünkü bugün en yaygın dillerin tümü (Java, C # ve Python) oldukça fazla bir ek yük taşıyor.

İkincisi, Qt, C ++ ile programlamayı o kadar kolay ve yalındır, kullandığı ek kaynaklar için yapar. Yazma kolaylığı nedeniyle standart C ++ yerine Qt ile yazılmış birkaç konsol uygulamasına rastladım.

Qt'nin verimliliğinin C / C ++ 'dan yüksek, ancak Python gibi dilden az olduğunu söyleyebilirim.


2
Sanırım hepsi bireyin deneyimine bağlı, çünkü C ++ 14'te Tamam kodlayabilirim, ancak her Qt koduna her baktığımda, aynı dil olarak tanımak için sert bir şekilde kısmak zorunda kalıyorum ... Burada ima ettiğin oybirliğiyle verimlilik artışı olduğunu sanmıyorum.
underscore_d

1
@underscore_d açıkça C ++ 'ı çok iyi tanıyorsanız ve Qt bilmiyorsanız, ikincisi ile daha üretken olmayacaksınız. Ancak hem C ++ hem de Qt ile tanıştığınızda, çerçeve gerçekten birçok şeyi daha kolay ve daha hızlı hale getiriyor (C ++ 11, 14 vb. Boşluğu dolduruyor, ancak henüz tam değil).
ymoreau

11

Bu gerçekten bir alev savaşı başlatma çabası değil, sadece bazı noktalara değinmek istedim.

Muhtemelen Qt'nin daha yaygın kullanılmamasının asıl nedeni, C ++ ve daha az kişinin c ++ 'ı masaüstü uygulamaları için kullanmasıdır.

Qt, bir C ++ kütüphanesi değildir. Yapı sürecini diğer kütüphanelerin çoğuyla karşılaştırıldığında daha karmaşık hale getiren ayrı bir derleme adımı gerektirir.

Visual Studio için vs-addin bunu otomatik olarak Qt'un kendi komut satırının yaptığı gibi yapar. MFC için diyaloglar oluşturmak için kullanılan kaynak derleyici de ayrı bir adım ama yine de c ++.

Qt, derlemeden önce kullandığınız herhangi bir makinede bulunması ve önceden yüklenmiş olması gereken büyük miktarda bir kaynaktır. Bu, inşaat ortamı oluşturmayı çok daha sıkıcı hale getirebilir.

Her görsel stüdyosunun sürümü için ikili bir indirme var ve kaynaktan derleme tek bir komut. SDK kaynak boyutunun bugünlerde çok fazla bir şey olduğunu görmüyorum. Visual studio şimdi seçip seçmenize izin vermek yerine tüm C ++ lib'lerini yükler, bunun sonucunda derleyicinin yükleme boyutu> 1 Gb'dir.

Yalnızca LGPL'de bulunur; bu, daha kısıtlayıcı veya daha az kısıtlayıcı bir lisans altında yayınlanması gerektiğinde tekli ikili dağıtımı kullanmayı zorlaştırır.

LGPL sadece lib için geçerlidir, kodunuzu etkilemez. Evet, tek bir ikili dosyadan ziyade DLL'leri göndermeniz gerektiği anlamına gelir (ödeme yapmazsanız), fakat küçük bir kullanım için Java çalışma zamanı veya. Ayrıca, tek bir ABI'ye sahip platformlarda da sorun yok, böylece diğer Qt uygulamaları lib'leri paylaşabilir.

Bazı durumlarda, yerel programların göründüğü gibi görünmüyor. Tüm platformlar için doğal olarak tek bir UI tasarlamak, çeşitli görsel şekillendirme nedenleriyle makineden makineye taşınırken doğru görünmeyecektir.

Yerel aletler ve temalar kullanması gerekiyordu. Çoğunlukla teknik uygulamalar yaptığımı itiraf etmeliyim ki kullanıcılarım stil konusunda fazla endişelenmiyorlar. Özellikle pencerelerde her şeyin bir akıllı telefon widget'ı olarak stil sahibi olmasının yeni modası, yine de bir standardın daha az olduğu anlamına geliyor.


1
Oldukça fazla sayıda büyük yazılım şirketi C ++ 'da ticari uygulamalar geliştiriyor ancak QT kullanan çok fazla kişi bilmiyorum. Bu nedenle, C ++ olmayan geliştiricilerin QT'den kaçabileceğini anlasam da, C ++ uygulaması yazarken bile QT'yi engellemenin başka nedenleri de var gibi görünüyor. Aslında, gerçekten hata bulamadığım herhangi bir çapraz platform dili ve GUI araç takımı yok. Platformlar arası geliştirmenin SADECE DÜZ ZORLUĞU olduğu ve bunu iyi yapmanın hiçbir zaman kolay veya ücretsiz olmadığı ve QT'nin verdiği sözü (GUI'nizi bir kez yazın ve bu GUI'yi her yerde yeniden kullanın) yeterli olmadığı görülüyor.
Warren P,

Masaüstü C ++ yazılımının çoğu, MFC'de (örneğin MS-Office veya Autocad gibi) 20 yıl önce başlayan veya 20 yıl önce başlayan bir iç araç takımı kullandığından MFC'dedir. C ++ / CLR'da WPF ile yazılmış olduğundan çok şüpheliyim. Ancak platformlar arası düşünceler olmadan bile Qt'yi en iyi (ya da en az en kötü!) Masaüstü araç setini buluyorum. Çoğu insan gibi, webby ön ucuna (muhtemelen QtQuick / QML'de) ve C ++ sunucu arka ucuna doğru ilerliyoruz - muhtemelen Qt sinyallerini / yuvalarını kullanacak ancak gui kullanmayacak
Martin Beckett

Katılıyorum. En kötüsü Ve yalnızca Windows uygulamalarında bile, MFC sorunlarından ziyade QT hatalarını ayıklamayı tercih ederim.
Warren P

@WarrenP - evet MFC'den eksik olan her şey için kod projeyi aramayı özlemiyorum. Ancak MSFT’nin yeni yerel kod sevgisi ile birlikte - bir GUI yazmayı kolaylaştıracak çok şey yapmadılar.
Martin Beckett

7

Sebep basittir: tüm ana dillere iyi bağları yoktur ve eldeki iş için sihirli bir şekilde her zaman uygun değildir .

İş için doğru aracı kullanın. Basit bir komut satırı uygulaması yazıyorsam, neden sadece bunun uğruna Qt ile şişireyim ki?

Daha genel bir cevap olarak (ki burada ilgimi çekebildiğim için verebilirim), bazı programcılar bunu asla bırakmamış ve kullanmaya karar vermişlerdir. Bazı durumlarda, programcının hiçbir zaman buna ihtiyaç duymadığı ve araştırdığı dışında özel bir sebep yoktur.


1
Ancak Qt, yalnızca konsol uygulaması yazma yeteneği sağlar. Öyle değil mi?
Dehumanizer

9
@ Dumanizer: Hiçbir fikrim yok. Ama neden bunu küçük bir yardımcı program aracı için kullanayım? Sadece standart C ++ 'da uygulamayı önemsiz bir şekilde yazabilmem bana ne yararı olur? Programlamayı geri almanın bir yolu olan bir kütüphaneyi kullanmak için bir sebep aradığınız anlaşılıyor .
Orbit'teki Hafiflik Yarışları

12
@Dumanumanizer: Dediğim gibi, bu geriye dönük bir yaklaşım. Bir kütüphaneye ihtiyaç duyduğunuzda, anlarsınız ve sonra bir kaçını deneyebilir ve ihtiyacınıza en uygun olanı görebilirsiniz. Bir kullanım vakanız olmadığında bir kütüphane hakkında fikir toplamaya çalışmak bir aptalın görevidir.
Orbit'teki Hafiflik Yarışları

3
"Eğer basit bir komut satırı uygulaması yazıyorsam, neden sadece bunun uğruna Qt ile o kadar
şişireyim ki"

4
@Dumanumanizer, örneğin dosyaları, xml, unicode, json, regexp, concurency, veritabanları vb.
Valentin Heinitz

5

Eğer ürün seyir için uğraşıyorsanız zaman Qt gibi Çerçeveleri uygun aynı ürününüz seyir ile daha tüm platformlarda doğru tüm platformlarda. Günümüzde giderek daha sık, bu tür uygulamalar web tabanlı teknolojilere geçiyor.


4

Qt'nin çalışmak için iyi bir çerçeve olduğuna katılıyorum. Yine de, onunla ilgili birkaç sorun var:

  1. Gerçekten düşük seviyeli bir dil olan C ++ dilinde yazılmıştır. Tek başına C ++ olması, her Qt programcısını diğer dillerde yazılmış Altyapılara kıyasla çok daha az verimli hale getirecek. Bir GUI geliştirme dili olarak C ++ ile olan ana etim, otomatik bellek yönetimi kavramının yanında olmaması ve geliştirme sürecini hatalara daha yatkın hale getirmesidir. Hata ayıklamayı çok daha zor hale getiren iç içe geçmiş değildir. Diğer ana GUI araç setlerinin çoğunda, bazı otomatik bellek yönetimi ve iç gözlem kavramı vardır.
  2. Her platformlar arası araç kiti, desteklenen platformların yalnızca en az ortak paydasını uygulayabilmesi probleminden muzdariptir. Bu ve farklı platformlardaki farklı UI yönergeleri, bir bütün olarak platformlar arası GUI'lerin arzu edilebilirliğini çok fazla sorgulamaktadır.
  3. Qt, tüm kullanıcı arabiriminizi kodlamak üzerinde yoğunlaştı. Eğer rağmen edebilirsiniz senin UI bazı kısımlarını oluşturmak için QtDesigner kullanmak, ciddi karşılaştırması, diyelim ki, (Kakao / Obj-C) Arayüz Oluşturucu veya .Net araçları yoksundur.
  4. Qt birçok düşük seviye uygulama işlevselliği içermesine rağmen, belirli bir platform için özel olarak tasarlanmış bir çerçeveye sahip olmasıyla karşılaştırılamaz. Hem Windows hem de OSX için yerel işletim sistemi kitaplıkları, Qt'nin uygulamalarından çok daha güçlü. (Ses çerçeveleri, düşük seviyeli dosya sistemi erişimi vb.

Bu, hızlı uygulama prototipleme veya şirket içi uygulamalar için PyQt'u kullanmayı seviyorum. Tüm kodlamaları yapmak için Python kullanmak, C ++ ile ilgili endişeleri hafifletir ve Qt'yi gerçekten çok hoş bir yer yapar.


Bazı yorumlara yanıt olarak düzenleyin:

Qt'nin C ++ 'da yazıldığından bahsettiğimde, Qt'un kendisinden çok şikayet etmiyordum, yaşadığı çevre hakkında daha fazla şikayet ediyordum. Qt'un kendi kaynaklarını çok iyi yönettiği, ancak GUI ile ilgili tüm ama Qt kodunun C ++ 'da da yazılması gerekir. Orada bile, Qt pek çok güzel araç sunuyor, ama sonuçta, C ++ ile o seviyede başa çıkmak zorundasın. Qt, C ++ 'ı katlanabilir kılar, ancak yine de C ++' dır.

İç içe girme gelince, demek istediğim şudur: Hata ayıklamak en zor durumlarda, olması gerektiği gibi davranmayan bir nesneye bir işaretçi varken. C ++ ile hata ayıklayıcınız bu nesnenin içine biraz bakabilir (bu, tür bilgisinin olması durumunda), ancak bu her zaman işe yaramaz bile. Öte yandan, aynı durumda Kakao alın. Cocoa / Obj-C'de, hata ayıklayıcısındaki bir nesneye mesajlar ('çağrı işlevleri') gönderebilirsiniz. Nesnelerin durumunu değiştirebilir, niteliklerini sorgulayabilir, türünü ve işlev adlarını isteyebilirsiniz ... Bu hata ayıklamayı çok daha kolaylaştırabilir. Qt / C ++ 'ın buna bile yakın bir şeyi yok.


11
1. Kendi başına bellek yönetimine önem veriyor, her 'yeni' den sonra 'delete' (sil) demeniz gerekmiyor. 1 A. C ++ düşük seviyeli bir dil DEĞİLDİR, düşük seviyeli 'yetenekleri' olan yüksek seviyeli bir dildir. 3. Katılıyorum, ancak Qt, QtDesigner ve aynı zamanda 'düz kod' ile kullanıcı arayüzü oluşturmayı sağlıyor. 4. Yine katılıyorum, ancak Qt ayrıca yerel API'lerin kullanılmasını da sağlıyor.
Dehumanizer

11
1 nolu noktanıza göre. c ++ 'ın bir tür yarı-otomatik bellek yönetimi olduğunu düşünüyorum: std :: auto_ptr veya boost :: shared_ptr vb. gibi akıllı işaretçiler kullanırsanız, genellikle belleği boşaltmakla ilgilenmezsiniz. Bu tür kaplar diğer kaynaklar için de yapılabilir (dosyalar, serbest bırakılması gereken sistem kaynakları). RAII-deseninin kullanılması, bellek yönetimine çok yardımcı olur ve sizin için büyüdükçe, gerçekten bellek için endişelenmenize gerek kalmaz.
deo

8
“Yalnızca C ++ olması, her Qt programcısını diğer dillerde yazılmış Altyapılara kıyasla çok daha az verimli hale getirecek.” [kaynak belirtilmeli]
Nathan Osman

4
@ SK-mantık: Üçüncü cümle içindeki tüm kelimeleri anladığımı sanırken, ne söylediğin hakkında hiçbir fikrim yok. "Soyutlama sınırı" nedir? Bu konuda, "düşük seviyeli dil" in Wikipedia tanımı göz önüne alındığında, ilk cümleniz yanlıştır.
David Thornley

6
@ SK-mantık: Şablon metaprogramlaması Turing tamamlandı ve bundan yararlanacak kadar akıllı ve bilgili insanlar var. RAII, büyük bir çöp toplama değildir, ancak her türlü kaynak için az ya da çok çalışmaktadır. Şimdi, özellikle, Java'da ne tür bir soyutlama çalışıyor ancak C ++ değil?
David Thornley 19:11

3

Qt'yi gerçekten seviyorum, ancak birçok uygulama için biraz ağır. Bazen bu karmaşıklık seviyesine ihtiyaç duymazsın. Bazen sadece tüm Qt yükü olmadan basit bir şeye ihtiyacınız olur. Her uygulamanın olaya odaklı olması gerekmez ve C ++ makul bir şablon kümesi sağlar. Boost, başka bir çok iyi set sağlar ve QT'nin yaptığı birçok düşük seviye işlevsellik (dosya, soket, yönetilen işaretçiler vb.) İçerir.

Diğer uygulamaların GPL, LGPL veya Qt ticari lisansıyla iyi oynamayan lisans gereksinimleri vardır. GPL ticari yazılımlar için uygun değildir. LGPL, statik olarak bağlı yazılımlar için uygun değildir ve ticari lisans, birçoğunun ödemek istemediği bir şeydir.

Bazılarının Qt gibi karmaşık kütüphanelere izin vermeyen güvenlik veya istikrar konuları var.

Kaynaklarınızı önceden işlemek için moc çalıştırmanız gerekir. Bu büyük bir sorun değil, ama yeni kullanıcı için zor olabilir. Birçok programcı qmake ile Qt kullanmanız gerektiğini düşünüyor , ancak bu bir yanlış isim. Qt'yi diğer yapı sistemlerine kolayca bağlamak mümkündür.

Bazı hedefler çok hafıza veya CPU kısıtlıdır.

İçinde platforma özgü bazı kazançlar var. Bu yakalananların çoğu belgelenmemiş. Yeterince büyük bir uygulama oluşturun ve bunlarla karşılaşacaksınız ve neler olup bittiğini merak edeceksiniz (feragatname, Qt'u öfkeyle en son kullandığımda 18 aydan fazla oldu, bu yüzden daha da iyileşmiş olabilir).

Sadece C ++. Diğer dil ciltleri var, ancak Qt için istediğiniz işlevselliğin birçoğunu gizlemeye ya da zayıf olarak göstermeye meyillidirler.

Qt kullanmamak için birçok neden var, bu yüzden alternatifler var. Sahip olduğun tek şey bir çekiçse, o zaman her sorun bir çiviye benzeyecek.


3

En önemlisi ama belirtilmeyen şey. Büyük projede bir şey çok fazla soruna ve gerekli olmayan kodlara neden olur. Qt'ın sinyal yuvası mekanizmaları yetersiz. Qt widget'ları olay basit widget'ları için gerekli sinyalleri sağlamaz. Örneğin, onHover, onMouseEnter, onMouseLeave, onKeyReleased, onLostFocus, onGainFocus vb. İçin sinyalleri ayarlayamazsınız. QTreeWidget gibi en karmaşık widget bile bir veya iki ultra basit işe yaramaz sinyal sağlar.

Evet, ancak olayları kullanabilirsiniz !!! Özel bir etkinliğe sahip her widget için yeni bir sınıf oluşturdunuz. Bu büyük verimlilik kaybı;

  • Her özelleştirilmiş widget nesnesi olayını yeniden yazdınız, küçük değişiklikler yapıldı.
  • Tüm Qt Designer ürünlerini kaybettiniz. Her widget'ı özel etkinliklerle tanıtmalısınız.
  • Proje daha büyük ve sürdürülmesi zorlaştı.
  • Bundan dolayı qt'yi beğenmedin. Net'in delegelere nasıl sağladığı, sinyal yuvasından çok daha iyi olduğu, .net bileşenlerinin (widget'lar) genellikle hayal edebileceğiniz her olayı nasıl sağladığı hakkında konuşmaya başlayın. Ve benzeri.

Üniversitemden biri, her bir açılan kutu widget'ı için yeni bir açılan kutu sınıfı yazdı, çünkü bazı işaret dışı olayları kullanmak zorunda kaldı. Gerçek hikaye...

Ancak, Qt, şimdiye kadar iniş ve çıkışlarla en iyi C ++ UI çerçevesidir.


Olaylarla ilgili olarak ve yeni sınıflar oluşturma: Olay filtrelerini, kendilerine tepki vermesi gereken sınıflarda kullanabilirsiniz.
MrFox

“Evet, olayları kullanabilirsiniz, ancak özel olaylarla her widget için yeni bir sınıf oluşturdunuz. Bu büyük bir verimlilik kaybı;” - TAM OLARAK DEĞİL. Birkaç widget'ı işleyen bool eventFilter ile bitirdim ve daha sonra tüm alt gereçlere EventFilter (this) yükledim. Ve bu verimlilik ve programlama performansını kaybetmiyor! Asla "Terfi edilen widget'ları" kullanmıyorum ... Sadece boş bir widget'ı bıraktım, bunu üzerine eventFilter olarak yükledim ve olaylarımın çoğunu ana cpp sınıfımın içine yeniden yerleştiriyorum. Deneyin, acı vermedi :) Her zaman yeni sınıflar oluşturmadan
Qt'da

3

kendi düşünceme göre, C ++ programlarını öğrenmek karmaşıklıklarını gizleyen diğer dillere düşmekten daha kolaydır ve programcı arka planda gerçekte ne olduğunu bilmiyor. Diğer taraftan, Qt, C ++ 'a doğal faydalar kazandırmak için C ++' a göre bazı avantajlar sağlar. Bu nedenle, Qt C ++, düşük seviyeli görevler veya aynı seviyede üst düzey görevler geliştirmek isteyenler için mükemmel bir çerçevedir. C ++ (bazı uygulamalara göre) karmaşık ve basit bir dildir. Onunla meydan okumayı istemeyen için karmaşık, onu sevenler için basit. Bunu karmaşıklığı için bırakma!


2

Asıl sebep teknik değil.

İnsanlar farklı oluyor. Seçimleri de öyle. Tekdüzelik bir insan özelliği değildir.


Tüm insanlar bu yüzden mi bacaklarının üstünde yürür? En azından bacakları olanlar ...
dtech
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.