QT-C ++ vs C ++ generico e STL [chiuso]


19

Ultimamente ho ripassato il mio C ++ su Ubuntu QQ. Adoro il framework Qt per tutto, in particolare per la creazione di GUI. Ho acquisito familiarità con esso durante l'utilizzo di PyQt negli ultimi anni.

Quando ho usato PyQt, ho avuto alcuni problemi che sono ora più pronunciati quando si usa C ++ con Qt: Qt ha molte estensioni a C ++ che sono specifiche di Qt - QString è solo un esempio comune, per non parlare della garbage collection automatica. È possibile scrivere applicazioni Qt usando C ++ senza sapere molto su C ++ e STL.

Potrei dover tornare presto sul mercato del lavoro e mi piacerebbe poter prendere in considerazione le posizioni in C ++ - ma temo di legarmi troppo a Qt, limitando le mie capacità a lavorare con C ++ generico, che una volta erano abbastanza formidabili ma sono ormai a lungo dormienti e arrugginiti.

Devo evitare Qt? Sarebbe meglio usare WxWidgets o GTK ++ per la creazione di GUI?

Qual è il miglior framework GUI da utilizzare che consente / richiede il massimo utilizzo di C ++ generico e STL? Come posso diventare il più commerciabile come programmatore C ++ quando si tratta di framework GUI, ecc.?

Risposte:


15

Non mi asterrei dall'usare Qt solo per questi motivi. Non è necessario utilizzare tutte le classi di utilità di Qt; per quelli che sostituiscono l'STL, sarai al massimo costretto a usare QString e, possibilmente, QStringList. Inoltre, di solito c'è molto di più in un programma rispetto alla GUI. Puoi sempre usare esclusivamente C ++ generico per il resto del tuo programma e usare Qt solo per la GUI.

A mio avviso, lavorare con STL riguarda soprattutto la comprensione delle strutture di dati sottostanti utilizzate e delle loro complessità e, di conseguenza, in quali orari è necessario utilizzare ciascun contenitore. E quando si tratta di programmazione C ++, si tratta soprattutto di sapere come usare l'intestazione <algoritmo> molto essenziale, che dovrebbe funzionare anche sui container di Qt, poiché sono compatibili con STL.

Non vedo molto male nell'usare tutte quelle estensioni fornite da Qt, purché tu sappia (o abbia almeno avuto un'idea generale di) come vengono implementate internamente. Assicurati di sapere che cose come Q_OBJECT, SIGNAL (), SLOT (), foreach (), non sono magiche, ma macro che si espandono in istruzioni C ++ valide. Ad esempio, non è poi così complicato capire come vengono implementate le classi implicitamente condivise e le relazioni genitore-figlio che fanno sembrare Qt più simile a Java. Puoi sempre provare a ricreare alcune funzionalità in un progetto separato solo per vedere se potresti farlo con C ++ generico e quindi non sentirti male per usarle in Qt.

Inoltre, dai un'occhiata alle librerie Boost. Forniscono utilità extra rispetto alla libreria C ++ standard e sono un ottimo modo per avvicinarsi un po 'al C ++ generico, poiché essenzialmente seguono le stesse convenzioni del C ++ generico. Alcune delle biblioteche hanno classi temporanee abbastanza complesse e il semplice tentativo di capire come funzionano è, di per sé, un buon studio in C ++. Boost ha molte utility che non possono essere trovate in Qt, e altre che implementano gli stessi concetti o simili di alcune delle classi di Qt e possono essere usate al loro posto.

Se colpisci il mercato del lavoro lavorando con C ++, è probabile che tu stia lavorando con Qt o un altro framework che, allo stesso modo, avrà le sue classi di utilità che tentano di semplificare il C ++.


4
+1 per "Puoi sempre usare esclusivamente C ++ generico per il resto del tuo programma e usare Qt solo per la GUI."
Md Mahbubur Rahman,

@MahbuburRAaman - sì - questo è un consiglio eccellente. Usa Qt solo per la GUI e ciò che è necessario riagganciare. Scrivi il resto usando Generic C ++, STL, Boost - gli strumenti usati universalmente.
Vector

5

Concordo con la maggior parte degli elogi di Qt, ma la domanda era: qual è il miglior framework GUI da utilizzare che consenta / richieda il massimo utilizzo del C ++ generico e dell'STL? Sotto questo aspetto, Qt è un po 'schizofrenico: duplica i contenitori e gli algoritmi STL con i suoi colpi di scena. Fornisce inoltre contenitori diversi da STL. L'interoperabilità tra Qt e STL non è sempre una navigazione fluida. In alcuni casi ci vogliono un paio di chiamate di funzione per ottenere da std::stringa QStringe ritorno.

