gpt4 book ai didi

python - 如何判断一个项目在 qlistview 中的位置?

转载 作者:行者123 更新时间:2023-12-04 05:29:07 24 4
gpt4 key购买 nike

我有一个自定义 QListView:

from PyQt4.QtCore import *
from PyQt4.QtGui import *

from Diagnostics import Trace2 #writes to log file
import traceback

class ListOrderView(QListView):

itemMoved = pyqtSignal(int, int, QStandardItem) # Old index, new index, item

def __init__(self, parent=None):
try:
super(ListOrderView, self).__init__(parent)

self.setAcceptDrops(True)
self.setDragEnabled(True)
self.setDragDropMode(QAbstractItemView.InternalMove)
self.setDefaultDropAction(Qt.MoveAction)

self.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.setSelectionBehavior(QAbstractItemView.SelectRows)
self.setSelectionMode(QAbstractItemView.SingleSelection)

self.dragItem = None
self.dragRow = None

self.indexesMoved.connect(self.onIndexesMoved)
#self.installEventFilter(self)
except:
Trace2.WriteLine(str(traceback.format_exc()))

def onIndexesMoved(self, indexes):
Trace2.WriteLine("indexes were moved")

def dropEvent(self, event):
try:
super(ListOrderView, self).dropEvent(event)

self.selectionModel().setCurrentIndex(self.model().indexFromItem(self.dragItem), QItemSelectionModel.SelectCurrent)
Trace2.WriteLine("[LISTVIEW] item dropped")
Trace2.WriteLine("[LISTVIEW] current index is %d" %self.selectionModel().currentIndex().row())
Trace2.WriteLine("[LISTVIEW] current selection is %d" %self.selectionModel().selection().indexes()[0].row())

self.itemMoved.emit(self.dragRow, self.row(self.dragItem), self.dragItem)
self.dragItem = None
except:
Trace2.WriteLine(str(traceback.format_exc()))

def startDrag(self, supportedActions):
try:
self.dragItem = self.currentItem()
self.dragRow = self.row(self.dragItem)
super(ListOrderView, self).startDrag(Qt.MoveAction)
except:
Trace2.WriteLine(str(traceback.format_exc()))

def currentItem(self):
index = self.currentIndex()
item = self.model().itemFromIndex(index)
#Trace2.WriteLine("[LISTVIEW] currentItem = %s" % item.data(Qt.DisplayRole).toString())
return item

def row(self, item):
#index = self.model().indexFromItem(item)
index = self.selectedIndexes()[0]
row = index.row()

#Trace2.WriteLine("[LISTVIEW] row = %d" %row)
return row

而且我真的需要知道在拖放操作后项目被放置在哪里,以便其他东西可以正确更新(我试图将拖放放入从未为它设计的东西,大应用程序,而不是我的设计)。选择模型的当前索引和选择不遵循丢弃的项目,它们会有效地选择新项目并把事情搞砸。有没有办法让它们随着掉落的物品移动?信号 indexMoved 看起来和我想要的完全一样,但它永远不会触发。我用错了吗?有不同/更好的方法吗?

最佳答案

我认为您可能需要让模型告诉您某些东西被丢弃的位置,因为它最终会处理移动:

class Model(QStandardItemModel):

rowDropped = pyqtSignal(int)

def dropMimeData(self, *args):
success = super(Model, self).dropMimeData(*args)
if success:
self.rowDropped.emit(args[2])
return success

这将从模型中发出发生下降的行号。您的 View 已经知道从其自己的事件中拖放了哪个项目。

我确信还有其他方法可以跟踪对象,然后在放置完成后再次查询它。

关于python - 如何判断一个项目在 qlistview 中的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12846509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com