簡體   English   中英

將項目文本從QTreeView拖放到QLineEdit

[英]Drag and drop item text from QTreeView to QLineEdit

我需要將帶有QStandardItemModel的QTreeView中的項目放入QLineEdit。

我對如何從QTreeView獲取數據感到有點迷茫。 假設這與重新實現dropMimeData方法有關,但處理mimeData並不是我經常做的事情(或者完全理解那個問題)。

這是一個示例代碼的骨架,我需要將MyTreeView中的項目拖動到MyLineEdit中,並將文本設置為項目文本的任何內容。

from PySide.QtCore import *
from PySide.QtGui import *

class MyWidget(QWidget):
    def __init__(self):
        super(MyWidget, self).__init__()

        model = MyModel()
        view = MyTreeView()
        view.setModel(model)
        lineEdit = MyLineEdit()

        model.addItem('My Item')
        model.addItem('My Item2')


        layout = QVBoxLayout()
        layout.addWidget(view)
        layout.addWidget(lineEdit)

        self.setLayout(layout)

class MyLineEdit(QLineEdit):
    def __init__(self):
        super(MyLineEdit, self).__init__()
        self.setAcceptDrops( True )

    def dragEnterEvent(self, event):
        data_type = "application/x-qstandarditemmodeldatalist"
        if event.mimeData().hasFormat(data_type):
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        data_type = "application/x-qstandarditemmodeldatalist"
        if event.mimeData().hasFormat(data_type):
            #Get the QStandardItem text somehow?
            item_text = 'Get the text somehow'
            self.setText(item_text)


class MyModel(QStandardItemModel):
    def __init__(self):
        super(MyModel, self).__init__()

    def addItem(self, text):        
        root_item = self.invisibleRootItem()
        item = QStandardItem(text)
        root_item.appendRow(item)

class MyTreeView(QTreeView):
    def __init__(self):
        super(MyTreeView, self).__init__()
        self.setDragEnabled( True )

widget = MyWidget()
widget.show()

這可以通過在模型中重新實現mimeData來非常簡單地實現:

class MyModel(QStandardItemModel):
    ...
    def mimeData(self, indexes):
        mimedata = super(MyModel, self).mimeData(indexes)
        if indexes:
            mimedata.setText(indexes[0].data())
        return mimedata

這就是所需要的。 您不需要在行編輯中實現dragEnterEventdropEvent

有幾種方法可以獲得文本:

  • 使用mimeData()

def dropEvent(self, event):
    data_type = "application/x-qstandarditemmodeldatalist"
    mimeData = event.mimeData()
    if mimeData.hasFormat(data_type):
        encodedData = mimeData.data(data_type)
        stream = QDataStream(encodedData, QIODevice.ReadOnly)
        row = stream.readInt32()
        column = stream.readInt32()
        it = QStandardItem()
        stream >> it
        self.setText(it.text())

  • 使用source()作為執行拖動操作的小部件,在這種情況下它是視圖,然后我們訪問當前的QModelIndex ,它是所選的一個。

def dropEvent(self, event):
    if isinstance(event.source(), QAbstractItemView):
        ix = event.source().currentIndex()
        self.setText(ix.data())

如果您啟用了多個項目的選擇,則必須使用所選項目:

...

class MyLineEdit(QLineEdit):
    def __init__(self):
        super(MyLineEdit, self).__init__()
        self.setAcceptDrops( True )

    def dragEnterEvent(self, event):
        data_type = "application/x-qstandarditemmodeldatalist"
        if event.mimeData().hasFormat(data_type):
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        if isinstance(event.source(), QAbstractItemView):
            ixdexes = event.source().selectedIndexes()
            text = " ".join([ix.data() for ix in sorted(ixdexes)])
            self.setText(text)


...

class MyTreeView(QTreeView):
    def __init__(self):
        super(MyTreeView, self).__init__()
        self.setDragEnabled( True )
        self.setSelectionMode(QAbstractItemView.MultiSelection)

...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM