2016-12-29 11 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をオーバーライドして実装するのはとても簡単です:Ctrl and Shift modifiersはマウスとの組み合わせで選択のさまざまな側面に影響を与えるので、私は、ここにメタ(Windowsの)キーを使用しました

class PageTree(QTreeWidget): 
    ... 

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

注意。 (また、Linuxでは、Alt +ドラッグの組み合わせは通常、ウィンドウを移動するために使用されるので、どちらでも良い選択ではないかもしれません)。ただし、別のselection modeを選択してこの問題を回避することができます。

+0

うわー、それは確かに簡単だった:)。それでも、コントロールキーの使用上の問題は何も分かりません。試してみましたが、問題なく動作しています...何か不足していますか? @ BPL。 – BPL

+0

私にとっては、コントロールキーを使用すると選択と競合する可能性があります。アイテムが*選択されていない*場合、Ctrl +ドラッグは正常に動作します。しかし、*が選択されている場合、最初のctrl +クリックはその項目の選択を解除し、ドラッグは失敗します。プラットフォーム固有のものでなければならないと思います。 – ekhumoro

関連する問題