Как добавить QLabels в QTableWidget с другим выравниванием - PullRequest
1 голос
/ 28 мая 2019

У меня есть QTableWidget, в который следует добавлять сообщения чата (обычные QLabels).

У меня есть только один столбец в этой таблице, в то время как выравнивание зависит от отправителя (я = левый, он = правый)

Я знаю, что могу добавить виджет в QTableWidget, используя:

myTable.setCellWidget(row,0,myQLabel)

Это добавляет метку в выравнивание по умолчанию. Теперь я не знаю, как сделать выравнивание динамическим для каждой строки.

Я видел, что некоторые ответы делали что-то вроде этого, но элементы были не виджетами, а текстами.

Как сделать, чтобы добавленный QWidget перешел в другое выравнивание

1 Ответ

1 голос
/ 29 мая 2019

Необходимо установить выравнивание для QLabel:

from PyQt5 import QtCore, QtGui, QtWidgets


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

        self.m_table = QtWidgets.QTableWidget(0, 1)
        self.m_table.verticalHeader().hide()
        self.m_table.horizontalHeader().setSectionResizeMode(
            QtWidgets.QHeaderView.Stretch
        )
        self.m_lineedit = QtWidgets.QLineEdit()
        self.left_button = QtWidgets.QPushButton(
            "Left", clicked=self.on_left_clicked
        )
        self.right_button = QtWidgets.QPushButton(
            "Right", clicked=self.on_right_clicked
        )

        lay = QtWidgets.QGridLayout(self)
        lay.addWidget(self.m_table, 0, 0, 1, 2)
        lay.addWidget(self.m_lineedit, 1, 0, 1, 2)
        lay.addWidget(self.left_button, 2, 0)
        lay.addWidget(self.right_button, 2, 1)

    @QtCore.pyqtSlot()
    def on_left_clicked(self):
        self.add_label(self.m_lineedit.text(), QtCore.Qt.AlignLeft)
        self.m_lineedit.clear()
        self.m_table.scrollToBottom()

    @QtCore.pyqtSlot()
    def on_right_clicked(self):
        self.add_label(self.m_lineedit.text(), QtCore.Qt.AlignRight)
        self.m_lineedit.clear()
        self.m_table.scrollToBottom()

    def add_label(self, text, alignment):
        label = QtWidgets.QLabel(text, alignment=alignment)
        row = self.m_table.rowCount()
        self.m_table.insertRow(row)
        self.m_table.setCellWidget(row, 0, label)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

enter image description here

Обновление:

Другим решением является создание QWidget, в который помещается QLabel, устанавливая выравнивание с QLabel относительно QWidget.

def add_label(self, text, alignment):
    widget = QtWidgets.QWidget()
    widget.setContentsMargins(0, 0, 0, 0)
    lay = QtWidgets.QHBoxLayout(widget)
    lay.setContentsMargins(4, 0, 4, 0)
    label = QtWidgets.QLabel(text)
    lay.addWidget(label, alignment=alignment)
    row = self.m_table.rowCount()
    self.m_table.insertRow(row)
    self.m_table.setCellWidget(row, 0, widget)
...