我在做什么/到目前为止我有什么:
我正在使用Qt-designer创建PyQt .ui文件,我使用QUiLoader在我的python脚本中加载它,这使我可以访问小部件/组件:
self.ui.tree_widget_of_items ( which is a QTreeWidget created in Qt-designer)
我能够读取和写入小部件的值,我可以像这样使用TreeWidget上的信号:
self.ui.tree_widget_of_items.itemSelectionChanged.connect(self.myFunction)
我想做什么?
我尝试了但是没有工作:
self.ui.tree_widget_of_items.dropEvent = self.drop_action
def drop_action(self,e):
print "drop action"
我尝试将自己的函数分配给TreeWidget的dropEvent,但是当我在TreeWidget上删除项目时它不会被触发。
我也尝试过:
self.ui.tree_widget_of_items.dragEnterEvent = self.drop_action
我确保在TreeWidget上启用了拖放功能。
答案 0 :(得分:1)
您必须在树上安装事件过滤器并在班级中实施QObject.eventFilter
方法。
示例(安装事件过滤器):
self.ui.tree_widget_of_items.installEventFilter(self)
并实现eventFilter:
def eventFilter(self, o, e):
if e.type() == QEvent.DragEnter: #remember to accept the enter event
e.acceptProposedAction()
return True
if e.type() == QEvent.Drop:
# handle the event
# ...
return True
return False #remember to return false for other event types
答案 1 :(得分:1)
在动态UI中实现事件(这意味着在Qt-designer中创建的UI,并使用.ui文件在python工具中使用)。你需要做以下事情:
你的工具的MainWindow类应该继承QtGui.QMainWindow
class main_window(QtGui.QMainWindow):
应该调用super()。 init ()
class main_window(QtGui.QMainWindow):
def __init__(self, parent=None):
super(main_window, self).__init__(parent)
loader = QUiLoader()
file = QtCore.QFile(os.path.join(SCRIPT_DIRECTORY, 'mainwindow.ui'))
file.open(QtCore.QFile.ReadOnly)
if parent:
self.ui = loader.load(file, parentWidget=parent)
else:
self.ui = loader.load(file)
file.close()
在组件上安装EventFilter:
self.ui.tree_widget_of_items.installEventFilter(self)
# not --> self.ui.tree_widget_of_items.installEventFilter(self.ui)
定义eventFilter():
def eventFilter(self, o, e):
if (o.objectName() == "tree_widget_of_items"):
if e.type() == QtCore.QEvent.Type.Enter:
self.drop_action(e)