Search code examples
pythonpyqtpyqt4qtablewidget

Centering Text in QTableWidgetItem during cell Edit


The following PyQt4 example demonstrates my problem. The text in the QTableWidget cells is centered nicely, until you edit the cells. When you edit a cell the text is left justified.

I would like to maintain center alignment during edit of each cell.

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
from PyQt4 import Qt
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MainWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.table = QtGui.QTableWidget(parent=self)
        self.table.setEditTriggers(QtGui.QAbstractItemView.AllEditTriggers)
        self.table.setColumnCount(2)
        self.table.setRowCount(2)
        self.table.setHorizontalHeaderLabels(['col1','col2'])
        self.table.setVerticalHeaderLabels(['row1','row2'])

        item = QtGui.QTableWidgetItem('x')
        item.setFlags(Qt.NoItemFlags | Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsSelectable)
        item.setTextAlignment(Qt.AlignHCenter|Qt.AlignVCenter|Qt.AlignCenter)
        self.table.setItem(0, 0, item)

        item = QtGui.QTableWidgetItem('x')
        item.setFlags(Qt.NoItemFlags | Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsSelectable)
        item.setTextAlignment(Qt.AlignHCenter|Qt.AlignVCenter|Qt.AlignCenter)
        self.table.setItem(0, 1, item)

        item = QtGui.QTableWidgetItem('x')
        item.setFlags(Qt.NoItemFlags | Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsSelectable)
        item.setTextAlignment(Qt.AlignHCenter|Qt.AlignVCenter|Qt.AlignCenter)
        self.table.setItem(1, 0, item)

        item = QtGui.QTableWidgetItem('x')
        item.setFlags(Qt.NoItemFlags | Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsSelectable)
        item.setTextAlignment(Qt.AlignHCenter|Qt.AlignVCenter|Qt.AlignCenter)
        self.table.setItem(1, 1, item)

        layout = QtGui.QGridLayout()
        layout.addWidget(self.table, 1, 0)
        self.setLayout(layout)

################################################################

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    app.setStyle("Plastique")   # set style
    myapp = MainWindow()      # instantiate the main window
    myapp.show()              # show the main window
    rc = app.exec_()
    myapp.close()
    sys.exit(rc)   # exit with the same return code of Qt application      

Solution

  • A possible solution is to implement a delegate:

    class CenterDelegate(QStyledItemDelegate):
        def createEditor(self, parent, option, index):
            editor = QStyledItemDelegate.createEditor(self, parent, option, index)
            editor.setAlignment(Qt.AlignCenter)
            return editor
    

    And then you set it to the QTableWidget:

    self.table = QtGui.QTableWidget(parent=self)
    delegate = CenterDelegate()
    self.table.setItemDelegate(delegate)
    

    enter image description here