2015-09-11 8 views
5

Il mio programma deve leggere/scrivere un file di testo (solo poche righe) con le sue impostazioni su disco. Per specificare un percorso nel codice potrebbe funzionare bene su una piattaforma, come Windows, ma se viene eseguito su Linux, il percorso non è multipiattaforma.Come ottenere un percorso di archiviazione delle impostazioni in un modo multipiattaforma in Qt?

Sto cercando una soluzione simile a QSettings che salva le impostazioni su percorsi diversi o ha i suoi modi nativi per gestire questo. I programmatori non hanno bisogno di fare con i dettagli. Ma il file di testo non è adatto per essere salvato come valore in QSettings.

Nessuna interazione utente dovrebbe essere necessaria per ottenere tale percorso. Il file di testo dovrebbe persistere tra i riavvii dell'applicazione. Non può essere un file temporaneo.

Esiste una soluzione esistente in Qt e che cos'è l'API da utilizzare?

risposta

0

C'è QDir per gestire i percorsi a dirs, QFileInfo per informazioni sulla piattaforma di file indipendenti e QDir s' homePath()

La mia proposta è quella di utilizzare queste classi e utilizzare QDir::home() o QDir::homePath() per trovare una directory in cui scrivere a, dal momento che l'utente ha i permessi di scrittura nel suo homedir ed esiste su ogni piattaforma.

+0

'homePath' e poi? In Windows, che è in'% USERPROFILE% ', e se inizi a scrivere a caso in modo casuale, potresti avere dei problemi: su OS X e Linux, è nella home directory in cui devi seguire le convenzioni di percorso specifiche della piattaforma: Eh utenti che ti catturano a scrivere in '. ~/xyz' su OS X non ti piacerà. 'QDir :: homePath' è un retaggio rimanente e sostanzialmente inutile per la scrittura in un'impostazione multipiattaforma.Puoi leggere da lì, ma non scrivere senza che l'utente ti dica dove scrivere. –

0

Se si desidera salvare alcuni dati relativi all'utente, è possibile ottenere il percorso della directory home dell'utente utilizzando QDir::homePath().

+0

... e devono scrivere un mucchio di codice specifico per la piattaforma di scegliere dove in quella directory casa a scrivere :( –

-1

È possibile memorizzare il file nella directory dell'applicazione. Dai uno sguardo allo QCoreApplication::applicationDirPath().

Da documentazione Qt:

Restituisce la directory che contiene il file eseguibile dell'applicazione.

+0

Generalmente non è scrivibile, quindi sarebbe una cattiva idea. –

6

L'ubicazione dello spazio di archiviazione delle impostazioni specifiche dell'applicazione varia da una piattaforma all'altra. Qt 5 fornisce una soluzione ragionevole tramite QStandardPaths.

In genere, si memorizzano le impostazioni per utente in QStandardPaths::writableLocation(QStandardPaths::AppDataLocation). Se si desidera che le impostazioni non persistano nel profilo di roaming dell'utente su Windows, è possibile utilizzare QStandardPaths::AppLocalDataLocation, ha il significato di AppDataLocation su piattaforme non Windows.

Prima di poter utilizzare i percorsi standard, è necessario impostare il nome dell'applicazione tramite QCoreApplication::setApplicationName e il nome della propria organizzazione utilizzando setOrganizationName o setOrganizationDomain. Il percorso dipenderà da questi, quindi assicurati che siano unici per te. Se li cambi, perderai l'accesso alle vecchie impostazioni, quindi assicurati di mantenere il nome e il dominio che hanno senso per te.

Il percorso non è garantito. In caso contrario, devi crearlo da solo, ad es. utilizzando QDir::mkpath.

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    app.setOrganizationDomain("stackoverflow.com"); 
    app.setApplicationName("Q32525196.A32535544"); 
    auto path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); 
    if (path.isEmpty()) qFatal("Cannot determine settings storage location"); 
    QDir d{path}; 
    if (d.mkpath(d.absolutePath()) && QDir::setCurrentPath(d.absolutePath())) { 
    qDebug() << "settings in" << QDir::currentPath(); 
    QFile f{"settings.txt"}; 
    if (f.open(QIODevice::WriteOnly | QIODevice::Truncate)) 
     f.write("Hello, World"); 
    } 
} 
Problemi correlati