![](/img/trans.png)
[英]Why does drag and drop of text from QLineEdit to QPushButton work, but not to QTreeWidget?
[英]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
這就是所需要的。 您不需要在行編輯中實現dragEnterEvent
或dropEvent
。
有幾種方法可以獲得文本:
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.