Mengapa tidak lebih banyak aplikasi desktop yang ditulis dengan Qt? [Tutup]


202

Sejauh yang saya tahu dan mengerti dalam pengalaman saya dengan Qt, itu adalah perpustakaan yang sangat bagus dan mudah dipelajari. Ini memiliki API yang dirancang dengan sangat baik dan bersifat lintas platform, dan ini hanyalah dua dari banyak fitur yang membuatnya menarik. Saya tertarik untuk mengetahui mengapa lebih banyak programmer tidak menggunakan Qt. Apakah ada kekurangan yang menentangnya? Fitur mana yang membuat perpustakaan lain lebih baik daripada Qt? Apakah masalah terkait dengan perizinan?


60
Ini asli C ++. Sebagian besar pengembang lebih suka bahasa tingkat yang lebih tinggi seperti C #.
user16764

15
Pedang bermata dua dari kompatibilitas mundur telah meninggalkan Qt dengan banyak anakronisme, cacat yang tidak dapat diperbaiki, dan perilaku buruk lainnya.
edA-qa mort-ora-y

26
@ user16764: "Paling"?
Lightness Races in Orbit

17
Saya tidak berpikir indeks TIOBE adalah ukuran yang sangat akurat, karena mengukur popularitas, bukan penggunaan. Membandingkan jumlah kode dalam repositori open source seperti GitHub, Bitbucket, Codeplex, dan Sourceforge akan memberikan pengukuran yang lebih akurat. (Dan saya percaya bahwa pengukuran yang lebih akurat menempatkan C dan C ++ di # 1 dan # 2 spot - Java memiliki keuntungan yang tidak adil dalam indeks TIOBE karena digunakan untuk kursus mahasiswa baru, dan programmer baru membuat lebih banyak gebrakan daripada yang berpengalaman)
Billy ONeal

12
@Iorgio: Erm, Anda harus memikirkan hal-hal seperti itu di C #. Konsep "siapa yang memiliki ini" jauh melampaui "siapa yang memanggil delete". Fakta bahwa pointer cerdas membuat eksplisit itu bukan bahasa gagal; dan jika Anda tidak memikirkan hal-hal seperti itu, Anda akan menghasilkan sampah dalam bahasa tingkat tinggi apa pun yang pernah saya lihat.
Billy ONeal

Jawaban:


177

Saya tidak benar-benar bermaksud ini menjadi jawaban bashing, tetapi ini adalah alasan saya tidak secara pribadi menggunakan Qt. Ada banyak hal baik untuk dikatakan tentang hal itu - yaitu bahwa API berfungsi sebagian besar waktu, dan bahwa itu menjembatani platform dengan mulus. Tapi saya tidak menggunakan Qt, karena:

  1. Dalam beberapa kasus, sepertinya program asli tidak terlihat. Merancang UI tunggal untuk semua platform secara inheren tidak akan terlihat benar ketika dipindahkan dari mesin ke mesin, karena berbagai alasan gaya visual. Misalnya, pada mesin Mac, bilah split biasanya relatif tebal, dan tombolnya kecil dan bulat dengan ikon. Pada mesin Windows, split bar biasanya sempit, dan tombol lebih tekstual, dengan desain lebih persegi. Hanya karena Anda dapat menulis satu UI untuk setiap platform tidak berarti Anda harus melakukannya untuk sebagian besar aplikasi.
  2. Qt bukan pustaka C ++. Ini membutuhkan langkah kompilasi terpisah, yang membuat proses pembuatan jauh lebih rumit jika dibandingkan dengan kebanyakan perpustakaan lain.
  3. Sebagai hasil dari (2), C ++ IDE dan alat dapat menandai ekspresi Qt sebagai kesalahan, karena mereka tidak memahami spesifikasi Qt. Ini hampir memaksa penggunaan QtCreator atau editor teks saja vim.
  4. Qt adalah sejumlah besar sumber, yang harus ada dan diinstal pada mesin yang Anda gunakan sebelum mengkompilasi. Ini dapat membuat pengaturan lingkungan bangunan jauh lebih membosankan.
  5. Ini hanya tersedia di bawah LGPL, yang membuatnya sulit untuk menggunakan penempatan biner tunggal ketika seseorang perlu merilis dengan lisensi yang lebih ketat atau kurang ketat.
  6. Ini menghasilkan kompilasi biner yang sangat besar bila dibandingkan dengan "aplikasi asli polos" yang ditulis dengan cara yang sama (kecuali tentu saja aplikasi yang ditulis untuk KDE).

11
@Dehumanizer: Ada lisensi LGPL, dan ada lisensi komersial. Lisensi komersial adalah ribuan dolar dari pihak penerima lisensi, dan tidak mengizinkan redistribusi, dll. Untuk proyek open source di bawah lisensi liberal seperti BSD, MIT, atau Boost, di mana penulis tidak menghasilkan banyak uang dan mereka berharap untuk merilis kode mereka di bawah lisensi liberal, ketergantungan pada LGPL tidak masuk akal, tetapi pengembang yang dimaksud umumnya tidak mampu membeli lisensi komersial.
Billy ONeal

27
# 6 adalah alasan terbesar aku menghindarinya. Maksud saya, saya tidak ingin program yang besar dan kikuk, dan saya tidak suka terikat pada lisensi tertentu, tapi itu benar-benar kurangnya tampilan dan perasaan asli yang baik yang merupakan pemecah kesepakatan bagi saya. Versi terbaru OSX dan Windows secara khusus telah melakukan pekerjaan yang fantastis untuk membuat antarmuka asli mereka cantik, cepat, dan fungsional, dan saya lebih suka memanfaatkan semua pekerjaan yang telah mereka lakukan untuk saya; Saya menemukan bahwa banyak program tanpa tampilan asli terasa murah dan meretas bagi saya (tidak selalu, tetapi sedikit membingungkan saya).
Greg Jackson

16
Nomor Anda 6 seharusnya nomor 1. Ini adalah jauh masalah terbesar dengan Qt. Dalam banyak kasus, itu tidak menggunakan API asli. Saya suka perangkat lunak saya terlihat asli. Pengguna seperti itu juga. Saya belum pernah melihat aplikasi Mac yang dibuat dengan Qt yang tampak seperti aplikasi Mac. Tidak ada pengguna Mac lain, dan mereka pilih-pilih tentang hal semacam itu. Anda kehilangan semua manfaatnya karena menjadi "lintas platform" jika Anda hanya menggunakannya untuk membuat aplikasi Linux, yang merupakan satu-satunya tempat yang terlihat asli karena sebenarnya tidak ada yang asli.
Cody Grey

41
kecuali masalah tampilan 'asli' sudah tidak ada lagi. Konsistensi lama aplikasi Windows sekarang merupakan bastardisasi dari apa pun gumpalan, cahaya dan animasi unik yang WPF dan silverlight berikan. Lihatlah Office atau panel Kontrol Windows 7 hanya untuk melihat bagaimana bahkan produk unggulan MSs memiliki GUI yang tidak konsisten saat ini. Pengguna Mac - well, Anda memiliki poin yang sangat valid di sana.
gbjbaanb

5
@ TrevorBoydSmith: Maaf, tapi Anda salah. Qt adalah satu-satunya kerangka kerja yang menggunakan preprocessing. Titik. Periksa GNOME, FLTK, WX, dan teman-teman, dan tunjukkan saya langkah persiapan awal. Anda tidak akan menemukannya. Beberapa pustaka lain datang dengan sistem build yang berbeda, tetapi pada akhirnya, mereka adalah pustaka C ++ yang dapat dibangun oleh kompiler C ++ apa pun. Adapun "Win32 mentah tidak hadir di alasan saya", itu hadir dalam alasan saya sebagai # 5 dan # 6.
Billy ONeal

115

Seperti yang dikatakan orang, setiap alat cocok untuk setiap masalah dan situasi ...

Tetapi jika Anda adalah programmer C ++, Qt adalah kerangka kerja Anda. Tidak ada saingan.

Kami mengembangkan aplikasi komersial pencitraan medis yang kompleks, dan Qt bertahan.

Saya tidak mengatakan bahwa 'kontra' yang dikatakan orang tentang itu salah, tetapi saya merasa bahwa mereka tidak pernah mencoba Qt untuk waktu yang lama (terus meningkat pada setiap versi baru ...) Dan, sebagian besar semua masalah yang mereka komentari bukan masalah jika Anda berhati-hati.

Inkonsistensi platform UI: hanya jika Anda menggunakan widget UI 'sebagaimana adanya', tanpa penyesuaian atau seni khusus.

Qt preprocessor overload: Hanya jika Anda menyalahgunakan mekanisme slot sinyal, atau pewarisan QObject, ketika tidak ada yang benar-benar diperlukan.

Omong-omong, Kami masih menulis aplikasi dalam C # .NET, dan sudah melakukannya sejak lama. Jadi saya pikir saya memiliki perspektif yang lebih baik.

Seperti yang saya katakan, setiap alat untuk setiap situasi,

tetapi Qt tidak diragukan lagi merupakan kerangka kerja yang konsisten dan bermanfaat.


9
+1 Thaks! Saya hanya ingin menulis yang sama. Omong kosong adalah "argumen non-open source / komersial". Mengagumkan, betapa salahnya banyak orang memahami istilah Open-Source. Qt adalah Open-source sejak saya menggunakannya (1.4). Dan dulu memiliki lisensi paling adil: dapatkan uang dengan Qt -> pay.
Valentin Heinitz

16
Oh dan saya benar-benar TIDAK PEDULI tentang menambahkan 10 MB DLL ke aplikasi yang berisi 50 MB karya seni dan 200 MB video tutorial dan data lainnya :)
Петър Петров

