Python 如何在QML/Pyside2中创建鼠标按下或单击事件而不实际按下鼠标

Python 如何在QML/Pyside2中创建鼠标按下或单击事件而不实际按下鼠标,python,qt,qml,pyside2,Python,Qt,Qml,Pyside2,对于我正在做的项目,我需要能够创建“人工”鼠标事件,只有QML可以看到这些事件,而无需实际按下鼠标 在我当前的实现中,我尝试使用“按键”事件来触发这些人工鼠标事件。我目前正在使用函数“Qt.createQmlObject”创建一个MouseEvent,然后将其作为鼠标单击信号的参数输入。然而,我不断收到一个错误,说“MouseEvent不是一个类型。”我对不同的实现持开放态度 import QtQuick.Controls 2.12 import QtQuick.Controls.Styles

对于我正在做的项目,我需要能够创建“人工”鼠标事件,只有QML可以看到这些事件,而无需实际按下鼠标

在我当前的实现中,我尝试使用“按键”事件来触发这些人工鼠标事件。我目前正在使用函数“Qt.createQmlObject”创建一个MouseEvent,然后将其作为鼠标单击信号的参数输入。然而,我不断收到一个错误,说“MouseEvent不是一个类型。”我对不同的实现持开放态度

import QtQuick.Controls 2.12
import QtQuick.Controls.Styles 1.4
import QtQuick.Layouts 1.11
import QtGraphicalEffects 1.12
import QtMultimedia 5.12
import QtQml.Models 2.12
import "../components"

Item{
   id: widget
   width: 600
   height: 600

   //MouseArea
   MouseArea{
       id: mouseArea
       anchors.fill: parent
       propagateComposedEvents: true
       hoverEnabled: true
       
       onClicked: {
           console.log("The mouse was clicked")
           widget.focus = true 
           mouse.accepted = false
       }

       onPressed: {
           console.log("The mouse was pressed")
           mouse.accept = false
       }

       onEntered:{
           widget.focus = true               
       }
   }

   //Defines key event changes
   Keys.onPressed: {
       if(event.key == Qt.Key_0){
           var mouEvent = Qt.createQmlObject('import QtQuick 2.12; import QtQuick.Controls 2.12; MouseEvent{x: 0; y: 0; accepted: false; button: Qt.LeftButton; buttons: Qt.LeftButton; flags: 0; modifiers: Qt.NoModifier; source: Qt.MouseEventSynthesizedByApplication; wasHeld: false}', mouseArea, "error")
           mouseArea.clicked(mouEvent)
       }
   }
}

MouseEvent不是可以或应该创建的元素,简单来说,MouseEvent是QMouseEvent上的包装器,允许获取事件信息

也不调用信号意味着事件将被传输,相反,你必须使用QT事件系统,它不能从QML中使用,而来自C++(在你的情况下它相当于Python)。 因此,逻辑是创建一个类,将事件通知给Qt,Qt必须通过窗口将事件发送给项目,如下所示:

