मैं QTabelView के साथ QAbstractTabelModel सीख रहा हूं। मैं आइटम को संपादन योग्य बनाने के लिए झंडे और सेटडेटा का उपयोग करने में सक्षम था। हालांकि, मुझे नहीं पता कि कॉलम को संपादन योग्य कैसे बनाया जाए। दूसरे शब्दों में, मैं डबल-क्लिक करके और नया नाम देकर कॉलम के नाम बदलना चाहता हूं। यदि यह संभव है तो क्या आप कोड पर कुछ उदाहरण + टिप्पणियां दे सकते हैं? यहां मेरे पास QTabelView का उपयोग करके एक साधारण एप्लिकेशन है जो मॉडल का उपयोग करके कुछ डेटा प्रदर्शित करता है।

मैं किसी भी सुझाव की सराहना करूंगा

import sys
from PyQt5 import QtWidgets, QtCore, QtGui


class MyTableModel(QtCore.QAbstractTableModel):
    def __init__(self, data=[[]], headers=[], parent=None):
        QtCore.QAbstractTableModel.__init__(self, parent)


        self.__data = data
        self.__headers = headers

    # Headers
    def headerData(self, section, orientation, role):
        if role == QtCore.Qt.DisplayRole:
            if orientation == QtCore.Qt.Horizontal:


                if section < len(self.__headers):
                    return self.__headers[section]
                else:
                    return "Temporary"

            else:
                return section + 1


    def rowCount(self, parent):
        return len(self.__data)

    def columnCount(self, parent):
        return len(self.__data[0])


    def data(self, index, role):

        if role == QtCore.Qt.EditRole:
            row = index.row()
            column = index.column()
            return self.__data[row][column]

        # Displaying data
        if role == QtCore.Qt.DisplayRole:
            row = index.row()
            column = index.column()
            value = self.__data[row][column]
            return value


    def flags(self, index):
        return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled

    # Making cells editable==================================
    def setData(self, index, value, role=QtCore.Qt.EditRole):
        if role == QtCore.Qt.EditRole:
            row = index.row()
            column = index.column()
            new_element = value
            if new_element:
                self.__data[row][column] = new_element
                return True

            else:
                return False

        # =============================================================================#
        # INSERTING & REMOVING  ITEMS

    def insertRows(self, position, rows, parent=QtCore.QModelIndex()):

        self.beginInsertRows(parent, position, position + rows - 1)

        for i in range(rows):
            defaultValues = [i for i in range(1, 4)]
            self.__data.insert(position, defaultValues)

        self.endInsertRows()
        return True


    def removeRows(self, position, rows, parent=QtCore.QModelIndex()):

        self.beginRemoveRows(parent, position, position + rows - 1)  # Старт процесс удаления
        # Removing here
        for i in range(rows):
            value = self.__data[position]
            self.__data.remove(value)

        self.endRemoveRows()

        return True


    def insertColumns(self, position, columns, parent=QtCore.QModelIndex()):
        self.beginInsertColumns(parent, position, position + columns - 1)
        """self.beginInsertColumns(index, first, last)"""
            # index - parent
        # first - position
        # last - position + columns - 1 = view ожидает 0 образный элемент

        rowCount = len(self.__data)
        for i in range(columns):

            for j in range(rowCount):  # Преребираем Строки
                self.__data[j].insert(position, "new cell")

        self.endInsertColumns()
        return True
    # removing columns from view ================================================================
    def removeColumns(self, position, columns, parent=QtCore.QModelIndex()):
        self.beginRemoveColumns(parent, position, position + columns - 1)  # Старт процесс удаления
        # Removing here

        rowCount = len(self.__data)

        for i in range(columns):
            for j in range(rowCount):
                print(self.__data[j])
                value = self.__data[j][position]

                self.__data[j].remove(value)

        self.endRemoveColumns()

        return True


#  My Window -----------------------------------------------------------------------------------
class MyWindow(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()


        data = [
            ["value", "value", "value"],
            ["value", "value", "value"]
        ]

        headers = ["col1", "col2", "col3", ]



        self.TableView = QtWidgets.QTableView()
        self.TableView.show()


        self.model = MyTableModel(data, headers)

            #inserting rows
        #self.model.insertRows(0, 1)


        # self.model.removeRows(0, 1)

        #self.model.insertColumns(0, 1)


        #self.model.removeColumns(0, 1)
        self.TableView.setModel(self.model)





app = QtWidgets.QApplication(sys.argv)
win = MyWindow()
sys.exit(app.exec_())

enter image description here

0
bejandor 2 अप्रैल 2020, 16:57

1 उत्तर

सबसे बढ़िया उत्तर

आप हेडर डेटा बदल सकते हैं >setHeaderData().

फिर बस sectionDoubleClicked() सिग्नल से कनेक्ट करें और एक का उपयोग करें उपयोगकर्ता से नया शीर्षक प्राप्त करने के लिए इनपुट संवाद।

चूंकि आप QAbstractItemModel के उपवर्ग का उपयोग कर रहे हैं, इसलिए आपको संबंधित विधि को भी अधिलेखित करना होगा।

class MyTableModel(QtCore.QAbstractTableModel):
    # ...

    def setHeaderData(self, section, orientation, value, role=QtCore.Qt.DisplayRole):
        if 0 < section < len(self.__headers) and orientation == QtCore.Qt.Horizontal:
            self.__headers[section] = value
            return True
        return QtCore.QAbstractTableModel.setHeaderData(self, section,
            orientation, value, role)

class MyWindow(QtWidgets.QWidget):
    def __init__(self):
        # ...
        self.TableView.horizontalHeader().sectionDoubleClicked.connect(self.renameSection)


    def renameSection(self, index):
        oldTitle = self.model.headerData(
            index, QtCore.Qt.Horizontal, QtCore.Qt.DisplayRole)

        newTitle, accepted = QtWidgets.QInputDialog.getText(
            self, 'Change column title', oldTitle)

        if accepted and oldTitle != newTitle:
            self.model.setHeaderData(
                index, QtCore.Qt.Horizontal, newTitle, QtCore.Qt.DisplayRole)
0
musicamante 2 अप्रैल 2020, 17:39