Python 在PyQT4中上下移动行

Python 在PyQT4中上下移动行,python,pyqt,pyqt4,qtablewidget,Python,Pyqt,Pyqt4,Qtablewidget,考虑一个QTableWidget和两个按钮“上移”和“下移”。单击“上移”,当前行应上移一行,类似于“下移” 实现相应的上移和下移功能最简单的方法是什么?我修改了我的答案,因为之前没有足够的细节 该过程涉及将按钮连接到一个(或多个)插槽,该插槽将查看当前选择,并通过从视图中取出按钮并将其插入新位置来移动按钮 以下示例实际使用的是QTableView+QStandardItemModel。原因是因为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好极了!如果你愿意的话:只需提问并回答你自己的问题,就可以与社区分享你的知识。