wxWidgets ha un'opzione per build STL, che utilizza esclusivamente contenitori STL: non esiste un universo parallelo con sostituzioni di origine domestica come nel caso di Qt. Si compila anche con un compilatore C ++ standard senza la necessità di estensioni non standard. È un framework GUI di qualità che vale la pena considerare.

Puoi anche dare un'occhiata a gtkmm, che è un wrapper C ++ attorno a GTK +. È più vicino a soddisfare il tuo primo requisito di Qt.


1
'wxWidgets ha un'opzione per build STL, che utilizza esclusivamente contenitori STL ...' - Vedo - questo è IMPORTANTE da sapere. 'In alcuni casi sono necessarie alcune chiamate di funzione per passare da std :: string a QString' - capito - non l'ho ancora investigato. Conosco un po 'GTK e Wx - ma Qt sembra brillare in confronto, almeno dal mio punto di vista - Il C ++ NON è il mio primo linguaggio - Venivo dal mondo Clipper / Delphi e poi ho imparato il C ++ perché dovevo affrontare Win 32s ecc.
Vector

2

Non mi preoccuperei troppo di non usare librerie STL specifiche come std :: string o std :: iostream o std :: vector. Gli equivalenti QT hanno un sapore diverso ma non sono così lontani da creare problemi.

La differenza più idiomatica secondo me sembra essere lo stile di programmazione pesante sull'uso newper l'allocazione. Mentre per un programma QT questo potrebbe andare bene per la parte Gui, la virtù di C ++ e RAII è che puoi effettivamente conservare molti dati nello stack anziché nell'heap. Quando si passa alla scrittura di codice non GUI, è necessario ricordarlo.


1
il punto che stavo cercando di chiarire non è che l'allocazione dell'heap sia generalmente sbagliata, non è la cosa migliore per le variabili locali. Le classi GUI tendono a vivere a lungo e sono meglio allocate sull'heap, le variabili locali che sono necessarie solo temporaneamente vivono bene nello stack. in C # con Garbace Collection verranno presto distrutti, quindi anche l'heap va bene. Ma con le new/deletechiamate manuali non è così facile e soggetto a errori. Nelle sezioni critiche (gestione dei big data) questo può fare la differenza, specialmente le deletechiamate possono essere piuttosto lente.
Wirrbel,

1
questo non è un problema di 10000 oggetti dell'interfaccia utente, ma per strutture di dati ad albero complessi con un milione di voci, ecc. dove una volta si potrebbe ricorrere a metodi più intelligenti di allocazione delle cose (allocazione in blocco o molte classi di boost scritte in modo intelligente, ecc.). Conclusione: l'heap non è male, deve essere utilizzato in modo intelligente. Il modo Qt a volte non scala per altre cose. Secondo me è ancora un favoloso toolkit.
Wirrbel,

Che ne dici di C ++ 11? suggerimenti intelligenti ecc. sembrerebbero alleviare molte delle tue preoccupazioni. Sto solo iniziando a rovinarlo adesso. Come ho detto, sono d'accordo che Qt KICKS BUTT. Il mio piano è di usare Qt per la GUI e fare qualsiasi altra cosa possibile usando C ++ 11, il che sembra rendere molto Boost, ad esempio obsoleto, e colma in larga misura i divari tra Java / C # e C ++ della vecchia scuola. Ho la sensazione (a questo punto da una certa distanza) che una combinazione di Qt e C ++ 11 può essere un grande vincitore.
Vector

2
Penso che tu abbia capito il mio punto: hai molte opzioni con C ++, con c ++ devi scegliere saggiamente. Anche i puntatori intelligenti, ecc. Hanno problemi. Stufo di C # potresti dare un'occhiata a dlang.org che fa molte cose meglio (GCed).
Wirrbel,

Nel frattempo devo mettere insieme una catena di strumenti che supporti C ++ 11. In questo momento uso codelite - IDE molto bello - ma pronto all'uso (compilatore GNU) non supporta 11, come ho appena scoperto ... Forse io può collegarvi un compilatore conforme a 11. Non comincerò con D o Boo ecc. Ecc. - Come ho detto in questione, potrei dover ricadere sul mercato del lavoro abbastanza presto e voglio avere i linguaggi tradizionali per la commerciabilità, non "una tantum". MOLTI lavori Python là fuori - peccato che non sopporti più Python!
Vector
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.