Nova Flow OS
KDE Developer Platform
KDE Developer Platform
  • KDE Developer Platform
    • Getting started
      • Building KDE software
        • KDE software
        • Where to find the development team
        • Learning more
        • Choose what to work on
        • Source code cross-referencing
        • Installing build dependencies
        • Set up a development environment
        • Building KDE software with kdesrc-build
        • Basic troubleshooting
        • Tips and tricks
        • IDE Configuration
          • Setting up an IDE for KDE development
          • Visual Studio Code
          • Qt Creator
          • Kate
          • KDevelop
          • CLion
          • Sublime Text
        • Building KDE software manually
        • Building KDE software with distrobox and podman
      • Kirigami
        • KDE is ours
        • Setting up and getting started
        • Explaining pages
        • Layouts, ListViews, and Cards
        • Adding actions
        • Adding a dialog
        • Using separate files
        • Next steps
        • Colors and themes in Kirigami
        • Typography
        • Actions based components
        • Page rows and page stacks
        • Scrollable pages and list views
        • Cards
        • Drawers
        • Chips
        • Dialog types
        • Controls and interactive elements
        • Form layouts
        • Inline messages
        • Action toolbars
        • Progress bars and indicators
        • List views
        • Understanding CMakeLists
        • Figuring out main.cpp
        • Connect logic to your QML user interface
        • Connect models to your QML user interface
        • About page
        • Introduction to Kirigami Addons
        • FormCard About pages
        • Form delegates in your settings pages
      • KXmlGui
        • Getting started with KXmlGui
        • Hello World!
        • Creating the main window
        • Using actions
        • Saving and loading
        • Command line interface
      • Python with Kirigami
        • Apps with QML and Python
        • Your first Python + Kirigami application
        • Creating a Python package
        • Creating a Flatpak
      • Common programming mistakes
      • Adding a new KDE project
    • Features
      • Icons
      • Configuration
        • The KConfig Framework
        • Introduction to KConfig
        • Using KConfig XT
        • KDE Frameworks 6 porting guide
        • Settings module (KCM) development
        • KConfigDialog
      • D-Bus
        • What is D-Bus practically useful for?
        • Introduction to D-Bus
        • Accessing D-Bus interfaces
        • Intermediate D-Bus
        • Creating D-Bus interfaces
        • Using custom types with D-Bus
        • D-Bus autostart services
      • Create your own mouse cursor theme
      • Session management
      • Archives
      • Desktop file
      • KAuth
        • Privilege Escalation
        • Using actions in your applications
      • KIdleTime
      • Akonadi: personal information management
        • Debugging Akonadi Resources
        • Using Akonadi in applications
      • Concurrent programming
      • Solid
      • Sonnet
    • Plasma themes and plugins
      • Getting started
      • Plasma Widget tutorial
        • How to create a plasmoid
        • Setup
        • Porting Plasmoids to KF6
        • Testing
        • QML
        • Plasma's QML API
        • Widget Properties
        • Configuration
        • Translations / i18n
        • Examples
        • C++ API
      • KWin Effects
      • Plasma Desktop scripting
        • Javascript Interaction With Plasma Shells
        • Templates
        • Examples
        • API documentation
        • Configuration keys
      • Plasma Style tutorial
        • Creating a Plasma Style quickstart
        • Understanding Plasma Styles
        • SVG elements and Inkscape
        • Background SVG format
        • System and accent colors
        • Theme elements reference
        • Porting themes to Plasma 5
        • Porting themes to Plasma 6
      • Aurorae window decorations
      • KWin scripting tutorial
        • Quick start
        • KWin scripting API
      • Wallpapers
      • Plasma comic
        • Tutorial
        • Testing and debugging
        • Examples
      • Create a custom Window Switcher
      • KRunner C++ Plugin
        • Basic Anatomy of a Runner
        • KRunner metadata format
    • Applications
      • Creating sensor faces
      • Dolphin
        • Creating Dolphin service menus
      • Kate
        • Kate plugin tutorial
      • KMines
        • Making a KMines theme
      • Writing tests
        • Appium automation testing
    • Packaging
      • Android
        • KDE on Android
        • Building applications for Android
        • Packaging and publishing applications for Android
        • Publishing on Google Play
          • Introduction
          • Packaging your app
          • Adding your app to Google Play
          • Publishing your app
          • Releasing new versions of old apps
        • Porting applications to Android
          • Basic porting
          • Making applications run well on Android
          • Metadata
      • Windows
        • Packaging and publishing applications for Windows
        • Publish your app in the Microsoft Store
          • Packaging your app for the Microsoft Store
          • Submitting your app to the Microsoft Store
      • Plasma Mobile
        • KDE on mobile devices
        • Porting a new device to Plasma Mobile
        • KDE Telephony stack
          • General Overview
          • Kernel layer
          • System daemons
            • General overview
            • Developing Telephony functionality
            • ModemManager Telephony functions
          • Session daemons
          • QML declarative plugin layer
          • KDE application layer
        • Execute applications
      • Distributing KDE software as Flatpak
        • Your first Flatpak
        • Extending your package
        • Nightly Flatpaks and Flathub
        • Testing your Flatpak
    • System administration
      • Shell scripting with KDE dialogs
      • Kiosk: Simple configuration management for large deployment
        • Abstract
        • Introduction to Kiosk
        • Kiosk keys
    • Contribute to the documentation
    • About
      • Readme
      • License
        • Creative Commons Attribution-ShareAlike 4.0 International
        • GNU General Public License 3.0 or later
