gpt4 book ai didi

qt+pyqt 发出两次丢弃的 URL

转载 作者:行者123 更新时间:2023-12-03 13:00:14 25 4
gpt4 key购买 nike

我使用 QT-Designer 创建了一个 xml 文件,其中包含一个 LineEdit 小部件。在脚本中,我试图通过拖放发出文件路径。它有效,但圣。是错误的:该 url 将被发出两次,看起来像:

/D:/Qtfile:///D:/Qt

我知道类似的主题,例如 PyQt event emmitted twice在 stackoverflow 中讨论。但我找不到我的答案……也许我想念它。为什么两次?为什么第一个“file://”消失了?

如果我不使用 Qt-Designer 并定义一个子类来拖放文本,例如 class CustomEditLine(QLineEdit):... 然后在主窗口中创建 QlineEdit 的实例,url 将只发出一次但是仍然是“/D:/Qt”。这是我的代码:

from PyQt5 import QtWidgets, uic
from PyQt5.QtCore import QObject,QEvent
import sys

qtCreatorFile=".\\gui\\testdrop.ui"
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)

class QDropHandler(QObject):
def __init__(self, parent=None):
super(QDropHandler, self).__init__(parent)

def eventFilter(self, obj, event):
if event.type() == QEvent.DragEnter:
event.accept()
if event.type() == QEvent.Drop:
md = event.mimeData()
if md.hasUrls():
for url in md.urls():
obj.setText(url.path())
break
event.accept()
return False

class root_App(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(root_App, self).__init__()
self.setupUi(self)
self.lineEdit_1.installEventFilter(QDropHandler(self))

if __name__=="__main__":
app= QtWidgets.QApplication(sys.argv)
window=root_App()
window.show()
sys.exit(app.exec_())

和我的 ui-xml:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>758</width>
<height>424</height>
</rect>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QLineEdit" name="lineEdit_1">
<property name="geometry">
<rect>
<x>40</x>
<y>140</y>
<width>691</width>
<height>20</height>
</rect>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

最佳答案

QLineEdit 类已经支持拖放 url。您的自定义处理程序没有完全覆盖它,因此这解释了为什么文本被输入两次。要完全覆盖默认行为,您的事件过滤器必须返回 True - 意思是:是的,我已经处理了这个事件,所以没有更多事情要做。

您的示例代码可以简化为:

class root_App(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(root_App, self).__init__()
self.setupUi(self)
self.lineEdit_1.installEventFilter(self)

def eventFilter(self, source, event):
if (event.type() == QEvent.Drop and
source is self.lineEdit_1):
md = event.mimeData()
if md.hasUrls():
source.setText(md.urls()[0].path())
return True
return super(root_App, self).eventFilter(source, event)

关于qt+pyqt 发出两次丢弃的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42416626/

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