9
Ruang yang dibutuhkan untuk Qt murah hari ini.
trusktr

5
Ini cukup sesuai dengan pengalaman saya dengan Qt (kerangka kerja widget, saya belum pernah menggunakan QML / QtQuick untuk hal yang serius sejauh ini). Sangat cocok untuk menulis aplikasi besar dengan persyaratan UI yang kompleks. Setelah Anda mempelajarinya, Anda bisa menjadi sangat produktif. Kontra tersebut (langkah kompilasi terpisah untuk moc ing, file ui, dll) tidak menjadi masalah jika sistem build sudah diatur dengan benar. Saya dapat merekomendasikan qmake atau cmake.
Nils

dari Qt 5.8 sesudahnya ada proyek bernama Qt Lite yang meminimalkan Qt sangat untuk kebutuhan spesifik Anda. ini adalah fitur komersial;)
SMMousavi

36

Dari semua hal yang saya tidak suka tentang Qt, fakta bahwa itu tidak bermain dengan baik dengan template yang paling mengganggu saya. Anda tidak dapat melakukan ini:

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

public signals:
  void something_happened(T);
};

Itu juga tidak cocok dengan preprocessor. Anda tidak dapat melakukan ini:

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

Itu, bercampur dengan fakta bahwa segala sesuatu yang merespon sinyal haruslah Q_OBJECT, membuat Qt sulit untuk bekerja untuk seorang programmer C ++. Orang yang terbiasa dengan pemrograman gaya Java atau Python mungkin lebih baik sebenarnya.

Saya benar-benar menghabiskan banyak waktu dan usaha untuk meneliti dan menemukan cara untuk mendapatkan kembali keamanan tipe dan menghubungkan sinyal Qt ke objek functor: http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals -in-qt-step-1.html