从PySide2.QtCore导入(
qcore应用程序,
QEvent,
QObject,
QPointF,
Qt,
QTimer,
库尔,
狭槽
)
从PySide2.QtGui导入qgui应用程序,QMouseEvent
从PySide2.QtQuick导入QQuickItem,QQuickView
类鼠标模拟器(QObject):
@插槽(QQuickItem、Qt.鼠标按钮)
@插槽(QQuickItem、Qt.MouseButton、Qt.KeyboardModifier)
@插槽(QQuickItem、Qt.MouseButton、Qt.KeyboardModifier、QPointF)
@插槽(QQuickItem、Qt.MouseButton、Qt.KeyboardModifier、QPointF、int)
def鼠标单击(self、item、button、modifier=Qt.NoModifier、pos=QPointF()、delay=-1):
自行鼠标按下(项目、按钮、修改器、位置、延迟)
self.mousererelease(项目、按钮、修改器、位置、2*延迟)
@插槽(QQuickItem、Qt.鼠标按钮)
@插槽(QQuickItem、Qt.MouseButton、Qt.KeyboardModifier)
@插槽(QQuickItem、Qt.MouseButton、Qt.KeyboardModifier、QPointF)
@插槽(QQuickItem、Qt.MouseButton、Qt.KeyboardModifier、QPointF、int)
def鼠标按下(self、item、button、modifier=Qt.NoModifier、pos=QPointF()、delay=-1):
self.\u发送\u鼠标\u事件(
QEvent.MouseButtonPress、项目、按钮、修改器、位置、延迟
)
@插槽(QQuickItem、Qt.鼠标按钮)
@插槽(QQuickItem、Qt.MouseButton、Qt.KeyboardModifier)
@插槽(QQuickItem、Qt.MouseButton、Qt.KeyboardModifier、QPointF)
@插槽(QQuickItem、Qt.MouseButton、Qt.KeyboardModifier、QPointF、int)
def Mousererelease(
self,item,button,modifier=Qt.NoModifier,pos=QPointF(),delay=-1
):
self.\u发送\u鼠标\u事件(
QEvent.MouseButtonRelease,项目,按钮,修改器,位置,延迟
)
@插槽(QQuickItem、Qt.鼠标按钮)
@插槽(QQuickItem、Qt.MouseButton、Qt.KeyboardModifier)
@插槽(QQuickItem、Qt.MouseButton、Qt.KeyboardModifier、QPointF)
@插槽(QQuickItem、Qt.MouseButton、Qt.KeyboardModifier、QPointF、int)
def鼠标单击(
self,item,button,modifier=Qt.NoModifier,pos=QPointF(),delay=-1
):
自行鼠标按下(项目、按钮、修改器、位置、延迟)
self.mousererelease(项目、按钮、修改器、位置、2*延迟)
自行鼠标按下(项目、按钮、修改器、位置、3*延迟)
self.\u发送\u鼠标\u事件(
QEvent.mousebuttondblick,项目,按钮,位置,4*延迟
)
self.mousererelease(项目、按钮、修改器、位置、5*延迟)
定义发送鼠标事件(自身、类型、项目、按钮、修改器、位置、延迟):
window=item.window()
如果位置为空():
pos=项.边界矩形().中心()
sp=item.maptosene(pos.toPoint())
事件=QMouseEvent(
类型,位置,窗口。映射全局(sp),按钮,按钮,修改器
)
如果延迟小于0:
延迟=0
def on_timeout():
QCoreApplication.instance().notify(窗口、事件)
QTimer.singleShot(延迟,on_超时)
def main():
导入操作系统
导入系统
CURRENT_DIR=os.path.dirname(os.path.realpath(uu文件_uu))
app=qgui应用程序(sys.argv)
鼠标模拟器=鼠标模拟器()
视图=QQuickView()
view.rootContext().setContextProperty(“鼠标模拟器”,鼠标模拟器)
filename=os.path.join(当前目录,“main.qml”)
view.setSource(QUrl.fromLocalFile(文件名))
view.show()
sys.exit(app.exec_())
如果名称=“\uuuuu main\uuuuuuuu”:
main()

MouseeEvent不是可创建的类型。您需要在C++或Python端创建QuffSEEvEnter,并调用QuuiAp::StEdvEnter()。
import QtQuick 2.12

Item{
   id: widget
   width: 600
   height: 600

   MouseArea{
       id: mouseArea
       anchors.fill: parent
       propagateComposedEvents: true
       hoverEnabled: true
       
       onClicked: {
           console.log("The mouse was clicked")
           widget.focus = true 
           mouse.accepted = false
       }

       onPressed: {
           console.log("The mouse was pressed")
           mouse.accept = false
       }

       onEntered:{
           widget.focus = true               
       }
   }

   Keys.onPressed: {
        if(event.key == Qt.Key_0){
            mouse_emulator.mouseClick(widget, Qt.LeftButton)
        }
   }
}