0

複数の行が入力された 1 つの列の QTable ウィジェットがあり、並べ替えることができるようにドラッグ アンド ドロップできるようにしたいと考えています。内部移動で setDragDropMode を実行できますが、セル (0,1) を (0,3) に移動すると、(0,3) はテキストを正しく取得しますが、セル (0,1) は空になりました。セルをドロップしたときにセルのテキストを交換したいと思います。

class myList(QtGui.QTableWidget):
    def __init__(self,parent):
        super(myList,self).__init__(parent)
#        self.setAcceptDrops(True)
        self.setDragDropMode(QtGui.QAbstractItemView.InternalMove)
4

1 に答える 1

0

コールバックをオーバーライドしてdropEvent、デフォルトのアクションを変更できます。これは、両方のセルに値を書き込む最初のバージョンです。

class TableSwitcher(QtGui.QTableWidget):
    def dropEvent(self, dropEvent):
        item_src = self.selectedItems()[0]
        item_dest = self.itemAt(dropEvent.pos())
        src_value = item_src.text()
        item_src.setText(item_dest.text())
        item_dest.setText(src_value)

call を介して Qt にデフォルトの動作 (ドラッグした を移動し、QTableWidgetItemドロップしたものを削除する) を実行させることもできsuperます。ここでは、デフォルトのアクションがウィジェットの状態を変更するという課題に直面します。

class TableSwitcher(QtGui.QTableWidget):
    def dropEvent(self, dropEvent):
        item_src = self.selectedItems()[0]
        item_dest = self.itemAt(dropEvent.pos())
        src_row = item_src.row()
        src_col = item_src.column()
        dest_value = item_dest.text()
        super(TableSwitcher,self).dropEvent(dropEvent)
        self.setItem(src_row,src_col, QtGui.QTableWidgetItem(dest_value))

このクラスを使用したコード例を次に示します。

app = QtGui.QApplication(sys.argv)
table = TableSwitcher()
n = 5
table.setRowCount(n)
table.setColumnCount(1)
table.setDragDropMode(QtGui.QAbstractItemView.InternalMove)

for i in range(n):
        table.setItem(i,0,QtGui.QTableWidgetItem(str(i)))

table.show()
app.exec_()
于 2013-06-01T20:33:05.717 に答える