Hal yang ingin saya lakukan di sana adalah dasar, setiap hari pengembangan C ++ dibuat hampir tidak mungkin oleh Qt moc ... yang itu sendiri sama sekali tidak perlu sekarang, jika memang pernah ada.

Terus terang, saya terjebak dengan itu karena jika Anda ingin melakukan pengujian UI otomatis, Qt adalah satu-satunya permainan di kota pendek MFC ... yang sangat 1980 (itu menyebalkan bekerja dalam omong kosong itu sangat keras). Beberapa mungkin mengatakan WX tetapi ada masalah yang lebih serius. GTKmm akan menjadi pilihan pertama saya, tetapi karena semuanya ditarik oleh pemilik dan tidak dapat diakses ... tidak dapat digerakkan oleh perangkat lunak pengujian standar industri. Qt cukup sulit dalam hal itu ( hampir tidak berfungsi ketika Anda memodifikasi plugin aksesibilitas).


1
Karena ketertarikan, apa yang Anda lihat sebagai masalah utama dengan WX?
Tom Anderson

7
@ Tom - dokumentasi buruk, terutama untuk hal-hal baru. Komponen AUI hampir tidak didokumentasikan sama sekali dengan bagian besar hilang, sehingga sulit digunakan dalam lingkungan produksi. Dokumentasi untuk proses acara pada dasarnya salah sehubungan dengan jalur yang diikuti, pada win32 setidaknya. Menghabiskan banyak waktu berteriak pada komputer, "Ini seharusnya bekerja !!!" sebelum masuk ke kode pemrosesan mendalam untuk mengetahui bahwa apa yang WX tidak ikuti dokumen dan apa yang saya lakukan tidak akan pernah berhasil.
Edward Strange

1
Saya juga terganggu oleh penerimaan pustaka grid properti ke jalur utama. Saya menggunakan perpustakaan itu dan itu menunjukkan banyak, cacat desain mendasar selain kurangnya pengetahuan yang sebenarnya atas nama programmer yang menulisnya (misalnya fungsi virtual dalam konstruktor). Itu, dan negara miskin AUI, menunjukkan kecenderungan standar yang lebih buruk. Saya juga bukan penggemar berat tabel acara statis, meskipun setidaknya ada cara lain untuk merespons acara ... tidak seperti MFC, yang WX terlalu suka untuk menjadi menarik.
Edward Strange

Terima kasih. Saya hanya menggunakannya sedikit, dan melalui API wxPython, di mana sepertinya cukup bagus. Saya bisa menghargai bahwa itu akan menyembunyikan beberapa kejahatan, tetapi juga bahwa saya hanya belum cukup terlibat untuk menghadapi masalah yang lebih serius. Sesuatu untuk saya sadari.
Tom Anderson

1
segala sesuatu yang menanggapi sinyal haruslah Q_OBJECT, Tidak sekarang ... Sekarang, fungsi statis, fungsi dan bahkan fungsi lambda dapat merespon sinyal (Anda dapat menggunakan pointer fungsi sebagai slot). Kelas No-QObject juga dapat memiliki slot anggota jika Anda terhubung ke mereka menggunakan std :: bind untuk mengonversi instance member ke pointer fungsi.
Vinícius A. Jorge

28

Salah satu alasan untuk tidak menggunakan Qt adalah bahwa jika Anda hanya menulis untuk satu arsitektur, seperti Windows, Anda mungkin ingin menggunakan C # /. NET (atau Cocoa on Mac) karena mereka akan selalu dapat memanfaatkan lonceng terbaru - dan -berputar OS.

Jika Anda menulis aplikasi lintas platform, maka Anda mungkin sudah sangat terikat dengan teknologi lain seperti Java (yaitu Anda bekerja di "Java Shop"). Pilihan teknologi Anda mungkin ditentukan oleh ekosistem tempat Anda berkembang, seperti API khusus bahasa. Dalam kasus-kasus seperti ini, meminimalkan jumlah teknologi mungkin bermanfaat.

Alasan ketiga yang dapat saya pikirkan adalah bahwa Qt berbasis di sekitar C ++, dan C ++ adalah bahasa yang relatif sulit / berbahaya untuk diprogram. Saya pikir itu adalah bahasa untuk para profesional. Jika Anda perlu memiliki performa terbaik dan mampu menjadi sangat teliti, maka C ++ mungkin masih merupakan game terbaik di kota ini. Sebenarnya, Qt memperbaiki banyak masalah manajemen memori jika Anda mengatur berbagai hal agar keluar dari ruang lingkup. Juga, Qt itu sendiri melakukan pekerjaan yang baik mengisolasi pengguna dari banyak masalah C ++ yang buruk. Setiap bahasa dan kerangka kerja memiliki pro dan kontra. Ini adalah masalah yang sangat, sangat rumit yang biasanya dapat diringkas dengan tambahan yang sering terlihat di pengunjung: Kecepatan, Kualitas, dan Harga (tetapi Anda hanya dapat memilih dua).

