====== 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( "http://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