C++ ohne Barrieren: Wie man Code für alle zugänglich macht

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum Accessibility nichts mit „Weicheiern“ zu tun hat, sondern mit Code-Qualität

\n\n

Wenn wir in C++ programmieren, denken wir gewöhnlich an Leistung, Speicher und Geschwindigkeit. Aber es gibt noch einen weiteren Aspekt, der oft übersehen wird – Accessibility. Das ist nicht nur ein modischer Begriff aus der Webentwicklung. In C++ bedeutet Barrierefreiheit von Anwendungen, dass Menschen mit Behinderungen (Seh-, Hör- oder motorische Beeinträchtigungen) Ihre Software gleichberechtigt nutzen können.

\n\n

Stellen Sie sich vor: Sie haben einen tollen Grafikeditor oder ein Konsolen-Dienstprogramm erstellt. Aber wenn es von einem Screen Reader nicht gelesen oder nicht mit der Tastatur bedient werden kann, schließen Sie 15–20 % der Nutzer aus. Außerdem ist Accessibility oft eine gesetzliche Anforderung (z. B. in den USA Section 508, in Europa EN 301 549).

\n\n

In diesem Artikel schauen wir uns an, wie Sie a11y Best Practices (a11y – numerische Abkürzung für Accessibility) in C++-Projekte integrieren, ohne die Leistung zu opfern. Los geht's!

\n\n

Wo anfangen: Grundprinzipien inklusiven Codes

\n\n

Bevor wir in den Code eintauchen, merken Sie sich die drei Säulen:

\n\n
    \n
  • Wahrnehmbarkeit – Informationen müssen über mindestens einen Sinn (Sehen, Hören, Tasten) zugänglich sein.
  • \n
  • Bedienbarkeit – Die Oberfläche muss mit Tastatur, Sprache oder Schaltern funktionieren.
  • \n
  • Verständlichkeit – Das Verhalten der Elemente ist vorhersehbar, Fehler sind verständlich.
  • \n
\n\n

In C++ ist dies besonders wichtig, da wir oft mit Low-Level-APIs arbeiten, bei denen die Semantik verloren geht. Wenn Sie beispielsweise eine Schaltfläche mit OpenGL zeichnen, erhalten Sie keine automatische Unterstützung für Screen Reader – diese muss manuell hinzugefügt werden.

\n\n

Semantische Auszeichnung in C++ GUI: Qt und mehr

\n\n

Der gebräuchlichste Weg, Accessibility in C++ hinzuzufügen, ist die Verwendung des Frameworks Qt. Es bietet integrierte Unterstützung über QAccessibleInterface. Aber selbst wenn Sie mit reinem WinAPI programmieren, gibt es IAccessible.

\n\n

Beispiel: Eine Schaltfläche zugänglich machen

\n\n

Angenommen, Sie haben eine benutzerdefinierte Schaltfläche, die mit QPainter gezeichnet wurde. Ohne Accessibility sieht der Screen Reader nur ein „Rechteck“. So beheben wir das:

\n\n
#include <QAccessible>\n#include <QAccessibleWidget>\n#include <QPushButton>\n\nclass AccessibleButton : public QAccessibleWidget {\npublic:\n    explicit AccessibleButton(QWidget* widget)\n        : QAccessibleWidget(widget, QAccessible::Button) {}\n\n    QString text(QAccessible::Text t) const override {\n        if (t == QAccessible::Name) {\n            auto* btn = qobject_cast<QPushButton*>(widget());\n            return btn ? btn->text() : QString();\n        }\n        return QAccessibleWidget::text(t);\n    }\n};\n\n// Verwendung:\nQPushButton* btn = new QPushButton("Senden");\nQAccessible::registerAccessibleFactory(\n    [](QObject* obj) -> QAccessibleInterface* {\n        if (auto* btn = qobject_cast<QPushButton*>(obj)) {\n            return new AccessibleButton(btn);\n        }\n        return nullptr;\n    }\n);
\n\n

Jetzt liest der Screen Reader „Senden, Schaltfläche“. Magie? Nein, einfach inklusiver Code.

\n\n

Accessibility in Konsolenanwendungen mit C++

\n\n

Man könnte meinen, die Konsole sei ein Relikt der Vergangenheit. Aber viele Dienstprogramme, CI/CD-Pipelines und Serveranwendungen laufen genau im Terminal. Wie macht man sie zugänglich?

\n\n

Korrekte Ausgabe für Screen Reader

\n\n

Screen Reader (z. B. NVDA, JAWS) lesen die Konsole zeilenweise. Wenn Sie eine Tabelle mit ASCII-Zeichen ausgeben, ist das ein Albtraum. Verwenden Sie stattdessen eine strukturierte Ausgabe:

\n\n
#include <iostream>\n#include <string>\n#include <vector>\n\nstruct User {\n    std::string name;\n    int age;\n};\n\nvoid printAccessibleTable(const std::vector<User>& users) {\n    // Screen Reader freundlich: zuerst Überschrift, dann Daten\n    std::cout << "Benutzertabelle:" << std::endl;\n    for (const auto&                

Blogs

Buchempfehlungen