Meskipun aturan mengatakan saya harus tetap fokus pada menjawab pertanyaan, saya ingin menyangkal beberapa masalah yang diangkat oleh Billy ONeal, yang saya pikir melakukan pekerjaan dengan baik meringkas alasan yang sering dikutip untuk tidak menggunakan Qt:

  1. Qt sebenarnya adalah file C ++ library / framework / header. Itu ditambaholeh prosesor makro (moc) yang memungkinkan sinyal dan slot, di antara banyak hal lainnya. Itu mengubah perintah makro tambahan (seperti Q_OBJECT) sehingga kelas memiliki introspeksi dan segala macam barang lain yang Anda mungkin berpikir sebagai menambahkan fungsionalitas Objective-C ke C ++. Jika Anda cukup tahu tentang C ++ sehingga tersinggung oleh kurangnya kemurnian ini, yaitu Anda seorang profesional, maka 1) jangan gunakan Q_OBJECT dan sejenisnya atau 2) bersyukurlah karena melakukan ini, dan program di sekitar kasus sudut yang sangat terbatas di mana ini menyebabkan masalah. Untuk orang-orang yang mengatakan "Gunakan Peningkatan untuk sinyal dan slot!" maka saya akan membalas bahwa Anda bertukar satu "masalah" dengan yang lain. Boost sangat besar, dan memiliki masalah sendiri yang sering dikutip seperti dokumentasi yang buruk, API yang mengerikan, dan horor lintas-platform (pikirkan kompiler lama seperti gcc 3.

  2. Untuk dukungan editor, ini juga mengikuti dari 1, saya agak setuju. Sebenarnya, Qt Creator adalah IMHO editor grafis C ++ terbaik, titik, bahkan jika Anda tidak menggunakan hal-hal Qt. Banyak programmer profesional menggunakan emacs dan vim. Juga, saya pikir Eclipse menangani sintaks tambahan. Dengan demikian, tidak ada masalah dengan makro Qt (Q_OBJECT) atau penambahan sinyal / slot. Anda mungkin tidak akan menemukan makro ini di Visual Studio, karena (saya mengakui) mereka adalah tambahan untuk C ++. Tetapi pada umumnya, orang-orang C # /. NET tidak akan menggunakan Qt, karena fakta bahwa mereka memiliki banyak fungsi yang ditutupi dengan teknik kepemilikan mereka sendiri.

  3. Mengenai ukuran sumber Qt, selama kompilasi semalam, siapa yang peduli? Saya mengkompilasi Qt 4 pada Macbook dual core saya di "kurang dari semalam." Saya tentu berharap ini bukan yang mendorong keputusan Anda untuk menggunakan atau tidak menggunakan teknologi tertentu. Jika ini benar-benar masalah, maka Anda dapat mengunduh SDK yang telah dikompilasi untuk Mac, Linux, dan Windows dari situs web Qt.

  4. Perizinan tersedia dalam tiga pilihan: 1) Lisensi kepemilikan jika Anda ingin memodifikasi Qt ITSELF dan tidak membagikan, atau menyembunyikan fakta bahwa seseorang menggunakan Qt dan tidak mau memberikan atribusi (bisa sangat penting untuk pencitraan merek dan gambar!) 2 ) GPL dan 3) LGPL. Ya, ada masalah dengan tautan statis (menggulung semua Qt ke dalam biner) - tapi saya pikir itu lebih karena orang tidak dapat mengintip ke dalam dan perhatikan bahwa Anda menggunakan Qt (atribusi!). Saya mencoba membeli lisensi hak milik dari Digia, dan mereka mengatakan kepada saya "untuk apa yang Anda lakukan, Anda benar-benar tidak membutuhkannya." Wow. Dari bisnis yang berkecimpung dalam bisnis penjualan lisensi.

  5. Ukuran biner / bundel adalah karena Anda harus mendistribusikan barang-barang Qt kepada orang-orang yang tidak memilikinya: Windows sudah memilikinya? hal-hal Visual Studio atau Anda harus menginstal run-time. Mac sudah hadir dengan Kakao yang sangat besar, dan dapat dihubungkan secara dinamis. Meskipun saya tidak melakukan banyak distribusi, saya tidak pernah menemukan banyak masalah dengan mendistribusikan ~ 50 megabyte file statis (yang saya dapat membuat lebih kecil dengan beberapa utilitas penari telanjang / kompresi biner seperti UPX). Saya hanya tidak cukup peduli untuk melakukan ini, tetapi jika bandwidth pernah menjadi masalah, saya akan menambahkan langkah UPX ke skrip build saya.

  6. Apa yang mendefinisikan "Tampilan dan Perasaan Asli?" Saya pikir "sebagian besar" akan setuju bahwa Mac datang paling dekat dengan tampilan dan nuansa terpadu. Tapi di sini saya duduk, melihat Safari, iTunes, Aperture, Final Cut Pro, Pages, dll. Dan mereka tidak terlihat sama meskipun faktanya dibuat oleh vendor OS. Saya pikir aspek "feel" lebih relevan: penataan gaya widget, daya tanggap, dll. Jika Anda peduli tentang respons, maka inilah alasan yang baik untuk menggunakan C ++ daripada Java, atau bahasa dinamis lainnya. (Objective C juga mengguncang, tapi aku mencoba untuk menghilangkan mitos tentang Qt)

Singkatnya, ini masalah yang rumit. Tetapi saya ingin menunjukkan bahwa saya pikir ada lebih sedikit alasan untuk "tidak menggunakan Qt" karena orang mungkin berpikir berdasarkan mitos dan informasi dekade yang kedaluwarsa.


1
Yang tidak saya dapatkan adalah mengapa pustaka lintas platform ini tidak sekadar fungsi pembungkus, atau bahkan lebih baik; jika def sekitar Cocoa, Win32, KDE / Gnome berfungsi, memastikan UI yang paling cantik, dengan semua fitur itu.
MarcusJ

2
@MarcusJ Menulis pembungkus di sekitar satu toolkit jelas tidak mudah, apalagi 4 atau lebih - tetapi jika Anda berpikir itu mudah, Anda dapat mencobanya. Adapun gagasan bahwa ini dapat dicapai hanya dengan menggunakan preprocessing bersyarat ... Anda pasti bercanda, bukan?
underscore_d

@MarcusJ Libib persis seperti itu (meskipun tanpa dukungan KDE).
Demi

Saya ingin menambahkan bahwa Anda sekarang dapat menggunakan Qt / QML dengan .NET. Anda tidak perlu menyentuh C ++. github.com/qmlnet/qmlnet PS: Saya penulisnya.
Paul Knopf

26

