QTableView change header to userinput name

1

Is there a way to change the header of QTableView ? The headers are not hard coded. They always change if a new csv file is loaded. I would like to be able to change the headears by doppel clicking on it. I tried to modify the code from qtablewidget but there seems to be something wrong, becuase my code exits with

Process finished with exit code -1073740791 (0xC0000409)

My code:

import sys
from PyQt5 import QtWidgets, QtCore, QtPrintSupport, QtGui
from PyQt5.QtWidgets import *

class main_v2(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(main_v2, self).__init__(parent)
        self.setGeometry(50, 50, 1100, 850)
        self.model = QtGui.QStandardItemModel(self)

        self.tableView = QtWidgets.QTableView(self)
        #self.tableView.setStyleSheet(stylesheet(self))
        self.tableView.setModel(self.model)
        self.tableView.horizontalHeader().setStretchLastSection(True)
        self.tableView.setShowGrid(True)
        self.tableView.setGeometry(12, 150, 800, 550)


        item = QtGui.QStandardItem()
        self.model.appendRow(item)
        self.model.setData(self.model.index(0, 0), "", 0)
        self.tableView.resizeColumnsToContents()
        self.tableView.horizontalHeader().sectionDoubleClicked.connect(self.changeHorizontalHeader)

    @QtCore.pyqtSlot(int)
    def changeHorizontalHeader(self, index):
        it = self.tableView.horizontalHeaderItem(index)
        if it is None:
            val = self.tableView.model().headerData(index, QtCore.Qt.Horizontal)
            it = QtWidgets.QTableViewItem(str(val))
            self.tableView.setHorizontalHeaderItem(index, it)
        oldHeader = it.text()
        newHeader, okPressed = QtWidgets.QInputDialog.getText(self,
                                                              'Change header to', "new name:",
                                                              QtWidgets.QLineEdit.Normal, oldHeader)
        if okPressed:
            it.setText(newHeader)


def main():
    app = QApplication(sys.argv)
    ex = main_v2()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
python
python-3.x
pyqt
pyqt5
qtableview
asked on Stack Overflow Dec 9, 2018 by Mady • edited Dec 9, 2018 by eyllanesc

1 Answer

1

Many IDEs or editors have problems reporting the type of error since they only provide an error code that is not legible, instead it is advisable to use the Terminal or CMD to execute the script obtaining the following message:

Traceback (most recent call last):
  File "main.py", line 27, in changeHorizontalHeader
    it = self.tableView.horizontalHeaderItem(index)
AttributeError: 'QTableView' object has no attribute 'horizontalHeaderItem'
Aborted (core dumped)

And clearly the error is caused because horizontalHeaderItem() and setHorizontalHeaderItem() since they do not belong to QTableView, these belong to QStandardItemModel also that there is no QTableViewItem so I recommend reading the docs of Qt.

@QtCore.pyqtSlot(int)
def changeHorizontalHeader(self, index):
    it = self.model.horizontalHeaderItem(index)
    if it is None:
        val = self.model.headerData(index, QtCore.Qt.Horizontal)
        it = QtGui.QStandardItem(str(val))
        self.model.setHorizontalHeaderItem(index, it)
    oldHeader = it.text()
    newHeader, okPressed = QtWidgets.QInputDialog.getText(self,
                                                          'Change header to', 
                                                          "new name:",
                                                          QtWidgets.QLineEdit.Normal,
                                                          oldHeader)
    if okPressed:
        it.setText(newHeader)
answered on Stack Overflow Dec 9, 2018 by eyllanesc • edited Dec 9, 2018 by eyllanesc

User contributions licensed under CC BY-SA 3.0