2013-05-31 4 views
0

У меня есть QTable Widget из одного столбца, заполненного несколькими строками, и я хотел бы иметь возможность перетаскивать, чтобы я мог их упорядочить. Я могу сделать setDragDropMode с внутренним перемещением, но когда я перемещаю ячейку (0,1) в (0,3) (0,3), получим текст правильно, но ячейка (0,1) теперь пуста. Я бы хотел поменять текст ячейки, когда я ее уронил.pyqt как поменять текст в

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

ответ

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) 

Вы также можете позволить 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_() 
Смежные вопросы