Powered by GitBook
On this page
  • Intro
  • PlasmaComponents Controls
  • PlasmaExtras
  • PlasmaCore
  1. KDE Developer Platform
  2. Plasma themes and plugins
  3. Plasma Widget tutorial

Plasma's QML API

A rundown of the QML types shipped in KDE Frameworks

PreviousQMLNextWidget Properties

Last updated 8 months ago

Intro

KDE Frameworks ships with a number of useful extensions to Qt's QML. The is a good start if you need to know what a specific property does. If you want to browse any of the sources easier, it's also .

PlasmaComponents Controls

QML ships with various controls, like , , (dropdown menu), , , , , , . Plasma extends these controls to style them using the SVGs from the Plasma Style. It also assigns a number of default settings like setting the text color to follow the panel's color scheme.

PlasmaComponents 3 is a QML library that extends the with defaults adapted to fit into Plasma widgets. Because PlasmaComponents 3 inherits from Qt Quick Controls 2, they have the same API, so the can be followed. For Plasma's specific behaviour changes, you can read the QML source code for each control in:

Removed in Plasma 6.0: was used in Plasma 5. It used the older .

Label

are used for displaying text to the user. Plasma's Label are assigned a number of defaults. One thing is it sets the text color to follow the panel's color scheme.

For the specifics, you can read the .

contents/ui/main.qml

import QtQuick 2.0
import org.kde.plasma.components 3.0 as PlasmaComponents3

PlasmaComponents3.Label {
    text: i18n("Hello World")
}

CheckBox - Toggle

contents/ui/main.qml

import QtQuick 2.0
import org.kde.plasma.components 3.0 as PlasmaComponents3

PlasmaComponents3.CheckBox {
    text: i18n("Hello World")
    checked: true
}

RadioButton - Multiple Choice

Note that the [KDE Human Interface Guidelines]({{< ref "/hig/getting_input" >}}) suggest using a ComboBox when there are more than 3 options.

contents/ui/main.qml

import QtQuick 2.0
import QtQuick.Controls 1.0
import QtQuick.Layouts 1.0
import org.kde.plasma.components 3.0 as PlasmaComponents3

