2016-12-29 21 views
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)時發生。否則,我希望小部件能夠正常運行,並且物品保持靜態,無論您是在拖放物品時還是拖動物品,還是在懸停物品時按住鼠標按鈕。

我該如何實現這種行爲?

回答

2

這是很容易通過覆蓋startDrag來實現:

class PageTree(QTreeWidget): 
    ... 

    def startDrag(self, actions): 
     if QtWidgets.qApp.keyboardModifiers() & Qt.MetaModifier: 
      super().startDrag(actions) 

請注意,我這裏使用的元(Windows)中的關鍵,因爲Ctrl and Shift modifiers影響選擇的各個方面與鼠標組合。 (另外,在Linux上,Alt +拖動組合通常用於移動窗口,所以它也可能不是一個好選擇)。但是,您可以通過選擇不同的selection mode來解決此問題。

+0

哇,這很容易:)。儘管如此,我不明白使用控制鍵時出現了什麼問題,我試過了,它工作正常......我錯過了什麼? – BPL

+0

@BPL。對我而言,使用控制鍵可能與選擇衝突。如果一個項目*不*選擇,按Ctrl +拖動工作正常。但是,如果*被選中,則最初的Ctrl +點擊取消選擇該項目,拖動失敗。我想它一定是平臺特定的東西。 – ekhumoro