====== Desktop ====== ===== Desktop-Services ===== Qt erlaubt uns durch statische Methoden der Klasse ''QDesktopServices'' auch den Zugriff auf benutzerspezifische Dienste. === URL mit Standardprogramm öffnen === Die Methode ''openUrl()'' erlaubt es uns eine URL mit dem Standardprogramm zu öffnen. Eine URL kann auch ein Pfad zu einer lokalen Datei sein. Folgendes Programm öffnet die Datei ''main.cpp'' mit dem Standardprogramm. Dies kann der Qt-Creator, eine andere Entwicklungsumgebung, ein Texteditor oder ein anderes Programm sein. #include #include int main() { QDesktopServices::openUrl( QUrl( "main.cpp" ) ); return 0; } Ähnlich können wir eine Website im Standard-Browser öffnen: #include #include int main() { QDesktopServices::openUrl( QUrl( "https://proggen.org/" ) ); return 0; } === Benutzer-Verzeichnisse === Oft stellt das Betriebssystem dem Benutzer bereits eine Ordnerstruktur bereit, das für Desktop, Bilder, Dokumente, Filme, etc. ausgelegt ist. Diese Pfade können wir mit dem Aufruf von ''storageLocation()'' und einem ''StandardLocation''-Enum abfragen. Kann der Ort nicht festgestellt werden, wird eine leerer String zurückgegeben. #include #include int main() { std::cout << "Desktop: " << QDesktopServices::storageLocation( QDesktopServices::DesktopLocation ).toStdString() << std::endl; std::cout << "Dokumente: " << QDesktopServices::storageLocation( QDesktopServices::DocumentsLocation ).toStdString() << std::endl; std::cout << "Schriftarten: " << QDesktopServices::storageLocation( QDesktopServices::FontsLocation ).toStdString() << std::endl; std::cout << "Anwendungen: " << QDesktopServices::storageLocation( QDesktopServices::ApplicationsLocation ).toStdString() << std::endl; std::cout << "Musik: " << QDesktopServices::storageLocation( QDesktopServices::MusicLocation ).toStdString() << std::endl; std::cout << "Filme: " << QDesktopServices::storageLocation( QDesktopServices::MoviesLocation ).toStdString() << std::endl; std::cout << "Bilder: " << QDesktopServices::storageLocation( QDesktopServices::PicturesLocation ).toStdString() << std::endl; std::cout << "Temporaere Daten: " << QDesktopServices::storageLocation( QDesktopServices::TempLocation ).toStdString() << std::endl; std::cout << "Benutzerverzeichnis: " << QDesktopServices::storageLocation( QDesktopServices::HomeLocation ).toStdString() << std::endl; std::cout << "Bestaendige Daten: " << QDesktopServices::storageLocation( QDesktopServices::DataLocation ).toStdString() << std::endl; std::cout << "Cache: " << QDesktopServices::storageLocation( QDesktopServices::CacheLocation ).toStdString() << std::endl; return 0; } Ausgabe: Desktop: /home/daniel/Desktop Dokumente: /home/daniel/Dokumente Schriftarten: /home/daniel/.fonts Anwendungen: Musik: /home/daniel/Musik Filme: /home/daniel/Videos Bilder: /home/daniel/Bilder Temporaere Daten: /tmp Benutzerverzeichnis: /home/daniel Bestaendige Daten: /home/daniel/.local/share/data// Cache: /home/daniel/.cache// ===== Bildschirm-Informationen ===== Wenn unsere Anwendung sich an einer bestimmten Position am Bildschirm befinden soll können wir die Klasse ''QDesktopWidget'' verwenden um die entsprechende Position zu berechnen. Ein Objekt dieser Klasse erhält man über die statische Methode ''QApplication::desktop()'' und sollte nicht selbst angelegt werden. \\ Über die Methoden ''screenGeometry()'' und ''availableGeometry()'' können wir die Größe des Bildschirms abfragen, wobei uns letztere Methode die Größe exklusive Panels, Docks, etc. liefert. Als Bildschirmnummer kann ''primaryScreen()'' übergeben werden, was - wie schwer zu erraten ist - die Bildschirmnummer des primären Bildschirms zurückgibt. \\ Mehrere Bildschirme können zu einem virtuellem Bildschirm zusammengeschlossen werden. Dieser verhält sich wie ein einzelner physikalischer und Fenster können zwischen den physikalischen Bildschirmen verschoben werden. Wenn wir die Position eines Widgets in absoluten Koordinaten festlegen sollten wir immer zuerst mit der Funktion ''isVirtualDesktop()'' auf einen virtuellen Bildschirm prüfen. Ansonsten landet z.B. unsere zentrierte Anwendung auf zwei physikalischen Bildschirmen, was nicht besonders schön ist. \\ Seit Qt 4.6 kann über die Methode ''screenCount()'' auch die Anzahl der physikalischen Bildschirme abgefragt werden. \\ Mit den genannten Funktionen wollen wir nun Informationen des Bildschirms abfragen: #include #include #include int main( int argc, char *argv[] ) { // zuerst muss eine QApplication-Instanz angelegt werden QApplication app( argc, argv ); // DesktopWidget von der statischen Methode erhalten QDesktopWidget *s = QApplication::desktop(); // Widget für den gesamten virtuellen Bildschirm erhalten QWidget *w = s->screen(); // ausgeben ob virtueller Bildschirm oder nicht std::cout << ( ( s->isVirtualDesktop() ) ? "virtueller Bildschirm" : "kein virtueller Bildschirm" ) << std::endl; // Anzahl der Bildschirme ausgeben (diese Methode gibt es erst seit Qt 4.6!) std::cout << s->screenCount() << " Bildschirm(e) vorhanden" << std::endl; // Gesamtgröße des Bildschirms (inklusive virtueller Bildschirme) abfragen und ausgeben QRect geometry = w->geometry(); std::cout << "gesamte Bildschirmgroesse: " << geometry.width() << "*" << geometry.height() << std::endl; // Gesamtgröße des primären Bildschirms abfragen und ausgeben geometry = s->screenGeometry( s->primaryScreen() ); std::cout << "Bildschirmgroesse (primaerer Bildschirm): " << geometry.width() << "*" << geometry.height() << std::endl; // verfügbare Größe (exklusive Panels, Docks, etc.) des primären Bildschirms ausgeben geometry = s->availableGeometry( s->primaryScreen() ); std::cout << "verfuegbare Groesse (primaerer Bildschirm): " << geometry.width() << "*" << geometry.height() << std::endl; return 0; } Bildschirmeinstellungen: \\ {{:frameworks:qt:generalclasses:screens.png|}} \\ Ausgabe: virtueller Bildschirm 2 Bildschirm(e) vorhanden gesamte Bildschirmgroesse: 2464*900 Bildschirmgroesse (primaerer Bildschirm): 1440*900 verfuegbare Groesse (primaerer Bildschirm): 1440*875