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?
202
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.Jawaban:
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:
vim
.sumber
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.
sumber
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:
Itu juga tidak cocok dengan preprocessor. Anda tidak dapat melakukan ini:
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).
sumber
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:
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.
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.
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.
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.
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.
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.
sumber
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.
sumber
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.
sumber
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.
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 ++.
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.
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.
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.
sumber
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.
sumber
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.
sumber
Saya setuju bahwa Qt adalah kerangka kerja yang bagus untuk bekerja dengannya. Namun, ada beberapa masalah yang saya miliki:
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.
sumber
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.
sumber
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;
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.
sumber
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!
sumber
Alasan sebenarnya bukan teknis.
Orang-orang kebetulan berbeda. Begitu juga pilihan mereka. Keseragaman bukan fitur manusia.
sumber