Как мне использовать Material Design в приложении Pyside6?

У меня есть код ниже в моем приложении pyside 6

      import sys,os
from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngine, qmlRegisterType
from PySide6.QtCore import QObject, Slot, Signal, QTimer, QUrl
import PySide6

if __name__ == "__main__":
    #for error -> Failed to create vertex shader(It is displaying empty window)
    os.environ['QT_QUICK_BACKEND'] = "software"

    os.environ['QT_QUICK_CONTROLS_STYLE'] = "Material"
    os.environ['QT_QUICK_CONTROLS_MATERIAL_THEME'] = "Dark"
    os.environ['QT_QUICK_CONTROLS_MATERIAL_VARIANT'] = "Dense"
    os.environ['QT_QUICK_CONTROLS_MATERIAL_ACCENT'] = "Teal"
    os.environ['QT_QUICK_CONTROLS_MATERIAL_PRIMARY'] = "BlueGrey"
#    os.environ['QT_QUICK_CONTROLS_MATERIAL_FOREGROUND'] = "Brown"
#    os.environ['QT_QUICK_CONTROLS_MATERIAL_BACKGROUND'] = "Grey"
    #==================================================
    sys.argv += ['--style', 'Material']
    #==================================================
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()
    engine.load(os.path.join(os.path.dirname(__file__), "qml/main.qml"))
    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec_())

main.qml

      import QtQuick.Window 2.15
import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.15

ApplicationWindow {
    id:mainWindow
    flags: Qt.Window//|Qt.FramelessWindowHint
    width: 1000
    height: 580
    visible: true
//    Material.theme:Material.Light
//    Material.primary: Material.color("#d81b60",Material.Shade600)
//    Material.accent: Material.color(Material.Pink,Material.Shade800)
    Material.elevation:2
    Button{
        anchors.centerIn: parent
        Material.accent: Material.Orange
        text: "Open"
        width: 150
        height: 45
        onClicked: {
             mainWindow.Material.theme===Material.Light? mainWindow.Material.theme=Material.Dark: mainWindow.Material.theme=Material.Light
        }
    }
}

У меня есть кнопка в центре страницы, но эффекты появляются в x = 0 и y = 0, и она не отображает цвет основного и акцентного

Редактировать

Дополнительная информация может помочь понять, в чем проблема:

Я отключил использование материального дизайна в своем проекте после запуска приложения. При наведении указателя мыши на кнопку, вывод приложения отображается ниже:

      file:///C:/Users/MyUserName/AppData/Roaming/Python/Python39/site-packages/PySide6/qml/QtQuick/Controls/Windows/Button.qml:77:49:
 Unable to assign [undefined] to int

Когда я нажимаю ссылку выше (в выводе приложения), отображается код Button.qml

      NativeStyle.Button {
        control: control
        x: background.x
        y: background.y
        width: background.width
        height: background.height
        useNinePatchImage: false
        overrideState: NativeStyle.StyleItem.AlwaysHovered
        opacity: control.hovered ? 1 : 0
//*********** It will jump in below by clicking on that
        Behavior on opacity { NumberAnimation { duration: parent.transitionDuration } }
    }

Когда я нажимаю кнопку, приложение вылетает. Я думаю, это из-за stackview.Push("page.qml") и StackView есть анимация для нажатия страницы, я думаю, она выйдет из строя, потому что в моем приложении проблемы с анимацией

И еще одно: я установил Python 3.9.2 в Program Files folder но когда я использую pip install pyside6 or ... Он скопирует файл в C:/Users/MyUserName/AppData/Roaming/Python/Python39/site-packages дорожка

1 ответ

У меня была такая же ошибка сообщения, когда я наводил курсор на кнопку.

Проблема здесь в этой строке:

      Behavior on opacity { NumberAnimation { duration: parent.transitionDuration } }

А точнее потому, что для свойства duration требуется целое число, а значение parent.transitionDuration не определено (что означает, что оно не существует). При небольшом дополнительном исследовании кажется, что 'transitionDuration' является свойством для NativeStyle.Button, но «parent» - это QQuickLoader.

Вот решение, которое сработало для меня:

      NativeStyle.Button {
        id: nsButton // <-------- add an id
        control: control
        x: background.x
        y: background.y
        width: background.width
        height: background.height
        useNinePatchImage: false
        overrideState: NativeStyle.StyleItem.AlwaysHovered
        opacity: control.hovered ? 1 : 0

        // by doing this you will be able to change the 'parent' for the id
        Behavior on opacity { NumberAnimation { duration: nsButton.transitionDuration } }
    }

РЕДАКТИРОВАТЬ: это частичный ответ для тех, у кого есть ошибка сообщения.

Другие вопросы по тегам