【问题标题】:Drag and drop item text from QTreeView to QLineEdit将项目文本从 QTreeView 拖放到 QLineEdit
【发布时间】:2018-10-01 18:15:11
【问题描述】:

我需要将带有 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()

【问题讨论】:

    标签: python drag-and-drop pyqt pyside qtreeview


    【解决方案1】:

    这可以通过在模型中重新实现mimeData 来非常简单地实现:

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

    这就是我们所需要的。您无需在行编辑中实现dragEnterEventdropEvent

    【讨论】:

      【解决方案2】:

      有几种方法可以获取文本:

      • 使用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)
      
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多