矩形状态仅在单击 PyQt5 QML 时发生变化

Posted

技术标签:

【中文标题】矩形状态仅在单击 PyQt5 QML 时发生变化【英文标题】:State of Rectangle changes only when Clicking PyQt5 QML 【发布时间】:2017-04-07 14:55:23 【问题描述】:

我有我的新 PyQt5 应用程序。我想在 QMainWindow 中添加 QQuickWidget 并使用 QML 设置他的属性。我就是这样做的:

class mainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(mainWindow,self).__init__()
        self.setGeometry(100,100,800,600)

        engine = PyQt5.QtQml.QQmlEngine(self)
        view = QtQuickWidgets.QQuickWidget(engine,self)
        view.setSource(PyQt5.QtCore.QUrl("files/newqml.qml"))

在 QML 文件中,我创建了带有状态的矩形,当鼠标悬停在按钮上时应该更改它。但是当它悬停时 - 什么都没有发生。当我单击按钮以及单击并离开按钮时,状态会发生变化。请帮帮我。我怎样才能使它正确? 完整的 QML 代码:

import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Window 2.2
import QtQuick.Controls.Styles 1.2

Rectangle
  signal buttonPressedSignal
  signal buttonReleasedSignal
  id: topButton
  width:80
  height: 40
  color: 'white'
  border width: 2; color: '#4CAF50'
  state: 'Normal'
  Text 
    id: buttonText
    anchors.centerIn: parent
    text:'Button'
    font.pixelSize: 20
    font.family: 'Hallo sans'
    color: 'black'
  
  MouseArea
    anchors.fill: topButton
    hoverEnabled: true
    onPressed: parent.buttonPressedSignal()
    onReleased: parent.buttonReleasedSignal()
    onEntered: parent.state='NotNormal'
    onExited: parent.state = 'Normal'
  
  states:[
    State
      name: 'Normal';
      PropertyChangestarget:buttonText;color:'black';easing.type:Easing.InOutElastic
    ,
    State
      name:'NotNormal';
      PropertyChangestarget:buttonText;color:'white';easing.type:Easing.InOutElastic
    
  ]
  transitions:[
  Transition
    to: '*'
    ColorAnimationtarget:buttonText;duration:400
  
  ]

【问题讨论】:

你可以放QML代码 我添加了代码 【参考方案1】:

问题是你没有正确添加QQuickWidgetQMainWindow,你必须使用setCentralWidget或者布局来放置它们。 qml 也有一个错误 easing.type 是 PropertyAnimation 的一部分,而不是 PropertyChanges 的一部分。

import sys
from PyQt5 import QtWidgets, QtQml, QtQuickWidgets, QtCore


class mainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(mainWindow,self).__init__()
        self.setGeometry(100,100,800,600)

        engine = QtQml.QQmlEngine(self)
        view = QtQuickWidgets.QQuickWidget(engine,self)
        view.setSource(QtCore.QUrl("files/newqml.qml"))
        self.setCentralWidget(view)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = mainWindow()
    w.show()
    sys.exit(app.exec_())

.qml

import QtQuick 2.3

Rectangle
    signal buttonPressedSignal
    signal buttonReleasedSignal
    id: topButton
    width:80
    height: 40
    color: 'white'
    border width: 2; color: '#4CAF50'
    state: 'Normal'
    Text 
        id: buttonText
        anchors.centerIn: parent
        text:'Button'
        font.pixelSize: 20
        font.family: 'Hallo sans'
        color: 'black'
    
    MouseArea
        anchors.fill: topButton
        hoverEnabled: true
        onPressed: parent.buttonPressedSignal()
        onReleased: parent.buttonReleasedSignal()
        onEntered: parent.state='NotNormal'
        onExited: parent.state = 'Normal'
    
    states:[
        State
            name: 'Normal';
            PropertyChangestarget:buttonText;color:'black';
        ,
        State
            name:'NotNormal';
            PropertyChangestarget:buttonText;color:'white';
        
    ]
    transitions:[
        Transition
            to: '*'
            ColorAnimationtarget:buttonText;duration:400
            PropertyAnimationtarget:buttonText; easing.type:Easing.InOutElastic;
        
    ]

【讨论】:

谢谢你,@eyllanesc,setCentralWidget 工作正常 :)

以上是关于矩形状态仅在单击 PyQt5 QML 时发生变化的主要内容,如果未能解决你的问题,请参考以下文章

pyqt5 用Qtableview鼠标滑过去时怎么样能经过的行发生颜色变化?

PyQt5 与 QML

PyQt5 GUI 仅在单击屏幕并重新打开时更新

QML 从单击的矩形缩放到另一个 UI 元素

当 QML 项目的尺寸发生变化时如何得到通知?

通过在QT QML中单击鼠标重复矩形