gpt4 book ai didi

python - `QTextEdit` 光标在覆盖其 `dropEvent` 后卡住

转载 作者:太空宇宙 更新时间:2023-11-04 01:07:50 25 4
gpt4 key购买 nike

在程序中,我想接受将文件拖放到 QTextExit 中以便编辑文件的某些部分。

拖放工作正常,但是在 QTextEdit 中放置文件后,QTextEdit 的光标会卡住(停止闪烁并且无法再移动).

这是一个最小的例子:

拖放后:(d&d 工作正常,但光标卡住)

enter image description here

我可以在textEdit中编辑内容,但是textEdit失去焦点后光标仍然可见。 enter image description here

代码:

# -*- coding: utf-8 -*-
import sys
from PyQt5 import Qt

if __name__ == '__main__':
Application = Qt.QApplication(sys.argv)
from Drag_drop_window import Ui_Form # import QtDesigner file

class override_textEdit(Qt.QTextEdit): # override drop event for QTextEdit
drop_accepted_signal = Qt.pyqtSignal(str) # the signal sends the file name to other widget
def __init__(self):
super(override_textEdit,self).__init__()
self.setText("123")
self.setAcceptDrops(True)

def dropEvent(self, event):
if len(event.mimeData().urls())==1: # accept event when only one file was dropped
event.accept()
self.drop_accepted_signal.emit(event.mimeData().urls()[0].toLocalFile())

else:
Qt.QMessageBox.critical(self,"Accept Single File Only","Accept Single File Only",Qt.QMessageBox.Abort)

event.ignore()

class myWidget(Qt.QWidget):
def __init__(self):
super(myWidget, self).__init__()
self.main = Ui_Form()
self.main.setupUi(self)

self.main.textEdit = override_textEdit()
self.main.verticalLayout.addWidget(self.main.textEdit)
self.main.textEdit.drop_accepted_signal.connect(self.slot)

self.show()

def slot(self,filename):
self.main.lineEdit.setText(filename) # display file name in lineEdit



if __name__ == '__main__':
my_Qt_Program = myWidget()

my_Qt_Program.show()
sys.exit(Application.exec_())

QtDesigner生成的Drag_drop_window.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'Drag_drop_window.ui'
#
# Created: Sun Apr 5 17:53:03 2015
# by: PyQt5 UI code generator 5.3.2
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.verticalLayout = QtWidgets.QVBoxLayout(Form)
self.verticalLayout.setObjectName("verticalLayout")
self.lineEdit = QtWidgets.QLineEdit(Form)
self.lineEdit.setObjectName("lineEdit")
self.verticalLayout.addWidget(self.lineEdit)

self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)

def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))

最佳答案

我发现将以下四行添加到 dropEvent 的末尾可以使事情正常进行:

        mimeData = QtCore.QMimeData()
mimeData.setText("")
dummyEvent = QtGui.QDropEvent(event.posF(), event.possibleActions(),
mimeData, event.mouseButtons(), event.keyboardModifiers())

super(override_textEdit, self).dropEvent(dummyEvent)

您已经覆盖了 QTextEdit 控件的 dropEvent 方法,但您没有调用被覆盖的父类(super class)方法。我猜想在覆盖的方法中有一些清理代码需要运行才能解决您遇到的游标问题。但是,只需使用 drop 事件调用父类(super class)方法,即

        super(override_textEdit, self).dropEvent(event)

没有达到您的期望。这会将放置文件的 URL 输入到文本编辑控件中。

我没有发现在调用之前调用 accept()ignore()setDropAction(Qt.IgnoreAction) 的任何组合父类(super class) dropEvent 有任何影响。我怀疑父类(super class)方法会自行决定是接受还是忽略该事件,这可能会覆盖您的子类将完成的操作。

因此,我创建了一个“假的”拖放事件,除了文本数据为空外,它与收到的事件相同,并将这个假事件传递给父类(super class)。当然,如果需要,欢迎父类(super class)在某处插入此空文本,但如果这样做,它不会有任何效果。

关于python - `QTextEdit` 光标在覆盖其 `dropEvent` 后卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29456366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com