2015-09-11 26 views
5

Mój program musi odczytać/zapisać plik tekstowy (tylko kilka linii) z jego ustawieniami na dysku. Aby określić ścieżkę w kodzie może dobrze działać na jednej platformie, np. Windows, ale jeśli działa na Linuksie, ścieżka nie jest wieloplatformowa.Jak uzyskać ścieżkę do przechowywania ustawień na wiele platform w Qt?

Szukam podobnego rozwiązania do QSettings, które zapisuje ustawienia do różnych ścieżek lub ma natywne sposoby radzenia sobie z tym. Programiści nie muszą zajmować się szczegółami. Ale plik tekstowy nie jest odpowiedni do zapisania jako wartość w QSettings.

Aby uzyskać taką ścieżkę, nie jest wymagana interakcja użytkownika. Plik tekstowy powinien zachowywać się po ponownym uruchomieniu aplikacji. To nie może być plik tymczasowy.

Czy istnieje jakieś rozwiązanie w Qt i jakiego interfejsu API należy użyć?

Odpowiedz

0

Jest QDir obsługiwać ścieżki do katalogów, QFileInfo do informacji niezależny od platformy plików i QDir „s homePath()

Moja propozycja jest do korzystania z tych klas i używać QDir::home() lub QDir::homePath() znaleźć katalog, w którym do zapisu, ponieważ użytkownik ma uprawnienia do zapisu w swoim homedirze i istnieje na każdej platformie.

+0

'homePath' i co wtedy? W systemie Windows, to w' '% USERPROFILE%, i jeśli zaczniesz losowo tam pisać, możesz mieć kłopoty: na OS X i Linuksie, to w katalogu domowym, gdzie musisz przestrzegać konwencje ścieżki specyficzne dla platformy.Eh użytkownicy, którzy złapią cię pisanie do '. ~/xyz' na systemie OS X cię nie lubię. 'QDir :: homePath' jest starszą wersją i zasadniczo bezużyteczną do pisania w środowisku wieloplatformowym.Możesz czytać stamtąd, ale nie pisać bez informowania użytkownika, gdzie pisać. –

0

Jeśli chcesz zapisać niektóre dane związane z użytkownikiem, możesz uzyskać ścieżkę do katalogu domowego użytkownika, korzystając z QDir::homePath().

+0

... i trzeba napisać kilka platform kodu specyficznego wyboru, gdzie w tym katalogu domowym napisać :( –

-1

Możesz przechowywać plik w katalogu aplikacji. Spójrz na QCoreApplication::applicationDirPath().

Z dokumentacji Qt:

Zwraca katalog zawierający plik wykonywalny aplikacji.

+0

Zazwyczaj nie jest to zapisywalny, więc byłby to zły pomysł. –

6

Lokalizacja przechowywania ustawień specyficznych dla aplikacji różni się w zależności od platformy. Qt 5 zapewnia rozsądne rozwiązanie za pośrednictwem QStandardPaths.

Ogólnie można przechowywać ustawienia dla poszczególnych użytkowników w QStandardPaths::writableLocation(QStandardPaths::AppDataLocation). Jeśli chcesz, aby ustawienia nie utrzymywały się w profilu mobilnym użytkownika w systemie Windows, możesz użyć QStandardPaths::AppLocalDataLocation, ma on znaczenie AppDataLocation na platformach innych niż Windows.

Zanim będzie można korzystać ze standardowych ścieżek, należy ustawić nazwę aplikacji za pomocą QCoreApplication::setApplicationName, a nazwę organizacji za pomocą setOrganizationName lub . Ścieżka będzie zależeć od nich, więc upewnij się, że są one unikatowe. Jeśli je zmienisz, utracisz dostęp do starych ustawień, więc upewnij się, że trzymasz się nazwy i domeny, która ma dla Ciebie sens.

Ścieżka nie może istnieć. Jeśli nie, musisz utworzyć go sam, np. przy użyciu 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"); 
    } 
}