python - QTreeWidget仅在按下键时拖放

标签 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)时才会发生拖放的行为。否则,无论您是尝试拖动项目还是在悬停项目时按住鼠标按钮,我都希望小部件正常运行并且项目保持静态。

我该如何实现这种行为?

最佳答案

这很容易通过覆盖 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/

相关文章:

python - 删除可能不必要的代码行

python-3.x - python : Feature Matching + Homography to find Multiple Objects

python - 在 Telegram Bot python中发送长消息

android - 拖放 imageview android

android - 在 ScrollView android 中自由拖动 View

python - 如果索引和列相同,如何在单独的列中获取数据集的相关值

python - Tensorflow中如何根据索引给Tensor赋值?

Android ImageView 拖拽定位

python - 如何在不使用 bool 索引的情况下迭代 pandas 系列

python-3.x - threading.Condition 和 threading.Event 之间的区别