Beberapa di antaranya adalah lisensi. Lihat https://en.wikipedia.org/wiki/Qt_(software)#Melisensi untuk beberapa riwayat lisensi. Sampai tahun 2000, orang-orang yang sangat peduli dengan open source, tidak menggunakan Qt. Titik. (Ini, pada kenyataannya, motivasi asli untuk pengembangan Gnome.) Sampai tahun 2005, orang-orang yang ingin dapat merilis perangkat lunak gratis untuk Windows tidak menggunakan Qt. Bahkan setelah tanggal itu orang yang menginginkan perangkat lunak bebas di bawah sesuatu selain GPL, sama sekali tidak memiliki pilihan untuk menggunakan Qt. Jadi setiap proyek perangkat lunak bebas yang lebih tua dari tanggal tersebut, tidak dapat menggunakan Qt. Dan, tentu saja, orang yang menulis kode hak milik harus membayar untuk hak istimewa.

Lebih jauh lagi, ini bukan seolah-olah ada kekurangan pilihan lain. Misalnya WxWidgets , GTK + , dan Tk semuanya open source, cross-platform toolkit.

Terlebih lagi untuk waktu yang lama, Windows sangat dominan di desktop sehingga banyak perangkat lunak yang puas hanya berjalan di Windows. Jika Anda menginstal Microsoft toolchain, lebih mudah hanya menggunakan barang-barang milik Microsoft daripada khawatir tentang hal lain, dan banyak programmer melakukan hal itu.


1
@ btilly: GTK + adalah lintas platform. Sebagai contoh, klien IM Pidgin ditulis pada GTK +.
Billy ONeal

1
Ok, bagaimanapun, adalah mungkin 'entah bagaimana' untuk berjalan di Windows :)
Dehumanizer

6
Cukup instal GIMP di Windows dan lihatlah.
user281377

2
Ya, dan GIMP berfungsi dengan baik di Windows, tetapi tentu saja tidak cocok dengan tampilan & nuansa UI Windows 7.
Alan B

5
Pidgin mungkin merupakan contoh GTK yang lebih baik di Windows. Itu tidak melakukan sesuatu yang mewah, tetapi cocok dan mungkin selama 10 tahun atau lebih?
Brendan Long

14

