Evgenii Legotckoi
Evgenii Legotckoi25. November 2019 15:35

QML - Tutorial 038. Verwenden der Clip-Eigenschaft zum Zuschneiden von untergeordneten Objekten innerhalb von Item oder Rectangle

Ziemlich oft taucht im Forum die gleiche Frage bezüglich des Problems der Anzeige von Inhalten auf, die in beliebige QML-Objekte eingebettet sind.

Die häufigste Manifestation dieses Problems ist, wenn der Inhalt der ListView aus seinem Gültigkeitsbereich herausscrollt. Auf jeden Fall ist dies einer dieser häufigen Fälle, in denen Anfänger beim Einstieg in QML auf dieses Problem stoßen. Nun, oder eine andere Option, wenn ich bei der Verwendung von Rectangle-Objekten auf ein solches Problem gestoßen bin.

In der folgenden Abbildung unten sehen Sie zwei Anwendungsfenster, die dieses Problem veranschaulichen.

  • Das linke Fenster zeigt, wie das Layout anfänglich aussieht
  • Das rechte Fenster zeigt, dass, wenn Sie beginnen, den Inhalt der ListView zu scrollen, dieser unter den Titeltext geht, obwohl er hätte abgeschnitten werden sollen.


Beispielquellcode

So sieht der Quellcode des Programms aus.

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Text {
        id: topText
        text: qsTr("Title")

        anchors.horizontalCenter: parent.horizontalCenter
        anchors.top: parent.top
    }

    ListView {
        width: 180; height: 200

        model: contactModel
        delegate: Text {
            text: name + ": " + number
        }

        anchors.horizontalCenter: parent.horizontalCenter
        anchors.top: topText.bottom
    }

    ListModel {
        id: contactModel
        ListElement {
            name: "Bill Smith"
            number: "555 3264"
        }
        ListElement {
            name: "John Brown"
            number: "555 8426"
        }
        ListElement {
            name: "Sam Wise"
            number: "555 0473"
        }
    }
}

Um dieses Problem zu lösen, legen Sie einfach die Eigenschaft clip: true auf ListView fest.

ListView {
    clip: true

    /* код */
}

Und jetzt wird der Inhalt der ListView die ListView nicht verlassen

Mit rechteckigen Objekten

Clip funktioniert auf die gleiche Weise für Rectangle-Objekte. Hier ist der Programmcode, sowie ein Beispiel vor und nach dem Einbinden des Clips.

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Rectangle {
        x: 27
        y: 31
        width: 100
        height: 100
        color: "blue"
        clip: true

        Rectangle {
            x: -20
            y: -20
            width: 100
            height: 100

            color: "green"
        }
    }
}

Rundung

Was bei der Verwendung eines Clips jedoch nicht funktioniert, ist das Runden, selbst wenn Sie den Rundungsradius für das übergeordnete Rectangle-Objekt festlegen.

Hier haben wir zum Beispiel einen solchen Code, der nicht das erwartete Ergebnis liefert

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Rectangle {
        x: 27
        y: 31
        width: 100
        height: 100
        color: "blue"
        radius: 30 // set rounding
        clip: true // enable cropping

        Rectangle {
            x: -20
            y: -20
            width: 100
            height: 100

            color: "green"
        }
    }
}

Das Ergebnis

Dieses Clip-Verhalten ist Standard und wurde aus Leistungsgründen vorgenommen, da fast alle grafischen QML-Elemente vom Item-Typ erben. Dies bedeutet, dass eine zusätzliche Verarbeitung von Masken in der gesamten Anwendung überflüssig ist.

Aber das erwartete Ergebnis kann durch den folgenden Programmcode unter Verwendung des Grafting-Effekts OpacityMask erreicht werden

import QtQuick 2.12
import QtQuick.Window 2.12
import QtGraphicalEffects 1.13

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Rectangle {
        id: rect
        x: 27
        y: 31
        width: 100
        height: 100
        color: "blue"

        layer.enabled: true
        layer.effect: OpacityMask {
            maskSource: Item {
                width: rect.width
                height: rect.height
                Rectangle {
                    anchors.centerIn: parent
                    width: rect.adapt ? rect.width : Math.min(rect.width, rect.height)
                    height: rect.adapt ? rect.height : width
                    radius: 30
                }
            }
        }

        Rectangle {
            x: -20
            y: -20
            width: 100
            height: 100

            color: "green"
        }
    }
}

Und das Ergebnis wird wie folgt sein

Fazit

Zusammenfassend ist clip eine sehr nützliche Eigenschaft, die aus Leistungsgründen standardmäßig auf false gesetzt ist. Gleichzeitig führt diese Eigenschaft nur einen einfachen Zuschnitt in Form eines Rechtecks durch, und etwas Komplexeres muss mit einer Maske beschnitten werden.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

f
  • 21. Oktober 2021 05:24

Зачем внутри OpacityMask Item, почему сразу Rectangle не вставить?
И что за rect.adapt?

Мое предложение:

        layer.enabled: true
        layer.effect: OpacityMask {
            maskSource: Rectangle {
                width: rect.width
                height: rect.height
                radius: 30
            }
        }

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken