2009-08-28 6 views
6

Mi chiedo perché Qt usi Q prima di ogni nome di classe piuttosto che mettere tutto in uno spazio dei nomi. C'è qualche ragione particolare, come rendere i nomi facili da cercare, o si tratta solo di nomi di marchi?Qual è la logica alla base del modo Qt di classificare le classi?

+1

so che è nitpicky, ma "razionale" dovrebbe essere "Motivazione". –

+1

proprio in agguato. Personalmente, come madrelingua inglese non nativo, mi piace essere corretto. Preferisco fortemente essere corretto piuttosto che continuare a usare una parola o una frase sbagliata senza saperlo. –

+0

@Matthew Talbert Anch'io sono d'accordo con Stefano, sei il benvenuto Matteo – yesraaj

risposta

7

Credo che sia storico. I namespace sono stati introdotti in C++ intorno al 1995. Lo sviluppo del Qt è iniziato nel 1991, quindi i namespace non potevano essere usati, ovviamente.

3

Potrebbe essere un problema di portabilità. I namespace non erano/non sono supportati da ogni compilatore, quindi la convenzione di denominazione aiuta a ridurre le convenzioni di denominazione.

+1

per impostazione predefinita il codice generato da Qt Designer utilizza ui :: namespace ... Sospetto che potrebbe non essere il problema – yesraaj

+0

Sì, e Qt _segue_ avere uno spazio dei nomi 'Qt'. Semplicemente non contiene le classi, solo alcune enumerazioni. –

2

Qt è molto conservativo sulle funzionalità del linguaggio C++ che utilizza. Nessuno spazio dei nomi, exceptions or RTTI. Vedi anche this article che spiega perché i template non sono usati nella gestione del segnale/slot.

+1

Anche se sono d'accordo sul fatto che Qt sia conservativo, il tuo link a nessun template è specifico per il meccanismo signal/slot. Qt utilizza sicuramente i template in molti dei loro codici. Le eccezioni e roba RTTI è dovuta all'utilizzo su dispositivi embedded, scommetterei. Molte app integrate evitano quelle per il sovraccarico che aggiungono. –

+0

Questo è un buon punto e corretto. Modificherà la risposta! –

0

Visto che non c'è un unico C++ sinistra compilatore che non implementa spazi dei nomi, al giorno d'oggi non c'è una sola ragione: Branding :)

+0

nessun compilatore corrente forse. ma ci sono ancora molte persone che usano vecchi compilatori che non potranno/non potranno aggiornare alla versione più recente. Non sto dicendo che è una buona situazione, ma a volte sei solo bloccato con l'utilizzo di un vecchio compilatore scadente, per un numero qualsiasi di motivi tecnici/non tecnici. – Glen

+0

Anche se tutti usassero nuovi compilatori che supportano correttamente gli spazi dei nomi (e non sono d'accordo con la tua affermazione BTW - ci sono ancora compilatori correnti che non supportano tutte le sfumature degli spazi dei nomi correttamente), c'è ancora un * lotto * di codice Qt che usa la convenzione di denominazione corrente. Ti aspetti che tutti possano cambiare tutto il loro codice Qt in una nuova convenzione di denominazione solo per utilizzare gli spazi dei nomi? – Thomi

+1

@Glen, Thomi: Qt utilizza gli spazi dei nomi al giorno d'oggi (dalla 4.0), quindi qualsiasi compilatore lasciato senza almeno il supporto di base non è più supportato da Qt in ogni caso (non può essere supportato). –

2

La documentazione per Qt si riferisce a namespaces, anche se non ho controllato il codice per vedere se sono veramente C++ namespace s o un hack con dichiarazioni pubbliche all'interno di una classe. Direi che il resto sta cercando di evitare di causare tutti di necessario rinominare ogni cosa, anche se potevano fornire un percorso di migrazione, se volevano, in questo modo:

namespace Qt 
{ 
class Object { ... }; 
} 

#ifndef NO_OLD_DECLS 
typedef Qt::Object QObject; 
#endif 
0

Qt usa un prefisso Q come parte della loro codifica stile. Solitamente serve allo scopo di facilitare la lettura del codice e individuare ciò che è.

Un identificatore:

  • è preceduto da "Q" e suffissi "Private" è una classe privata utilizzata per i dettagli di implementazione e non fa parte delle API (ad esempio QPainterPrivate)
  • viene anteposto con "Q" e non suffisso "Private" è una classe pubblica (es QWidget)
  • è prefisso "q" (minuscola) è una funzione globale pubblica (es qRgb)

Adottare uno stile di codifica e usarlo in modo uniforme rende molto più facile per gli altri capire il codice che non hanno scritto.

Ref .: Qt Coding Style