Saya setuju dengan hampir semua alasan yang dibahas di atas namun banyak orang di sini mengatakan mereka tidak akan menggunakan Qt karena overhead tambahan yang dibawanya. Saya tidak setuju dengan itu karena semua bahasa yang paling umum saat ini (Java, C # dan Python) membawa sedikit overhead sendiri.

Kedua, Qt membuat pemrograman dengan C ++ begitu mudah dan mudah sehingga ia membuat sumber daya tambahan yang digunakannya. Saya telah menemukan beberapa aplikasi konsol yang ditulis dalam Qt daripada standar C ++ karena kemudahan di mana mereka dapat ditulis.

Saya akan mengatakan bahwa produktivitas Qt lebih besar daripada C / C ++ tetapi kurang dari bahasa seperti Python.


2
Saya kira itu semua relatif terhadap pengalaman individu, karena saya bisa kode OK di C ++ 14, tapi setiap kali saya melirik beberapa kode Qt, saya harus juling sulit untuk mengenalinya sebagai bahasa yang sama ... jadi saya tentu saja tidak Saya pikir itu adalah pendorong produktivitas bulat yang Anda maksudkan di sini.
underscore_d

1
@underscore_d jelas jika Anda tahu C ++ dengan sangat baik dan Anda tidak Qt, Anda tidak akan lebih produktif dengan yang terakhir. Tetapi ketika Anda mengenal baik C ++ dan Qt, kerangka kerja ini benar-benar membuat banyak hal lebih mudah dan lebih cepat untuk diimplementasikan (C ++ 11, 14 dll mengisi celah, tetapi belum sepenuhnya).
ymoreau

11

Ini benar-benar bukan upaya untuk memulai perang api, saya hanya ingin membahas beberapa poin.

Mungkin alasan sebenarnya mengapa Qt tidak lebih banyak digunakan adalah karena C ++ dan lebih sedikit orang yang menggunakan c ++ untuk aplikasi desktop.

Qt bukan pustaka C ++. Ini membutuhkan langkah kompilasi terpisah, yang membuat proses pembuatan jauh lebih rumit jika dibandingkan dengan kebanyakan perpustakaan lain.

Vs-addin untuk studio visual melakukan ini secara otomatis seperti halnya proses pembuatan perintah Qt sendiri. Kompiler sumber daya yang digunakan untuk membangun dialog untuk MFC juga merupakan langkah terpisah tapi itu masih c ++.

Qt adalah sejumlah besar sumber, yang harus ada dan diinstal pada mesin yang Anda gunakan sebelum mengkompilasi. Ini dapat membuat pengaturan lingkungan bangunan jauh lebih membosankan.

Ada unduhan biner untuk setiap versi studio visual dan build from source adalah perintah tunggal. Saya tidak melihat ukuran sumber SDK jauh dari kesepakatan hari ini. Visual studio sekarang menginstal semua lib C ++ daripada membiarkan Anda memilih, sebagai akibatnya ukuran instal kompiler adalah> 1Gb.

Ini hanya tersedia di bawah LGPL, yang membuatnya sulit untuk menggunakan penempatan biner tunggal ketika seseorang perlu merilis dengan lisensi yang lebih ketat atau kurang ketat.

LGPL hanya berlaku untuk lib, itu tidak mempengaruhi kode Anda. Ya itu berarti Anda harus mengirim DLL daripada biner tunggal (kecuali Anda membayar), tetapi di dunia di mana Anda perlu mengunduh runtime Java atau .Net pembaruan untuk util kecil, ini bukan masalah besar. Ini juga bukan masalah pada platform dengan ABI tunggal sehingga aplikasi Qt lainnya dapat berbagi lib.

Dalam beberapa kasus, sepertinya program asli tidak terlihat. Merancang UI tunggal untuk semua platform secara inheren tidak akan terlihat benar ketika dipindahkan dari mesin ke mesin, karena berbagai alasan gaya visual.

Seharusnya menggunakan widget dan tema asli. Saya harus mengakui bahwa saya melakukan sebagian besar aplikasi teknis sehingga pengguna saya tidak terlalu peduli tentang gaya. Terutama di windows mode baru untuk memiliki segala sesuatu gaya itu sendiri sebagai widget smartphone berarti semakin sedikit standar.


1
Cukup banyak perusahaan perangkat lunak besar yang membangun aplikasi komersial di C ++ tetapi saya tidak mengetahui banyak yang menggunakan QT. Jadi, sementara saya mengerti bahwa pengembang non-C ++ mungkin menghindari QT, ada alasan lain untuk menghindari QT bahkan ketika Anda menulis aplikasi C ++, sepertinya. Bahkan, sebenarnya tidak ada bahasa lintas platform dan toolkit GUI yang saya tidak dapat menemukan kesalahan. Tampaknya pengembangan lintas-platform JUST PLAIN HARD, dan melakukannya dengan baik tidak pernah mudah atau gratis, dan bahwa janji yang dibuat QT (Tuliskan GUI Anda sekali dan gunakan kembali bahwa GUI di mana-mana) tidak cukup.
Warren P

Sebagian besar perangkat lunak C ++ desktop ada di MFC karena dimulai 20 tahun yang lalu atau menggunakan toolkit internal yang dimulai 20 tahun yang lalu untuk menghindari MFC (mis. MS-Office atau Autocad). Saya ragu banyak yang ditulis dalam C ++ / CLR dengan WPF. Tetapi bahkan tanpa pertimbangan lintas platform, saya menemukan Qt toolkit desktop terbaik (atau paling tidak terburuk!). Seperti kebanyakan orang, kita bergerak menuju ujung depan webby (mungkin di QtQuick / QML) dan server C ++ backend - yang mungkin akan menggunakan sinyal / slot Qt tetapi tidak ada gui
Martin Beckett

Saya setuju. Paling buruk. Dan bahkan pada aplikasi Windows saja saya lebih suka men-debug masalah QT daripada masalah MFC.
Warren P

@ WarrenP - ya saya tidak ketinggalan mencari proyek untuk semua hal yang hilang dari MFC. Tetapi dengan kecintaan baru MSFT terhadap kode asli - mereka tidak berbuat banyak untuk membuat menulis gui menjadi lebih mudah.
Martin Beckett

7

Alasannya sederhana: itu tidak memiliki ikatan yang baik untuk semua bahasa utama, dan itu tidak selalu sesuai untuk pekerjaan yang ada.

Gunakan alat yang tepat untuk pekerjaan itu. Jika saya menulis aplikasi command-line yang sederhana, mengapa saya harus mengasapi itu dengan Qt hanya demi itu?

Sebagai jawaban yang lebih umum (yang bisa saya berikan karena saya relevan di sini), beberapa programmer tidak akan pernah mencobanya dan memutuskan untuk menggunakannya. Dalam beberapa kasus tidak ada alasan khusus selain programmer tidak pernah menemukan kebutuhan untuk itu dan mencarinya.


1
Tetapi Qt hanya menyediakan kemampuan untuk menulis aplikasi konsol. Bukan?
Dehumanizer

9
@Dehumanizer: Saya tidak tahu. Tetapi mengapa saya menggunakannya untuk alat utilitas kecil? Apa manfaatnya bagi saya ketika saya dapat dengan sepele menulis aplikasi hanya dalam standar C ++? Tampaknya Anda mencari alasan untuk menggunakan perpustakaan , yang merupakan cara mundur ke program.
Lightness Races in Orbit

12
@Dehumanizer: Seperti yang saya katakan, itu pendekatan mundur. Ketika Anda menemukan kebutuhan untuk perpustakaan, Anda akan tahu, dan kemudian Anda bisa pergi dan mencoba beberapa dan melihat apa yang sesuai dengan kebutuhan Anda dengan lebih baik. Mencoba untuk mengumpulkan pendapat tentang perpustakaan ketika Anda tidak memiliki kasus penggunaan adalah tugas orang bodoh.
Lightness Races di Orbit

3
"Jika saya menulis aplikasi command-line yang sederhana, mengapa saya mengasapi itu dengan Qt hanya untuk kepentingan itu" ada setidaknya satu alat non-gui yang sangat terkenal yang ditulis dalam Qt - Doxygen :-)
Valentin Heinitz

4
@Dehumanizer misalnya ketika Anda harus berurusan dengan file, xml, unicode, json, regexp, concurency, database, dll, dll, sangat cepat dan tidak ingin mengunduh, mengadopsi, memelihara lusinan perpustakaan pihak ke-3.
Valentin Heinitz

5

Kerangka kerja seperti Qt tepat ketika Anda lebih mementingkan produk Anda terlihat sama di semua platform daripada dengan produk Anda terlihat tepat di semua platform. Semakin sering hari-hari ini, aplikasi-aplikasi semacam itu pindah ke teknologi berbasis web.


4

