那么,让我们考虑一下这个小片段:
import sys
import random
import string
from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QMenu, QAction, \
QTreeWidget, QTreeWidgetItem, QAbstractItemView
from PyQt5.QtGui import QCursor, QKeySequence
class PageTree(QTreeWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.alphabet = list(string.ascii_lowercase)
self.index = 0
self.header().hide()
self.view_menu = QMenu(self)
self.create_actions()
self.setDragEnabled(True)
self.setDragDropMode(QAbstractItemView.InternalMove)
self.setSelectionBehavior(QAbstractItemView.SelectRows)
def create_actions(self):
action = QtWidgets.QAction("Add new", self.view_menu)
action.triggered.connect(self.on_add_page)
action.setShortcuts(QKeySequence("a"))
self.view_menu.addAction(action)
self.addActions(self.view_menu.actions())
def add_page(self, name, parent=None):
if (parent is None and len(self.selectedItems()) == 1):
parent = self.selectedItems()[0]
item = QTreeWidgetItem(parent)
item.setText(0, name)
item.setFlags(item.flags() | Qt.ItemIsEditable)
self.addTopLevelItem(item)
if (parent):
parent.setExpanded(True)
return item
def on_add_page(self):
self.add_page("test_page_{0}".format(self.alphabet[self.index]), None)
self.index += 1
self.index %= len(self.alphabet)
def contextMenuEvent(self, ce):
super().contextMenuEvent(ce)
self.view_menu.exec(QCursor.pos())
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
tree_widget = PageTree()
tree_widget.resize(400, 600)
tree_widget.show()
sys.exit(app.exec_())
如您所见,当前代码显示了一个简单的 QTreeWidget,借助 setDragEnabled、setDragDropMode、setSelectionBehavior
函数,它允许您使用拖放内置功能对项目重新排序。
事情是这样的,我想实现一种只有在按下某个键(即:ctrl)时才会发生拖放的行为。否则,无论您是尝试拖动项目还是在悬停项目时按住鼠标按钮,我都希望小部件正常运行并且项目保持静态。
我该如何实现这种行为?
最佳答案
这很容易通过覆盖 startDrag
来实现:
class PageTree(QTreeWidget):
...
def startDrag(self, actions):
if QtWidgets.qApp.keyboardModifiers() & Qt.MetaModifier:
super().startDrag(actions)
请注意,我在这里使用了 Meta (Windows) 键,因为 Ctrl and Shift modifiers结合鼠标影响选择的各个方面。 (此外,在 Linux 上,Alt + 拖动组合通常用于移动窗口,因此它也可能不是一个好的选择)。但是,您可以通过选择不同的 selection mode 来解决此问题。 .
关于python - QTreeWidget仅在按下键时拖放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41372969/