python - PyQT4 में पंक्ति को ऊपर और नीचे ले जाएं




qtablewidget (2)

मैं केवल 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_())

एक QTableWidget और दो बटन "आगे बढ़ें" और "नीचे" पर विचार करें आगे बढ़ने पर क्लिक करने पर, वर्तमान पंक्ति में एक पंक्ति बढ़नी चाहिए, "नीचे ले जाएँ" के लिए समान रूप से।

इसी चाल को कार्यान्वित करने और कार्य को आगे बढ़ाने का सबसे आसान तरीका क्या है?


मैंने अपना जवाब संशोधित किया है क्योंकि इसके पहले पर्याप्त विवरण नहीं था

इस प्रक्रिया में आपके बटन को एक स्लॉट (या स्लॉट) से जोड़ना शामिल है जो वर्तमान चयन को देखेगा, और उन्हें उन्हें देखने से ले जाएंगे, और उन्हें नए स्थानों में डालें।

निम्न उदाहरण वास्तव में एक QTableView + QStandardItemModel का उपयोग कर रहा है इसका कारण यह है कि क्योंकि QTableWidget बहुत अधिक सीमित है क्योंकि आप केवल विजेट से तरीकों का उपयोग कर सकते हैं। मॉडल और चयन मॉडल के साथ सीधे काम करने में सक्षम होने के लिए यह बहुत आसान है यद्यपि, यदि आप प्रत्येक पंक्ति का निर्माण करने के लिए कई बार takeItem() उपयोग करते हैं, तो इस उदाहरण को एक क्यूटेबलविजेट के लिए takeItem() प्रयोग करना takeItem() ...

यहां एक पूर्णतः काम करने वाला उदाहरण है:

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_()

Init सरल है और बस तालिका, मॉडल, और बटन सेट करता है हम दोनों बटंस को functools.partial का उपयोग करके एक ही विधि में कनेक्ट करते हैं, जो अलग-अलग एल्ग्स के साथ समान फ़ंक्शन कॉल को लपेटने के लिए वास्तव में सुविधाजनक है। तब तालिका बस 20x6 डेटा से भरा है।

जब कोई बटन क्लिक किया जाता है, तो हम सुनिश्चित करते हैं कि उन्होंने पंक्तियों को चुना है प्रत्येक चयनित पंक्ति के लिए, हम इसके आइटम को हल करते हैं (एक बार इसे स्थानांतरित करने के बाद बाद में फिर से चयन के लिए), और एक पंक्ति को जोड़कर या घटाकर नया पंक्ति संख्या निर्धारित करें हम यह सुनिश्चित भी करते हैं कि यह वैध सीमा के भीतर स्थानांतरित करने के लिए है, अन्यथा हम इसे छोड़ देते हैं। आखिरकार, हम संपूर्ण पंक्ति को takeRow() सूची के रूप में ले जाने के लिए takeRow() कहते हैं, और फिर उस पंक्ति को नई पंक्ति संख्या में वापस डालें। उस पाश के बाद, हम उन वस्तुओं का उपयोग करते हैं, जो हमने नई अनुक्रमणिका को देखने के लिए सहेजी हैं और फिर उन्हें फिर से खोजते हैं।





qtablewidget