ColumnLayout {
    PlasmaComponents3.RadioButton {
        text: i18n("Top")
        checked: true
        autoExclusive: true
    }
    PlasmaComponents3.RadioButton {
        text: i18n("Bottom")
        autoExclusive: true
    }
}

ComboBox - Multiple Choice

contents/ui/main.qml

import QtQuick 2.0
import org.kde.plasma.components 3.0 as PlasmaComponents3

PlasmaComponents3.ComboBox {
    textRole: "text"
    valueRole: "value"
    model: [
        { value: "a", text: i18n("A") },
        { value: "b", text: i18n("B") },
        { value: "c", text: i18n("C") },
    ]
}
PlasmaComponents3.ComboBox {
    textRole: "text"
    property string _valueRole: "value"
    readonly property var _currentValue: _valueRole && currentIndex >= 0 ? model[currentIndex][_valueRole] : null
}

Slider - Numbers

contents/ui/main.qml

import QtQuick 2.4
import QtQuick.Layouts 1.0
import org.kde.plasma.components 3.0 as PlasmaComponents3

RowLayout {
    PlasmaComponents3.Slider {
        id: slider
        Layout.fillWidth: true
        from: 0
        to: 100
        value: 50
        stepSize: 5
    }
    PlasmaComponents3.Label {
        id: sliderValueLabel
        function formatText(value) {
            return i18n("%1%", value)
        }
        text: formatText(slider.value)

        TextMetrics {
            id: textMetrics
            font.family: sliderValueLabel.font.family
            font.pointSize: sliderValueLabel.font.pointSize
            text: sliderValueLabel.formatText(slider.to)
        }
        Layout.minimumWidth: textMetrics.width
    }
}

SpinBox - Numbers

contents/ui/main.qml

import QtQuick 2.0
import QtQuick.Controls 1.0
import QtQuick.Layouts 1.0
import org.kde.plasma.components 3.0 as PlasmaComponents3

RowLayout {
    PlasmaComponents3.Label {
        text: i18n("Label:")
        Layout.alignment: Qt.AlignRight
    }
    PlasmaComponents3.SpinBox {
        from: 0
        to: 100
        value: 25
        stepSize: 1
    }
}

TextField, TextArea - Input

contents/ui/main.qml

import QtQuick 2.0
import QtQuick.Layouts 1.0
import org.kde.plasma.components 3.0 as PlasmaComponents3

RowLayout {
    PlasmaComponents3.Label {
        Layout.alignment: Qt.AlignRight
        text: i18n("Name:")
    }
    PlasmaComponents3.TextField {
        placeholderText: i18n("Name")
    }
}

contents/ui/main.qml

import QtQuick 2.0
import org.kde.plasma.components 3.0 as PlasmaComponents3

PlasmaComponents3.TextArea {
    text: "Lorem ipsum\ndolor sit amet,\nconsectetur adipisicing elit"
}

Button, ToolButton

contents/ui/main.qml

import QtQuick 2.0
import org.kde.plasma.components 3.0 as PlasmaComponents3

PlasmaComponents3.Button {
    icon.name: "view-refresh"
    text: i18n("Refresh")
}

contents/ui/main.qml

import QtQuick 2.0
import org.kde.plasma.components 3.0 as PlasmaComponents3

PlasmaComponents3.ToolButton {
    icon.name: "view-refresh-symbolic"
    text: i18n("Refresh")
}

ScrollView

contents/ui/main.qml

import QtQuick 2.0
import org.kde.plasma.components 3.0 as PlasmaComponents3

PlasmaComponents3.ScrollView {
    id: scrollView

    ListView {
        model: 100
        delegate: PlasmaComponents3.CheckBox {
            text: i18n("CheckBox #%1", index+1)
        }
    }
}

BusyIndicator

This draws widgets/busywidget.svg from the Plasma Style and spins it. If animation speed is Instant in System Settings, it will not rotate.

PlasmaExtras

To be consistent with elsewhere in Plasma, Plasma ships with a couple of special components. These components have their own API and are particularly helpful when creating a Plasma Widget.

