3
那麼,讓我們來看看這個小片段:QTreeWidget阻力並在按鍵時才下降
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)時發生。否則,我希望小部件能夠正常運行,並且物品保持靜態,無論您是在拖放物品時還是拖動物品,還是在懸停物品時按住鼠標按鈕。
我該如何實現這種行爲?
哇,這很容易:)。儘管如此,我不明白使用控制鍵時出現了什麼問題,我試過了,它工作正常......我錯過了什麼? – BPL
@BPL。對我而言,使用控制鍵可能與選擇衝突。如果一個項目*不*選擇,按Ctrl +拖動工作正常。但是,如果*被選中,則最初的Ctrl +點擊取消選擇該項目,拖動失敗。我想它一定是平臺特定的東西。 – ekhumoro