仅在按键时才拖放QTreeWidget

时间:2016-12-29 04:03:22

标签: python python-3.x drag-and-drop pyqt pyqt5

所以,让我们考虑一下这个小片段:

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)。否则,我希望小部件能够正常运行,并且无论您是否在悬停项目时试图拖动项目或按住鼠标按钮,项目都会保持静态。

我该如何实现这种行为?

1 个答案:

答案 0 :(得分:2)

通过覆盖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来解决此问题。