qtablewidget set horizo​​ntal header lable editable for added lines

qtablewidget set horizontal header lable editable for added lines

如何通过双击添加行来编辑 qtablewidget 中水平 header 的标签?我从here那里得到代码并进行了调整,但它不会更改添加的列的名称。 我正在使用 python 3.6 和 pyqt5.

from PyQt5 import QtWidgets
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QInputDialog, QLineEdit


class MyWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)

        self.table = QtWidgets.QTableWidget(5,5)
        self.table.setHorizontalHeaderLabels(['1', '2', '3', '4', '5'])
        self.table.setVerticalHeaderLabels(['1', '2', '3', '4', '5'])
        self.table.horizontalHeader().sectionDoubleClicked.connect(self.changeHorizontalHeader)

        self.button_add_c = QtWidgets.QPushButton('add column', self)
        self.button_add_c.clicked.connect(self.click_button_add_c)

        layout = QtWidgets.QHBoxLayout()
        layout.addWidget(self.table)
        layout.addWidget(self.button_add_c)
        self.setLayout(layout)

    def changeHorizontalHeader(self, index):

        oldHeader = self.table.horizontalHeaderItem(index).text()
        newHeader, okPressed  = QInputDialog.getText(self,' Change header label for column %d', "Your name:", QLineEdit.Normal, oldHeader)

        if okPressed:
            self.table.horizontalHeaderItem(index).setText(newHeader)

    def click_button_add_c(self):
        culPosition = self.table.columnCount()
        self.table.insertColumn(culPosition)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    main = MyWindow()
    main.show()

    sys.exit(app.exec_())

添加一行或一列并不意味着已经创建了对应的QTableWidgetItem,这种情况只是修改了列数,所以新列的表头没有QTableWidgetItem,所以解决方法就是有需要就创建。

from PyQt5 import QtCore, QtWidgets

class MyWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)

        self.table = QtWidgets.QTableWidget(5,5)
        self.table.setHorizontalHeaderLabels(['1', '2', '3', '4', '5'])
        self.table.setVerticalHeaderLabels(['1', '2', '3', '4', '5'])
        self.table.horizontalHeader().sectionDoubleClicked.connect(self.changeHorizontalHeader)

        self.button_add_c = QtWidgets.QPushButton('add column')
        self.button_add_c.clicked.connect(self.click_button_add_c)

        layout = QtWidgets.QHBoxLayout(self)
        layout.addWidget(self.table)
        layout.addWidget(self.button_add_c)

    @QtCore.pyqtSlot(int)
    def changeHorizontalHeader(self, index):
        it = self.table.horizontalHeaderItem(index)
        if it is None:
            val = self.table.model().headerData(index, QtCore.Qt.Horizontal)
            it = QtWidgets.QTableWidgetItem(str(val))
            self.table.setHorizontalHeaderItem(index, it)
        oldHeader = it.text()
        newHeader, okPressed  = QtWidgets.QInputDialog.getText(self,
            ' Change header label for column %d', "Your name:", 
            QtWidgets.QLineEdit.Normal, oldHeader)
        if okPressed:
            it.setText(newHeader)

    @QtCore.pyqtSlot()
    def click_button_add_c(self):
        culPosition = self.table.columnCount()
        self.table.insertColumn(culPosition)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    main = MyWindow()
    main.show()
    sys.exit(app.exec_())