Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用PyQt向未聚焦的QLineEdit小部件发送假鼠标单击_Python_Qt_Pyqt5 - Fatal编程技术网

Python 使用PyQt向未聚焦的QLineEdit小部件发送假鼠标单击

Python 使用PyQt向未聚焦的QLineEdit小部件发送假鼠标单击,python,qt,pyqt5,Python,Qt,Pyqt5,我正在使用PyQt5。我希望通过编程方式模拟用户在特定QLineEdit小部件上的鼠标单击,期望与实际单击的行为相同 下面的代码是我的尝试,其中此操作绑定到QPushButton。当QLineEdit小部件target聚焦时,它可以正常工作。但如果按下按钮时其他小部件具有焦点,则焦点小部件和目标小部件都会获得“聚焦”帧: 我应该如何避免此问题并正确执行模拟单击 注意:我不清楚为什么需要在下面单击的按钮上调用中的.setFocus()。我认为,在具有Qt.StrongFocus focus属性的

我正在使用PyQt5。我希望通过编程方式模拟用户在特定QLineEdit小部件上的鼠标单击,期望与实际单击的行为相同

下面的代码是我的尝试,其中此操作绑定到QPushButton。当QLineEdit小部件
target
聚焦时,它可以正常工作。但如果按下按钮时其他小部件具有焦点,则焦点小部件和目标小部件都会获得“聚焦”帧:

我应该如何避免此问题并正确执行模拟单击

注意:我不清楚为什么需要在下面单击的按钮上调用
中的
.setFocus()
。我认为,在具有Qt.StrongFocus focus属性的小部件上单击鼠标就足以切换焦点,但是如果没有手动切换焦点,
target
小部件似乎完全忽略了模拟的单击



(如果有帮助,或者有更简单的方法,我实际上要做的是构造一个小部件,它的行为几乎类似于QLineEdit,但完全忽略鼠标单击(包括按下和释放事件),而双击的工作方式类似于在QLineEdit上单击一次。将双击事件转换为基础QLineEdit小部件上的单击事件是我要解决的问题。)

我没有观察到您指示的行为(我没有观察到两个QlineEditor中的蓝色边框,但只观察到其中一个QlineEditor中的蓝色边框)在使用PyQt5 5.15.1和Python3.8.2的Linux中,您的操作系统是什么;pyqt5版本、python版本等等?很有趣!我最近开始学习Qt,所以我希望所有的问题都来自我自己的代码。有问题的行为出现在Mac OS Sierra(10.12.6)上,使用python 3.9.0和PyQt5 5.14.1。显然,切换焦点后在QApplication的activeWindow上强制执行.repaint()可以解决屏幕截图上的问题。
import functools
from PyQt5.QtWidgets import *
from PyQt5 import QtGui, QtCore
from PyQt5.QtCore import Qt

app = QApplication([])
win = QMainWindow()
widget = QWidget()
win.setCentralWidget(widget)
layout = QVBoxLayout()
widget.setLayout(layout)

target = QLineEdit('Widget to be controlled')
layout.addWidget(target)

layout.addWidget(QLineEdit('(widget to test focus)'))

button = QPushButton('Click')
layout.addWidget(button)

def on_button_clicked(target):
    # This minimal example always uses the same position in the widget
    pos = QtCore.QPointF(25, 10)
    # Transfer focus, otherwise the click does not seem to be handled
    target.setFocus(Qt.OtherFocusReason)
    
    press_event = QtGui.QMouseEvent(QtCore.QEvent.MouseButtonPress, pos,
                                    Qt.LeftButton, Qt.LeftButton, Qt.NoModifier)
    target.mousePressEvent(press_event)
    release_event = QtGui.QMouseEvent(QtCore.QEvent.MouseButtonRelease, pos,
                                      Qt.LeftButton, Qt.LeftButton, Qt.NoModifier)
    target.mouseReleaseEvent(release_event)

button.clicked.connect(functools.partial(on_button_clicked, target))
win.show()
app.exec_()