Warum Accessibility nichts mit „Weicheiern“ zu tun hat, sondern mit Code-Qualität
\n\nWenn 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\nStellen 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\nIn 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\nWo anfangen: Grundprinzipien inklusiven Codes
\n\nBevor 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
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\nSemantische Auszeichnung in C++ GUI: Qt und mehr
\n\nDer 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.
Beispiel: Eine Schaltfläche zugänglich machen
\n\nAngenommen, 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\nJetzt liest der Screen Reader „Senden, Schaltfläche“. Magie? Nein, einfach inklusiver Code.
\n\nAccessibility in Konsolenanwendungen mit C++
\n\nMan 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\nKorrekte Ausgabe für Screen Reader
\n\nScreen 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&