You will need to import PlasmaExtras to use them.

Heading, Paragraph

contents/ui/main.qml

import QtQuick 2.0
import QtQuick.Layouts 1.0
import org.kde.plasma.extras 2.0 as PlasmaExtras

ColumnLayout {
    spacing: 0

    Repeater {
        model: 5
        PlasmaExtras.Heading {
            Layout.fillWidth: true
            level: index + 1
            text: i18n("Header level %1", level)
        }
    }

    PlasmaExtras.Paragraph {
        Layout.fillWidth: true
        text: i18n("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sit amet turpis eros, in luctus lectus. Curabitur pulvinar ligula at leo pellentesque non faucibus mauris elementum. Pellentesque convallis porttitor sodales. Maecenas risus erat, viverra blandit vestibulum eu, suscipit in est. Praesent quis mattis eros. Sed ante ante, adipiscing non gravida sed, ultrices ultrices urna. Etiam congue mattis convallis. Maecenas sollicitudin mauris at lorem aliquam in venenatis erat convallis. Fusce eleifend scelerisque porttitor. Praesent metus sapien, hendrerit ac congue eget, feugiat id enim. Morbi venenatis gravida felis, vitae varius nunc dictum a. Etiam accumsan, velit ac tempor convallis, leo nibh consequat purus, sit amet fringilla nisi mi et libero.")
    }
}

PlasmaCore

import org.kde.plasma.core 2.0 as PlasmaCore
  • The very useful Theme and Units singletons.

PlasmaCore.Theme

PlasmaCore.Theme contains the [Plasma Style]({{< ref "../theme/_index.md" >}}) color palette.

  • PlasmaCore.Theme.textColor

  • PlasmaCore.Theme.highlightColor

  • PlasmaCore.Theme.highlightedTextColor

  • PlasmaCore.Theme.backgroundColor

  • PlasmaCore.Theme.linkColor

  • PlasmaCore.Theme.visitedLinkColor

  • PlasmaCore.Theme.positiveTextColor

  • PlasmaCore.Theme.neutralTextColor

  • PlasmaCore.Theme.negativeTextColor

  • PlasmaCore.Theme.disabledTextColor

There is also properties for the various color groups using a prefix.

  • PlasmaCore.Theme.buttonTextColor

  • PlasmaCore.Theme.viewTextColor

  • PlasmaCore.Theme.complementaryTextColor

  • PlasmaCore.Theme.headerTextColor

The QuickTheme class extends Plasma::Theme which also contains:

PlasmaCore.Units.devicePixelRatio

In order to scale an Item by display scaling to support HiDPI monitors, you will need to multiply a pixel value by PlasmaCore.Units.devicePixelRatio. Plasma also ships with a few preset values for consistent spacing throughout Plasma.

  • PlasmaCore.Units.smallSpacing = max(2, gridUnit/4)

  • PlasmaCore.Units.largeSpacing = gridUnit

  • PlasmaCore.Units.gridUnit (width of the capital letter M)

import QtQuick 2.0
import QtQuick.Layouts 1.0
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.components 3.0 as PlasmaComponents3
RowLayout {
    spacing: PlasmaCore.Units.smallSpacing
    Rectangle {
        implicitWidth: 4 * PlasmaCore.Units.devicePixelRatio
        Layout.fillHeight: true
        color: PlasmaCore.Theme.highlightColor
    }
    PlasmaComponents3.Label {
        text: i18n("Label")
    }
}

PlasmaCore.Units.iconSizes

PlasmaCore.Units.iconSizes is scaled by DPI.

  • PlasmaCore.Units.iconSizes.small = 16px

  • PlasmaCore.Units.iconSizes.smallMedium = 22px

  • PlasmaCore.Units.iconSizes.medium = 32px

  • PlasmaCore.Units.iconSizes.large = 48px

  • PlasmaCore.Units.iconSizes.huge = 64px

  • PlasmaCore.Units.iconSizes.enormous = 128px

