Evan Brittain
Evan Brittain

Reputation: 587

How to align QLineEdits within a QWidget?

I have a widget which contains three labels and three lineedits. I would like all lineedits to be aligned vertically directly after the longest label.

Here is my class:

class ScaleDisplayWidget(QWidget):
    def __init__(self, parent=None):
        super(ScaleDisplayWidget, self).__init__(parent)
        self.setFixedSize(400, 200)
        self.initUI()
        self.update(0, 0, 0)

    def initUI(self):
        '''
        Setup GUI elements of scale window
        '''
        mainLayout = QVBoxLayout()

        hLayout = QHBoxLayout()
        hLayout.setSpacing(0)

        self.dx_label = QLabel('DX:')
        self.dx_label.setFixedWidth(80)
        self.dx_edit = QLineEdit()
        self.dx_edit.setReadOnly(True)
        self.dx_edit.setFocus(True)
        self.dx_edit.setFixedWidth(150)

        hLayout.addWidget(self.dx_label)
        hLayout.addWidget(self.dx_edit)

        h2Layout = QHBoxLayout()
        h2Layout.setSpacing(0)

        self.dy_label = QLabel('DY:')
        self.dy_label.setFixedWidth(80)
        self.dy_edit = QLineEdit()
        self.dy_edit.setReadOnly(True)
        self.dy_edit.setFocus(True)
        self.dy_edit.setFixedWidth(150)

        h2Layout.addWidget(self.dy_label)
        h2Layout.addWidget(self.dy_edit)

        h3Layout = QHBoxLayout()
        h3Layout.setSpacing(0)

        self.dist_label = QLabel('Distance:')
        self.dist_label.setFixedWidth(80)
        self.dist_edit = QLineEdit()
        self.dist_edit.setReadOnly(True)
        self.dist_edit.setFocus(True)
        self.dist_edit.setFixedWidth(150)

        h3Layout.addWidget(self.dist_label)
        h3Layout.addWidget(self.dist_edit)

        mainLayout.addLayout(hLayout)
        mainLayout.addLayout(h2Layout)
        mainLayout.addLayout(h3Layout)

        self.setLayout(mainLayout)
        self.show()

    def update(self, dx, dy, dist):
        self.dx_edit.setText(str(dx))
        self.dy_edit.setText(str(dy))
        self.dist_edit.setText(str(dist))

In this case I'm aiming to have all lineedits aligned directly after the distance label (maybe add 5 pixels or something small of padding). I have tried using setContentsMargins(0,0,0,0) on all the layouts but it hasn't changed anything.

Upvotes: 0

Views: 228

Answers (1)

Dimitry Ernot
Dimitry Ernot

Reputation: 6594

Use a QFormLayout instead:

        self.dx_edit = QLineEdit()
        self.dx_edit.setReadOnly(True)
        self.dx_edit.setFocus(True)
        self.dx_edit.setFixedWidth(150)

        self.dy_edit = QLineEdit()
        self.dy_edit.setReadOnly(True)
        self.dy_edit.setFocus(True)
        self.dy_edit.setFixedWidth(150)

        self.dist_edit = QLineEdit()
        self.dist_edit.setReadOnly(True)
        self.dist_edit.setFocus(True)
        self.dist_edit.setFixedWidth(150)

        layout = QFormLayout(self)
        layout.addRow("DX", self.dx_edit)
        layout.addRow("DY", self.dy_edit)
        layout.addRow("Distance", self.dist_edit)

You might need to set the label align to left with layout.setLabelAlignment(Qt.AlignLeft)

Upvotes: 1

Related Questions