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 <QDesktopServices>
#include <QUrl>
 
int main()
{
  QDesktopServices::openUrl( QUrl( "main.cpp" ) );
  return 0;
}

Ähnlich können wir eine Website im Standard-Browser öffnen:

#include <QDesktopServices>
#include <QUrl>
 
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 <QDesktopServices>
#include <iostream>
 
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 <QDesktopWidget>
#include <QApplication>
#include <iostream>
 
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:

Ausgabe:

virtueller Bildschirm
2 Bildschirm(e) vorhanden
gesamte Bildschirmgroesse: 2464*900
Bildschirmgroesse (primaerer Bildschirm): 1440*900
verfuegbare Groesse (primaerer Bildschirm): 1440*875