PyQt QML材料设计按钮背景不会改变

5

我是QML的新手,尝试更改按钮的背景颜色但似乎无效。以下是Python代码:import sys

from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QUrl
from PyQt5.QtQuick import QQuickView


if __name__ == "__main__":

    app = QApplication(sys.argv)

    view = QQuickView()
    view.setSource(QUrl('basic.qml'))
    view.show()

    sys.exit(app.exec_())

而基本的.qml文件:

import QtQuick 2.0
import QtQuick.Controls 2.0
import QtQuick.Controls.Material 2.0
import QtQuick.Controls.Material 2.3

Rectangle {
    width:600;height:150;
    color: Material.color(Material.Red)
    Button {
        text: qsTr("Button")
        highlighted: true
        Material.background: Material.Teal
    }
}

这是它的外观,按钮不是'Material.Teal',无论我尝试什么颜色都不起作用。 我已经尝试过Pane和其他元素,但仍然没有反应。 enter image description here 这是我得到代码的地方: http://doc.qt.io/qt-5/qtquickcontrols2-material.html#material-primary-attached-prop 我已经尝试过其他样式/方法,如pallete(或Fusion): https://doc.qt.io/qt-5.10/qml-qtquick-controls2-control.html#palette-prop
Page {
    palette.text: "red"

    Column {
        Label {
            text: qsTr("This will use red color...")
        }

        Switch {
            text: qsTr("... and so will this")
        }
    }
}

enter image description here


PyQt5-5.10 - HaR
2个回答

10

在您的情况下,有两种可能的解决方案:


  1. 如果您想使用Material.background,您必须确立您要使用的样式为Material,为此您可以选择以下其中一种选项:

选项1:通过sys.argv添加样式:

import sys

from PyQt5.QtGui import QGuiApplication
from PyQt5.QtCore import QUrl
from PyQt5.QtQuick import QQuickView


if __name__ == "__main__":
    sys.argv += ['--style', 'material']
    app = QGuiApplication(sys.argv)

    view = QQuickView()
    view.setSource(QUrl('basic.qml'))
    view.show()

    sys.exit(app.exec_())

选项2:通过os.environ()添加样式:

import os
import sys

from PyQt5.QtGui import QGuiApplication
from PyQt5.QtCore import QUrl
from PyQt5.QtQuick import QQuickView


if __name__ == "__main__":
    app = QGuiApplication(sys.argv)
    os.environ["QT_QUICK_CONTROLS_STYLE"] = "Material"

    view = QQuickView()
    view.setSource(QUrl('basic.qml'))
    view.show()

    sys.exit(app.exec_())

选项3:创建一个qtquickcontrols2.conf文件,并使用qresource将其加载到应用程序中:

qtquickcontrols2.conf

; This file can be edited to change the style of the application
; See Styling Qt Quick Controls 2 in the documentation for details:
; http://doc.qt.io/qt-5/qtquickcontrols2-styles.html

[Controls]
Style=Material

然后创建了一个resource.qrc资源文件:

resource.qrc:

<RCC>
    <qresource prefix="/">
        <file>qtquickcontrols2.conf</file>
    </qresource>
</RCC>

那么你必须将 .qrc 文件转换为 .py 文件:

pyrcc5 resource.qrc -o resource_rc.py

最后,将resource_rc.py文件导入到main.py中。

main.py:

from PyQt5.QtGui import QGuiApplication
from PyQt5.QtCore import QUrl
from PyQt5.QtQuick import QQuickView

import sys
import resource_rc

if __name__ == "__main__":
    app = QGuiApplication(sys.argv)
    view = QQuickView()

    view.setSource(QUrl('basic.qml'))
    view.show()
    sys.exit(app.exec_())
  1. 或者不使用Material风格,仅通过色板使用它们的颜色:

import QtQuick 2.0
import QtQuick.Controls 2.3
import QtQuick.Controls.Material 2.3

Rectangle {
    width:600;height:150;
    color: Material.color(Material.Red)
    Button {
        text: qsTr("Button")
        highlighted: true
        palette.dark: Material.color(Material.Teal)
    }
}

ApplicationWindow { ...} 每次创建一个新窗口,无法通过view = QQuickView()访问。假设我想更改它的名称:view.setTitle('New_Name'),它确实更改了窗口“view”的名称,但没有更改从qml文件创建的窗口的名称。 - HaR
我尝试过这样的代码:button = view.findChild(QObject, "obbjet_name"),但它返回了None。(我已经在QML按钮中添加了objectName) - HaR
非常感谢您的帮助。就像我所说的,我是QML和PyQt的新手,这就是为什么我使用了带有QQuickView的ApplicationWindow。 - HaR


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接