Saya setuju bahwa Qt adalah kerangka kerja yang bagus untuk bekerja dengannya. Namun, ada beberapa masalah yang saya miliki:

  1. Ini ditulis dalam C ++, yang merupakan bahasa tingkat sangat rendah. Fakta saja bahwa itu adalah C ++ akan membuat setiap programmer Qt secara signifikan kurang produktif dibandingkan dengan Kerangka yang ditulis dalam bahasa lain. Daging sapi utama saya dengan C ++ sebagai bahasa pengembangan GUI adalah bahwa ia tidak memiliki gagasan tentang manajemen memori otomatis, yang membuat proses pengembangan lebih rentan terhadap kesalahan. Itu tidak introspektif, yang membuat proses debug jauh lebih sulit. Sebagian besar perangkat GUI utama lainnya memiliki gagasan tentang manajemen memori otomatis dan introspeksi.
  2. Setiap cross-platform toolkit mengalami masalah yang hanya dapat diimplementasikan denominator paling umum dari semua platform yang didukung. Itu, dan pedoman UI yang berbeda pada platform yang berbeda sangat mempertanyakan keinginan GUI lintas-platform secara keseluruhan.
  3. Qt sangat terpusat pada pengkodean semua UI Anda. Meskipun Anda dapat menggunakan QtDesigner untuk membangun beberapa bagian UI Anda, itu sangat kurang dibandingkan dengan, katakanlah, (Cocoa / Obj-C) Interface Builder atau alat .Net.
  4. Meskipun Qt memang menyertakan banyak fungsi aplikasi tingkat rendah, Qt tidak dapat dibandingkan dengan memiliki kerangka kerja yang dirancang khusus untuk platform tertentu. Pustaka sistem operasi asli untuk Windows dan OSX secara signifikan lebih kuat daripada implementasi Qt. (Pikirkan kerangka kerja audio, akses sistem file tingkat rendah, dll.)

Yang mengatakan, saya suka menggunakan PyQt untuk aplikasi prototyping cepat atau aplikasi in-house. Menggunakan Python untuk melakukan semua pengkodean mengurangi kekhawatiran dengan C ++ dan benar-benar membuat Qt tempat yang sangat menyenangkan.


Edit, sebagai tanggapan atas beberapa komentar:

Ketika saya menulis tentang Qt yang ditulis dalam C ++, saya tidak begitu banyak mengeluh tentang Qt itu sendiri, tetapi lebih banyak tentang lingkungan tempat tinggalnya. Memang benar bahwa Qt mengelola sumber dayanya sendiri dengan sangat baik, tetapi semua GUI Anda yang terkait-tetapi- kode not-Qt juga harus ditulis dalam C ++. Bahkan di sana, Qt menyediakan banyak alat bagus, tetapi pada akhirnya, Anda harus berurusan dengan C ++ di tingkat itu. Qt membuat C ++ dapat diterima, tetapi masih C ++.

Adapun introspeksi, maksud saya adalah ini: Kasus-kasus yang paling sulit untuk debug adalah ketika Anda memiliki pointer ke beberapa objek yang tidak berperilaku seperti yang Anda pikirkan seharusnya. Dengan C ++, debugger Anda mungkin bisa melihat ke dalam objek itu sedikit (jika kebetulan memiliki jenis informasi di titik thwt), tetapi bahkan itu tidak selalu berhasil. Ambil, di sisi lain, Kakao dalam situasi yang sama. Di Cocoa / Obj-C, Anda dapat mengirim pesan ('fungsi panggilan') ke objek tepat di dalam debugger. Anda dapat mengubah status objek, Anda dapat menanyakannya untuk atributnya, Anda dapat menanyakannya untuk jenis dan nama fungsinya ... Ini dapat membuat proses debug jauh lebih nyaman. Qt / C ++ bahkan tidak ada yang mendekati itu.


11
1. Qt mengurus manajemen memori sendiri, Anda tidak perlu memanggil 'hapus' setelah setiap 'baru'. 1a. C ++ BUKAN bahasa tingkat rendah, itu bahasa tingkat tinggi dengan 'kemampuan' tingkat rendah. 3. Saya setuju, tetapi Qt menyediakan untuk membuat UI dengan QtDesigner dan dengan 'kode biasa' dalam waktu bersamaan. 4. Setuju lagi, tetapi Qt juga menyediakan untuk menggunakan API asli.
Dehumanizer

11
ke poin Anda nr 1. Saya pikir c ++ memang memiliki semacam manajemen memori semi-otomatis: jika Anda menggunakan pointer pintar seperti std :: auto_ptr atau boost :: shared_ptr dll. Anda biasanya tidak perlu peduli membebaskan memori. Wadah semacam ini dapat dibuat untuk sumber daya lain juga (file, sumber daya sistem yang harus dibebaskan). Penggunaan pola-RAII sangat membantu dalam manajemen memori dan seiring pertumbuhannya, Anda tidak perlu khawatir tentang memori.
deo

8
"Fakta bahwa C ++ akan membuat setiap programmer Qt kurang produktif dibandingkan dengan Frameworks yang ditulis dalam bahasa lain." [rujukan?]
Nathan Osman

4
@ SK-logic: Sementara saya pikir saya mengerti semua kata dalam kalimat ketiga Anda, saya tidak tahu apa yang Anda katakan. Apa itu "batas abstraksi"? Dalam hal ini, kalimat pertama Anda salah, mengingat definisi Wikipedia "bahasa tingkat rendah".
David Thornley

6
@ SK-logic: Metaprogramming template sudah selesai-Turing, dan ada orang-orang yang cukup pintar dan berpengetahuan untuk memanfaatkannya. RAII bukanlah pengumpulan sampah yang hebat, tetapi fakta bahwa ia bekerja untuk semua jenis sumber daya kurang lebih merupakan penyebabnya. Sekarang, khususnya, abstraksi macam apa yang berfungsi di Jawa tetapi tidak pada C ++?
David Thornley

3

Saya sangat suka Qt, tapi ini agak berat untuk banyak aplikasi. Terkadang Anda tidak membutuhkan tingkat kerumitan itu. Terkadang Anda hanya perlu sesuatu yang sederhana tanpa semua overhead Qt. Tidak semua aplikasi perlu digerakkan oleh peristiwa dan C ++ menyediakan serangkaian templat yang masuk akal. Boost menyediakan perangkat lain yang sangat bagus dan mencakup banyak fungsi tingkat rendah (file, socket, pointer yang dikelola, dll) yang dilakukan QT.

