【问题标题】:How to add QLabels into QTableWidget with different alignment如何将 QLabels 添加到具有不同对齐方式的 QTableWidget 中
【发布时间】:2019-10-14 04:38:47
【问题描述】:

我有应该在其中添加聊天消息(普通 QLabels)的 QTableWidget。

我在这张表中只有一列,而对齐方式取决于发件人(我=左,他=右)

我知道我可以使用以下方法将小部件添加到 QTableWidget 中:

myTable.setCellWidget(row,0,myQLabel)

这会将标签添加到默认对齐方式中。现在,我不知道如何使每一行的对齐动态。

我看到一些答案在做这样的事情,但这些项目不是小部件,只是文本。

如何使添加的QWidget进入不同的对齐方式

【问题讨论】:

    标签: python pyqt pyqt5 qtablewidget qlabel


    【解决方案1】:

    您必须建立与 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_())
    

    更新:

    另一种解决方案是创建一个 QWidget,放置 QLabel 以建立与 QWidget 的 QLabel 的对齐方式。

    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)
    

    【讨论】:

    • 但是这样你是对齐文本而不是它自己的标签 当标签是定制的时它会是什么样子? (不是透明的)
    • @MohamedIbrahim 在 QTableWidget 中建立小部件时,它会占用所有可用大小,因此可能的解决方案是发出信号的解决方案。如果您要进行自定义绘画,那么您有责任保持相同的行为。
    • @MohamedIbrahim 我添加了另一个解决方案,不再将对齐放置在 QLabel 中,我认为该解决方案是您想要的。如果我的回答对您有帮助,请不要忘记将其标记为正确,如果您不知道该怎么做,请查看tour
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多