PlasmaCore.Units.shortDuration

These properties are scaled by the Animation Speed in System Settings.

  • PlasmaCore.Units.veryShortDuration = 50ms

  • PlasmaCore.Units.shortDuration = 100ms

  • PlasmaCore.Units.longDuration = 200ms

  • PlasmaCore.Units.veryLongDuration = 400ms

This property is a hardcoded value and shouldn't be used for animations. Instead, it can be used to measure how long to wait until the user should be informed of something, or can be used as the limit for how long something should wait before being automatically initiated.

  • PlasmaCore.Units.humanMoment = 2000ms

For a simple toggle, QML ships with . For Plasma's specific changes, you can read the QML source code at:

For multiple choices, QML ships with . For Plasma's specific changes, you can read the QML source code at:

For multiple choices, QML also ships with (dropdown menu). For Plasma's specific changes, you can read the QML source code at:

Note that and was introduced in Qt 5.14. so you will need to use your own _valueRole and _currentValue properties until Ubuntu 22.04. Make sure to not define a valueRole or currentValue property or it will break when your users upgrade to Qt 5.14.

To control Integer or Real numbers, QML ships with and . For Plasma's specific changes, you can read the QML source code at:

To control Integer or Real numbers, QML ships with and . For Plasma's specific changes, you can read the QML source code at:

To enter text, QML ships with and . For Plasma's specific changes, you can read the QML source code for each:

For buttons, QML ships with and the flat version. For Plasma's specific changes, you can read the QML source code for each:

To add a scrollbar to manage overflow, QML ships with . For Plasma's specific changes, you can read the QML source code at:

To be consistent with elsewhere in Plasma, Plasma ships with a couple different Label/Text types with preset default sizes. The first one is for subsections of texts and the second one is . Both wraps by default with Layout.fillWidth: true.

A number of enums listed in .

for drawing icons.

, and for drawing SVGs coloured with the Plasma Style color palette.

for connecting to a Plasma DataEngine.

for the full list of types in PlasmaCore. You can also skim the generated file.

The full list of PlasmaCore.Theme color properties can be found in the QuickTheme class definition:

PlasmaCore.Theme.defaultFont

PlasmaCore.Theme.palette

PlasmaCore.Theme.smallestFont

PlasmaCore.Theme.styleSheet

PlasmaCore.Theme.themeName

PlasmaCore.Theme.useGlobalSettings

PlasmaCore.Theme.wallpaperPath

PlasmaCore.Units.devicePixelRatio = / 96 (Primary Screen)

Note that does not use the exact same logic as .

API documentation
available on GitLab
CheckBox
RadioButton
ComboBox
SpinBox
Slider
TextField
TextArea
Button
ToolButton
Qt Quick Controls 2 components
Qt documentation
plasma-framework/src/declarativeimports/plasmacomponents3/
PlasmaComponents 2
Qt Quick Controls 1
Labels
Label.qml source code
CheckBox
CheckBox.qml
RadioButton
RadioButton.qml
ComboBox
ComboBox.qml
ComboBox.valueRole
ComboBox.currentValue
Ubuntu 20.04 only has Qt 5.12
SpinBox
Slider
Slider.qml
SpinBox
Slider
SpinBox.qml
TextField
TextArea
TextField.qml
TextArea.qml
Button
ToolButton
Button.qml
ToolButton.qml
ScrollView
ScrollView.qml
BusyIndicator.qml
Default widgets/busywidget.svg from Breeze
Heading
Paragraph
Types
Icon
SvgItem
Svg
FrameSvgItem
DataSource
See the API docs
.../core/plugins.qmltypes
plasma-framework/src/declarativeimports/core/quicktheme.h
font
palette
font
string
string
bool
string
QScreen::logicalDotsPerInchX
Kirigami.Units
PlasmaCore.Units
Screenshot Paragraph and Heading