| name | qt-widget-accessibility-audit |
| description | Audit Qt Widget applications for accessibility compliance using QAccessible interface and platform accessibility APIs |
| allowed-tools | Read, Grep, Glob, Bash |
| tags | ["qt","accessibility","wcag","a11y","audit"] |
| graph | {"domains":["domain:software-engineering"],"specializations":["specialization:desktop-development"],"skillAreas":["skill-area:desktop-ui-frameworks","skill-area:accessibility-testing"],"roles":["role:desktop-developer","role:fullstack-engineer"],"workflows":["workflow:feature-development","workflow:release-management"],"topics":["topic:accessibility"]} |
qt-widget-accessibility-audit
Audit Qt Widget and Qt Quick applications for accessibility compliance. This skill checks QAccessible interface implementations, keyboard navigation, screen reader compatibility, and WCAG guidelines adherence.
Capabilities
- Audit QAccessible interface implementations
- Check keyboard navigation and focus handling
- Verify screen reader compatibility
- Validate high contrast and color accessibility
- Check text scaling support
- Review accessible names and descriptions
- Test with platform accessibility tools
- Generate accessibility compliance reports
Input Schema
{
"type": "object",
"properties": {
"projectPath": {
"type": "string",
"description": "Path to the Qt project"
},
"auditLevel": {
"enum": ["basic", "wcag-a", "wcag-aa", "wcag-aaa"],
"default": "wcag-aa"
},
"targetPlatform": {
"enum": ["windows", "macos", "linux"],
"description": "Platform to focus accessibility checks"
}
Output Schema
{
"type": "object",
"properties": {
"success": { "type": "boolean" },
"complianceLevel": {
"enum": ["none", "wcag-a", "wcag-aa", "wcag-aaa"]
},
"score": {
"type": "number",
"description": "Accessibility score 0-100"
},
"issues": {
"type": "array",
"items": {
"type": "object",
Accessibility Checks
QAccessible Interface
bool hasAccessibleName(QWidget* widget) {
return !widget->accessibleName().isEmpty() ||
!widget->accessibleDescription().isEmpty();
}
class CustomWidget : public QWidget {
QAccessibleInterface* accessibleInterface() {
return QAccessible::queryAccessibleInterface(this);
}
};
Keyboard Navigation
void auditFocusPolicy(QWidget* widget) {
if (isInteractive(widget)) {
if (widget->focusPolicy() == Qt::NoFocus) {
reportIssue("Interactive widget not focusable", widget);
}
}
}
void auditTabOrder(QWidget* container) {
QList<QWidget*> tabOrder = getTabOrder(container);
}
Visual Accessibility
bool hasAdequateContrast(QColor foreground, QColor background) {
double ratio = calculateContrastRatio(foreground, background);
return ratio >= 4.5;
}
void auditFontScaling(QWidget* widget) {
QFont font = widget->font();
if (font.pixelSize() > 0) {
reportIssue("Use point size instead of pixel size", widget);
}
}
Common Issues
Missing Accessible Names
QPushButton* btn = new QPushButton(QIcon(":/save.png"), "");
QPushButton* btn = new QPushButton(QIcon(":/save.png"), "");
btn->setAccessibleName(tr("Save"));
btn->setAccessibleDescription(tr("Save the current document"));
Non-Focusable Controls
CustomControl* ctrl = new CustomControl();
ctrl->setFocusPolicy(Qt::NoFocus);
CustomControl* ctrl = new CustomControl();
ctrl->setFocusPolicy(Qt::StrongFocus);
Insufficient Contrast
label->setStyleSheet("color: #888888; background: white;");
label->setStyleSheet("color: #595959; background: white;");
QML Accessibility
// Accessible QML component
Button {
text: qsTr("Submit")
Accessible.name: qsTr("Submit form")
Accessible.description: qsTr("Submit the registration form")
Accessible.role: Accessible.Button
// Keyboard handling
Keys.onReturnPressed: clicked()
Keys.onEnterPressed: clicked()
}
// Accessible image
Image {
source: "chart.png"
Accessible.name: qsTr("Sales chart for Q4 2024")
Accessible.role: Accessible.Graphic
}
// Focus indicator
Rectangle {
border.color: parent.activeFocus ? "blue" : "transparent"
border.width: 2
}
Platform Tools Integration
Windows (UI Automation)
void testWithUIAutomation() {
}
macOS (VoiceOver)
void testWithVoiceOver() {
}
Linux (Orca/AT-SPI)
void testWithATSPI() {
}
WCAG Guidelines Mapping
| WCAG Criterion | Qt Implementation |
|---|
| 1.1.1 Non-text Content | setAccessibleName() for images/icons |
| 1.4.3 Contrast | QPalette with sufficient contrast |
| 2.1.1 Keyboard | setFocusPolicy(), key handlers |
| 2.4.3 Focus Order | setTabOrder() |
| 2.4.7 Focus Visible | Focus indicators in stylesheet |
| 4.1.2 Name, Role, Value | QAccessible interface |
Best Practices
- Set accessible names: All interactive widgets need names
- Use semantic roles: Proper QAccessible::Role
- Support keyboard: All features accessible via keyboard
- Visible focus: Clear focus indicators
- Color independence: Don't rely on color alone
- Scalable text: Use point sizes, support scaling
Related Skills
accessibility-test-runner - Automated testing
qt-qml-component-generator - Accessible components
desktop-accessibility process - Full workflow
Related Agents
accessibility-compliance-auditor - Compliance expertise
qt-cpp-specialist - Qt implementation guidance