JGU Logo JGU Logo JGU Logo JGU Logo

Institut für Informatik

Michael Wand
Christian Ali Mehmeti-Göpel
Wintersemester 2020/21DIGITAL

Blatt 09

Anlage: GUIs mit Qt
Einführung in die Softwareentwicklung



Qt Basics

Was ist Qt?

Qt ist ein Toolkit, das dabei hilft Programme (und insbesondere Programmoberflächen) plattformübergreifend zu entwickeln. Bei der richtigen Verwendung kann Ihr Programm nicht nur auf Windows und gängigen POSIX-Systemen, sondern mittlerweile auch auf Android, iOS, Windows Phone und eingebetteten Systemen ausgeführt werden.


In dieser Übersicht soll ein kleiner Teil von Qt (in seiner aktuellen Version Qt5.15) vorgestellt werden, der für die Lösung der Aufgaben ausreichen sollte.



Bauen von Qt-Programmen

QtCreator:
Wählen Sie beim Erstellen eines Projektes den Projekttyp: Application (Qt) -> Qt Widgets AApplication.


CMake:
Sofern Sie bereits mit CMake vertraut sind, ist das Bauen gegen Qt einfach durch target_link_libraries möglich:

CMakeLists.txt

cmake_minimum_required(VERSION 3.0.2)
project(GuiProgramm)

find_package(Qt5Widgets REQUIRED)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

add_executable(GuiProgramm gui.cpp)
target_link_libraries (GuiProgramm Qt5::Widgets)

Bauen kann man dann wie mit Cmake üblich mit: cmake .; make


QMake:
QMake ist wie CMake ein Makefile-Generator, der jedoch für Qt spezialisiert ist.

GuiProgramm.pro

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = GuiProgramm
TEMPLATE = app
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

CONFIG += c++17

SOURCES += gui.cpp

Bauen kann man dann ähnlich wie mit Cmake mit: qmake .; make

Verwendung von Qt - Quickstart

Bevor Sie die Klassen aus Qt verwenden können, müssen Sie zuvor ein QApplication-Objekt erstellen. Dieses kümmert sich darum, dass Kommandozeilenargumente an die GUI Ihres Programms richtig übergeben werden, Events/Interaktiv bearbeitet werden, Ihr Programm richtig initialisiert wird uvm.


#include <QtWidgets>

// argc bekommt die Anzahl der Kommandozeilenargumente übergeben, 
// argv bekommt die Argument selbst übergeben
// Bsp.:
// Windows:
// abc.exe blub bla
// Linux/OS X:
// ./abc blub bla
// führt zu 
// argc ist 3
// argv ist {"./abc", "blub", "bla"}
int main(int argc, char *argv[])
{
    # Initialisierung des Programms und Ihrer GUI
    QApplication app(argc, argv);

    // ...
    // Ihr Programmcode
    // ...

    // Starten der Ereignisschleife (engl. event loop; Abfangen von Klicken,
    // Tippen, etc.) und beenden des gesamten Programms beim Beenden des Qt-Teils
    // (dies geschieht standardmäßig beim Schließen aller Fenster).
    // Diese beiden Schritte zu trennen ist innerhalb dieses Praktikums nicht nötig.
    return app.exec();
}

Achtung: Vergessen Sie beim Testen nicht QApplication zu initialisieren und am Ende auszuführen (app.exec()). Falls Sie es vergessen, werden Sie unter Umständen ein schwarzes Fenster sehen, auf jeden Fall aber sind dann Ihre Interaktionsmöglichkeiten mit der Anwendung sehr beschränkt.


Hallo Welt Testen Sie den folgenden Code und versuchen Sie nachzuvollziehen, was geschieht:


#include <QtWidgets>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget w;
    QLabel *l = new QLabel(&w);
    l->setText("Hallo Welt!");
    // Alternativ:
    /* QLabel *l2 = new QLabel("Nochmals hallo!",&w); */
    w.setGeometry(120,120,200,50);
    w.move(100,300);
    w.setWindowTitle("Tadaa, ein Fenster");
    w.show();

    return app.exec();
}