Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate QML components with proper property bindings, signal/slot connections, and Qt Quick Controls integration
.claude/skills/a5c-ai-qt-qml-component-generator/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 40% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 92% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 70% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 0% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 152% | 0% |
Generate QML components with proper property bindings, signal/slot connections, and Qt Quick Controls integration. This skill creates well-structured QML components following Qt best practices.
json{ "type": "object", "properties": { "projectPath": { "type": "string", "description": "Path to the Qt project" }, "componentName": { "type": "string", "description": "Name of the QML component" }, "componentType": { "enum": ["item", "control", "popup", "view", "delegate", "singleton"], "default": "item" }, "properties": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "type": { "type": "string" }, "defaultValue": { "type": "string" }, "readonly": { "type": "boolean" } } } }, "signals": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "parameters": { "type": "array" } } } }, "cppBackend": { "type": "boolean", "description": "Generate C++ backend class", "default": false }, "useControls": { "enum": ["none", "basic", "material", "universal", "fusion"], "default": "basic" } }, "required": ["projectPath", "componentName"] }
json{ "type": "object", "properties": { "success": { "type": "boolean" }, "files": { "type": "array", "items": { "type": "object", "properties": { "path": { "type": "string" }, "type": { "enum": ["qml", "cpp", "cmake"] } } } }, "registrationCode": { "type": "string", "description": "C++ code to register the component" } }, "required": ["success"] }
qml// CustomButton.qml import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 Control { id: root // Properties property string text: "" property color backgroundColor: "#2196F3" property color textColor: "white" property bool loading: false readonly property bool pressed: mouseArea.pressed // Signals signal clicked() signal pressAndHold() // Size hints implicitWidth: Math.max(implicitBackgroundWidth + leftPadding + rightPadding, implicitContentWidth + leftPadding + rightPadding) implicitHeight: Math.max(implicitBackgroundHeight + topPadding + bottomPadding, implicitContentHeight + topPadding + bottomPadding) padding: 12 // Background background: Rectangle { radius: 4 color: root.pressed ? Qt.darker(root.backgroundColor, 1.2) : root.backgroundColor Behavior on color { ColorAnimation { duration: 100 } } } // Content contentItem: RowLayout { spacing: 8 BusyIndicator { visible: root.loading running: root.loading Layout.preferredWidth: 20 Layout.preferredHeight: 20 } Text { text: root.text color: root.textColor font.pixelSize: 14 font.weight: Font.Medium horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter Layout.fillWidth: true } } // Interaction MouseArea { id: mouseArea anchors.fill: parent enabled: !root.loading onClicked: root.clicked() onPressAndHold: root.pressAndHold() } }
cpp// custombutton.h #ifndef CUSTOMBUTTON_H #define CUSTOMBUTTON_H #include <QObject> #include <QQmlEngine> class CustomButtonBackend : public QObject { Q_OBJECT QML_ELEMENT Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) Q_PROPERTY(bool loading READ loading WRITE setLoading NOTIFY loadingChanged) public: explicit CustomButtonBackend(QObject *parent = nullptr); QString text() const; void setText(const QString &text); bool loading() const; void setLoading(bool loading); signals: void textChanged(); void loadingChanged(); void clicked(); public slots: void handleClick(); private: QString m_text; bool m_loading = false; }; #endif // CUSTOMBUTTON_H
qml/
├── MyComponents/
│ ├── qmldir
│ ├── CustomButton.qml
│ ├── CustomTextField.qml
│ └── CustomDialog.qml
└── main.qml# qmldir
module MyComponents
CustomButton 1.0 CustomButton.qml
CustomTextField 1.0 CustomTextField.qml
CustomDialog 1.0 CustomDialog.qmlcmakeqt_add_qml_module(myapp URI MyComponents VERSION 1.0 QML_FILES qml/MyComponents/CustomButton.qml qml/MyComponents/CustomTextField.qml SOURCES src/custombutton.cpp src/custombutton.h )
qml// UserListView.qml import QtQuick 2.15 import QtQuick.Controls 2.15 ListView { id: root property alias model: root.model signal itemSelected(int index, var data) clip: true spacing: 4 delegate: ItemDelegate { width: ListView.view.width height: 60 contentItem: Row { spacing: 12 Image { source: model.avatar width: 48 height: 48 fillMode: Image.PreserveAspectCrop } Column { anchors.verticalCenter: parent.verticalCenter Text { text: model.name font.bold: true } Text { text: model.email color: "gray" font.pixelSize: 12 } } } onClicked: root.itemSelected(index, model) } ScrollBar.vertical: ScrollBar {} }
qt-cmake-project-generator - Project setupqt-translation-workflow - Internationalizationqt-widget-accessibility-audit - Accessibilityqt-cpp-specialist - Qt/C++ expertisedesktop-ux-analyst - UX review| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 11,513 | 9,321 | -19% | 1 | 1 | 0% | 2,979 | 4,180 | +40% | 0 | 0 | — |
case-02 | fail→pass | 9,980 | 9,218 | -8% | 1 | 1 | 0% | 2,181 | 4,185 | +92% | 0 | 0 | — |
case-03 | pass→pass | 8,130 | 6,830 | -16% | 1 | 1 | 0% | 1,576 | 3,028 | +92% | 0 | 0 | — |
case-04 | pass→pass | 11,329 | 7,155 | -37% | 1 | 1 | 0% | 2,156 | 3,183 | +48% | 0 | 0 | — |
case-05 | fail→pass | 12,811 | 11,172 | -13% | 1 | 1 | 0% | 2,427 | 4,117 | +70% | 0 | 0 | — |
case-06 | fail→pass | 17,259 | 10,183 | -41% | 1 | 1 | 0% | 4,343 | 4,336 | -0% | 0 | 0 | — |
case-07 | fail→pass | 6,998 | 8,574 | +23% | 1 | 1 | 0% | 1,538 | 3,878 | +152% | 0 | 0 | — |
case-08 | fail→pass | 9,472 | 8,951 | -6% | 1 | 1 | 0% | 2,195 | 3,998 | +82% | 0 | 0 | — |
case-09 | fail→pass | 10,044 | 11,127 | +11% | 1 | 1 | 0% | 2,381 | 4,659 | +96% | 0 | 0 | — |
case-10 | fail→fail | 7,575 | 4,618 | -39% | 1 | 1 | 0% | 1,238 | 2,925 | +136% | 0 | 0 | — |
case-11 | fail→pass | 3,177 | 6,633 | +109% | 1 | 1 | 0% | 590 | 3,419 | +479% | 0 | 0 | — |
case-12 | fail→pass | 4,835 | 9,163 | +90% | 1 | 1 | 0% | 1,054 | 4,109 | +290% | 0 | 0 | — |
case-13 | fail→pass | 23,834 | 11,082 | -54% | 1 | 1 | 0% | 4,450 | 3,830 | -14% | 0 | 0 | — |
case-14 | fail→pass | 10,321 | 8,979 | -13% | 1 | 1 | 0% | 2,555 | 3,794 | +48% | 0 | 0 | — |
case-15 | fail→pass | 16,257 | 6,977 | -57% | 1 | 1 | 0% | 2,836 | 3,574 | +26% | 0 | 0 | — |
case-16 | pass→pass | 11,043 | 9,325 | -16% | 1 | 1 | 0% | 2,005 | 4,073 | +103% | 0 | 0 | — |
case-17 | fail→pass | 5,911 | 12,329 | +109% | 1 | 1 | 0% | 1,154 | 4,715 | +309% | 0 | 0 | — |
case-18 | pass→pass | 10,586 | 11,247 | +6% | 1 | 1 | 0% | 2,558 | 4,699 | +84% | 0 | 0 | — |
case-19 | fail→pass | 5,003 | 13,925 | +178% | 1 | 1 | 0% | 1,070 | 5,437 | +408% | 0 | 0 | — |
case-20 | fail→fail | 9,602 | 6,852 | -29% | 1 | 1 | 0% | 2,428 | 3,380 | +39% | 0 | 0 | — |
case-21 | pass→pass | 6,144 | 10,474 | +70% | 1 | 1 | 0% | 1,372 | 4,482 | +227% | 0 | 0 | — |
case-22 | fail→pass | 5,596 | 5,136 | -8% | 1 | 1 | 0% | 1,257 | 3,092 | +146% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +68 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.