Python 在PyQT4中上下移动行
考虑一个QTableWidget和两个按钮“上移”和“下移”。单击“上移”,当前行应上移一行,类似于“下移” 实现相应的上移和下移功能最简单的方法是什么?我修改了我的答案,因为之前没有足够的细节 该过程涉及将按钮连接到一个(或多个)插槽,该插槽将查看当前选择,并通过从视图中取出按钮并将其插入新位置来移动按钮 以下示例实际使用的是QTableView+QStandardItemModel。原因是因为QTableWidget更有限,因为您只能使用来自小部件的方法。直接使用模型和选择模型要容易得多。尽管如此,如果您多次使用Python 在PyQT4中上下移动行,python,pyqt,pyqt4,qtablewidget,Python,Pyqt,Pyqt4,Qtablewidget,考虑一个QTableWidget和两个按钮“上移”和“下移”。单击“上移”,当前行应上移一行,类似于“下移” 实现相应的上移和下移功能最简单的方法是什么?我修改了我的答案,因为之前没有足够的细节 该过程涉及将按钮连接到一个(或多个)插槽,该插槽将查看当前选择,并通过从视图中取出按钮并将其插入新位置来移动按钮 以下示例实际使用的是QTableView+QStandardItemModel。原因是因为QTableWidget更有限,因为您只能使用来自小部件的方法。直接使用模型和选择模型要容易得多。尽
takeItem()
来构建每一行,那么对于QTableWidget,可以重新编写此示例
以下是一个完全有效的示例:
from PyQt4 import QtCore, QtGui
from functools import partial
class Dialog(QtGui.QDialog):
DOWN = 1
UP = -1
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
self.resize(800,600)
self.table = QtGui.QTableView(self)
self.table.setSelectionBehavior(self.table.SelectRows)
self.model = QtGui.QStandardItemModel(20, 6, self)
self.table.setModel(self.model)
self.upBtn = QtGui.QPushButton('Up', self)
self.downBtn = QtGui.QPushButton('Down', self)
self.mainLayout = QtGui.QVBoxLayout(self)
self.mainLayout.addWidget(self.table)
self.buttonLayout = QtGui.QHBoxLayout()
self.buttonLayout.addWidget(self.upBtn)
self.buttonLayout.addWidget(self.downBtn)
self.mainLayout.addLayout(self.buttonLayout)
self.upBtn.clicked.connect(partial(self.moveCurrentRow, self.UP))
self.downBtn.clicked.connect(partial(self.moveCurrentRow, self.DOWN))
self._initTable()
def _initTable(self):
for row in xrange(self.model.rowCount()):
for col in xrange(self.model.columnCount()):
item = QtGui.QStandardItem('%d_%d' % (row+1, col+1))
self.model.setItem(row, col, item)
def moveCurrentRow(self, direction=DOWN):
if direction not in (self.DOWN, self.UP):
return
model = self.model
selModel = self.table.selectionModel()
selected = selModel.selectedRows()
if not selected:
return
items = []
indexes = sorted(selected, key=lambda x: x.row(), reverse=(direction==self.DOWN))
for idx in indexes:
items.append(model.itemFromIndex(idx))
rowNum = idx.row()
newRow = rowNum+direction
if not (0 <= newRow < model.rowCount()):
continue
rowItems = model.takeRow(rowNum)
model.insertRow(newRow, rowItems)
selModel.clear()
for item in items:
selModel.select(item.index(), selModel.Select|selModel.Rows)
if __name__ == "__main__":
app = QtGui.QApplication([])
d = Dialog()
d.show()
d.raise_()
app.exec_()
从PyQt4导入QtCore,QtGui
从functools导入部分
类对话框(QtGui.QDialog):
向下=1
上升=-1
def uuu init uuu(self,parent=None):
超级(对话框,自我)。\uuuu初始化\uuuuu(父级)
自我调整大小(800600)
self.table=QtGui.QTableView(self)
self.table.setSelectionBehavior(self.table.SelectRows)
self.model=QtGui.QStandardItemModel(20,6,self)
self.table.setModel(self.model)
self.upBtn=QtGui.QPushButton('Up',self)
self.downBtn=QtGui.QPushButton('Down',self)
self.mainLayout=QtGui.QVBoxLayout(self)
self.mainLayout.addWidget(self.table)
self.buttonLayout=QtGui.QHBoxLayout()
self.buttonLayout.addWidget(self.upBtn)
self.buttonLayout.addWidget(self.downBtn)
self.mainLayout.addLayout(self.buttonLayout)
self.upBtn.clicked.connect(部分(self.moveCurrentRow,self.UP))
self.downBtn.clicked.connect(部分(self.moveCurrentRow,self.DOWN))
self._initTable()
def_初始表(自身):
对于xrange(self.model.rowCount())中的行:
对于xrange(self.model.columnCount())中的列:
item=QtGui.QStandardItem(“%d_u%d%”(行+1,列+1))
self.model.setItem(行、列、项)
def moveCurrentRow(自身,方向=向下):
如果方向不在(自下、自上):
返回
model=self.model
selModel=self.table.selectionModel()
selected=selModel.selectedRows()
如果未选择:
返回
项目=[]
索引=已排序(选中,键=lambda x:x.row(),反向=(方向==self.DOWN))
对于索引中的idx:
items.append(model.itemFromIndex(idx))
rowNum=idx.row()
新行=行数+方向
如果没有(0我只使用了QTableWidget
,下面是一个完整的示例:
import sys
from PyQt4 import QtCore
from PyQt4 import QtGui
class mtable(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.move_up = QtGui.QAction("Move_Up", self)
self.connect(self.move_up, QtCore.SIGNAL('triggered()'), self.moveUp)
self.move_down = QtGui.QAction("Move_Down",self)
self.connect(self.move_down, QtCore.SIGNAL('triggered()'), self.moveDown)
self.toolbar = self.addToolBar('Toolbar')
self.toolbar.addAction(self.move_up)
self.toolbar.addAction(self.move_down)
##Init Table
self.table = QtGui.QTableWidget(4,3)
for i in range(0,4):
for j in range(0,4):
self.table.setItem(i,j,QtGui.QTableWidgetItem("a_"+str(i)+str(j)))
self.setCentralWidget(self.table)
def moveDown(self):
row = self.table.currentRow()
column = self.table.currentColumn();
if row < self.table.rowCount()-1:
self.table.insertRow(row+2)
for i in range(self.table.columnCount()):
self.table.setItem(row+2,i,self.table.takeItem(row,i))
self.table.setCurrentCell(row+2,column)
self.table.removeRow(row)
def moveUp(self):
row = self.table.currentRow()
column = self.table.currentColumn();
if row > 0:
self.table.insertRow(row-1)
for i in range(self.table.columnCount()):
self.table.setItem(row-1,i,self.table.takeItem(row+1,i))
self.table.setCurrentCell(row-1,column)
self.table.removeRow(row+1)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
tb = mtable()
tb.show()
sys.exit(app.exec_())
导入系统
从PyQt4导入QtCore
从PyQt4导入QtGui
类mtable(QtGui.QMainWindow):
def uuu init uuu(self,parent=None):
QtGui.QWidget.\uuuuu init\uuuuuu(self,parent)
self.move\u up=QtGui.QAction(“move\u up”,self)
self.connect(self.move_up,QtCore.SIGNAL('triggered()')、self.moveUp)
self.move\u down=QtGui.QAction(“move\u down”,self)
self.connect(self.move_down、QtCore.SIGNAL('triggered()')、self.moveDown)
self.toolbar=self.addToolBar('toolbar'))
self.toolbar.addAction(self.move_up)
self.toolbar.addAction(self.move_down)
##初始表
self.table=QtGui.QTableWidget(4,3)
对于范围(0,4)内的i:
对于范围(0,4)内的j:
self.table.setItem(i,j,QtGui.QTableWidgetItem(“a_3;”+str(i)+str(j)))
self.setCentralWidget(self.table)
def向下移动(自):
行=self.table.currentRow()
column=self.table.currentColumn();
如果行0:
self.table.insertRow(第1行)
对于范围内的i(self.table.columnCount()):
self.table.setItem(第1行,i,self.table.takeItem(第+1行,i))
self.table.setCurrentCell(第1行第1列)
self.table.removeRow(第+1行)
如果名称=“\uuuuu main\uuuuuuuu”:
app=QtGui.QApplication(sys.argv)
tb=mtable()
tb.show()
sys.exit(app.exec_())
@student:用一个完整的例子重写是的,这是我所指的关于必须单独获取每个项目的内容。我的答案有更多的代码,因为它还保留了选择。很好地解决了这个问题。@student:你使用了self.table.setItem(第1行,我,self.table.takeItem(第1行,我))当QListWidget时应该使用什么,因为QListWidget没有setItem?@san我不知道。我想最好是问一个新问题。你可以复制并粘贴我的示例,通过一个指向我答案的链接来引用,并在新问题中问你想要什么。我相信你会得到一些有用的答案。或者更好的是,将我的示例修改为“否”n使用QListWidget制作一个,在你的问题中展示并询问如何修复…@san好极了!如果你愿意的话:只需提问并回答你自己的问题,就可以与社区分享你的知识。