Aplikasi lain memiliki persyaratan lisensi yang tidak cocok dengan GPL, LGPL atau lisensi komersial Qt. GPL tidak pantas untuk perangkat lunak komersial. LGPL tidak sesuai untuk perangkat lunak yang terhubung secara statis dan lisensi komersial membutuhkan biaya - sesuatu yang banyak yang tidak mau membayar.

Beberapa memiliki pertimbangan keamanan atau stabilitas yang tidak memungkinkan perpustakaan kompleks seperti Qt.

Anda perlu menjalankan moc untuk melakukan pra-proses sumber Anda. Itu bukan masalah besar, tetapi bisa menakutkan bagi pengguna baru. Banyak programmer berpikir Anda perlu menggunakan qmake dengan Qt, tapi itu keliru. Dimungkinkan untuk menyambungkan Qt ke sistem build lain dengan cukup mudah.

Beberapa target sangat dibatasi oleh memori atau CPU.

Ada beberapa Gotcha platform khusus di dalamnya. Sebagian besar gotcha tersebut tidak berdokumen. Bangun aplikasi yang cukup besar dan Anda akan menemui mereka dan bertanya-tanya apa yang terjadi (penafian, terakhir kali saya menggunakan Qt dalam kemarahan adalah lebih dari 18 bulan yang lalu, jadi mungkin sudah membaik).

Ini hanya C ++. Binding bahasa lain ada, tetapi mereka cenderung untuk menyembunyikan atau mengekspos banyak fungsi yang Anda inginkan untuk Qt.

Ada banyak alasan untuk tidak menggunakan Qt, itu sebabnya ada alternatif. Jika yang Anda miliki adalah palu maka setiap masalah akan terlihat seperti paku.


3

Hal yang paling penting tetapi tidak disebutkan. Dalam proyek besar satu hal menyebabkan begitu banyak masalah dan kode yang tidak perlu. Mekanisme slot sinyal Qt tidak efisien. Widget qt tidak memberikan sinyal yang diperlukan untuk widget acara sederhana. Misalnya Anda tidak dapat mengatur sinyal untuk onHover, onMouseEnter, onMouseLeave, onKeyReleased, onLostFocus, onGainFocus, dll. Bahkan widget paling kompleks seperti QTreeWidget memang menyediakan satu atau dua sinyal tidak berguna yang sangat sederhana.

Ya, Anda dapat menggunakan acara TAPI !!! Anda telah membuat kelas baru untuk setiap widget dengan acara khusus. Ini adalah kehilangan efisiensi yang sangat besar;

  • Anda harus menulis ulang setiap acara objek widget yang disesuaikan. Ada sedikit perubahan.
  • Anda kehilangan semua barang Desainer Qt. Anda harus mempromosikan setiap widget dengan acara khusus.
  • Proyek menjadi lebih besar dan sulit dipertahankan.
  • Anda mulai tidak menyukai qt karena ini. Dan mulai berbicara tentang bagaimana. Net menyediakan delegasi, bagaimana itu jauh lebih baik daripada slot sinyal, bagaimana. Komponen bersih (widget) umumnya menyediakan setiap peristiwa yang dapat Anda bayangkan. Dan sebagainya.

Salah satu kampus saya telah membuat kelas kotak kombo baru untuk setiap widget kotak kombo karena ia harus menggunakan beberapa acara non sinyal. Kisah nyata...

Namun, Qt adalah kerangka C ++ UI terbaik sejauh ini dengan naik turun.


Mengenai acara dan membuat kelas baru: Anda dapat menggunakan filter acara di kelas yang perlu bereaksi terhadapnya.
MrFox

"Ya, kamu bisa menggunakan acara TAPI !!! kamu telah membuat kelas baru untuk setiap widget dengan acara khusus. Ini adalah efisiensi yang hilang;" - TIDAK PERSIS. Saya baru saja berakhir dengan bool eventFilter yang menangani beberapa widget dan kemudian menginstalEventFilter (ini) di semua widget anak. Dan ini tidak kehilangan efisiensi dan kinerja pemrograman! Sebenarnya saya tidak pernah menggunakan "widget Dipromosikan" ... Saya menjatuhkan widget kosong saja, instal ini sebagai eventFilter di atasnya dan mengimplementasikan kembali sebagian besar acara saya dalam kelas cpp utama saya. Cobalah, jangan kesusahan :) Anda dapat menyesuaikan hampir SEGALA SESUATU di Qt tanpa membuat kelas baru setiap kali
Петър Петров

3

menurut pendapat saya sendiri, belajar pemrograman C ++ lebih sederhana daripada jatuh ke bahasa lain yang menyembunyikan kompleksitas mereka, dan programmer tidak tahu apa yang sebenarnya terjadi di latar belakang. Qt di sisi lain, menambahkan beberapa manfaat dibandingkan C ++, untuk membuatnya lebih tinggi daripada C ++ asli. Jadi Qt C ++ adalah kerangka kerja yang bagus untuk yang ingin mengembangkan tugas tingkat rendah, atau yang tingkat tinggi, dengan cara yang sama. C ++ adalah (dengan beberapa praktik) bahasa yang kompleks dan sederhana. Kompleks untuk yang ingin tidak menentangnya, sederhana untuk orang yang menyukainya. Jangan biarkan karena kompleksitasnya!


2

Alasan sebenarnya bukan teknis.

Orang-orang kebetulan berbeda. Begitu juga pilihan mereka. Keseragaman bukan fitur manusia.


Itukah sebabnya semua orang berjalan kaki? Ya, mereka yang setidaknya memiliki kaki ...
dtech
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.