[Python] Why does PySide6.QtWidgets.QVBoxLayout not expand despite setting...

Discussão em 'Python' iniciado por Stack, Março 17, 2025.

  1. Stack

    Stack Membro Participativo

    Why does PySide6.QtWidgets.QVBoxLayout not expand despite setting QSizePolicy.Expanding? Additionally, on the first click, even though the items have been added to the Legend, then items aren't visible until the mouse is clicked again. But when the 2nd click occurs, the 1st box appears but is squished with the 2nd like the image below.

    [​IMG]

    But after subsequent clicks, there is less squish

    [​IMG]

    Why does this occur? I have tried to set the Legend with resize(200,200), but increasing the size doesn't change anything.

    import pyqtgraph.opengl as gl
    from PySide6 import QtCore, QtWidgets
    from PySide6.QtWidgets import QApplication, QMainWindow
    from PySide6.QtGui import QColor, QPixmap, QPainter
    import sys

    class CustomGLViewWidget(gl.GLViewWidget):
    def __init__(self, legend=None, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.colours = [(0,1,1,1), (1,1,1,1), (1,0,0,1), (1,0,1,1), (1,1,0,1)]
    self.idx=0
    self.legend = legend

    def mousePressEvent(self, ev):
    print(ev.buttons().value)
    if ev.buttons().value <= 2:
    self.legend.add_legend_item(f"{self.idx}00", self.colours[self.idx])
    self.idx+=1
    return super().mousePressEvent(ev)

    class ColorSquare(QtWidgets.QLabel):
    def __init__(self, color, size=50):
    super().__init__()
    self.color = color
    self.color_width = size
    self.color_height = size/2
    self.setFixedSize(self.color_width, self.color_height)
    self.update_color()

    def update_color(self):
    pixmap = QPixmap(self.color_width, self.color_height)
    pixmap.fill(QtCore.Qt.transparent)
    painter = QPainter(pixmap)
    painter.setBrush(QColor.fromRgbF(*self.color))
    painter.drawRect(0, 0, self.color_width, self.color_height)
    painter.end()
    self.setPixmap(pixmap)
    self.setStyleSheet("border: 2px solid black;")

    class Legend(QtWidgets.QWidget):
    def __init__(self, parent=None):
    super().__init__(parent)
    self.setStyleSheet("background: transparent; color: white;")
    self.layout = QtWidgets.QVBoxLayout(self)
    self.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)
    self.layout.setContentsMargins(0, 0, 0, 0)
    self.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
    self.resize(200,200)

    def add_legend_item(self, legend_name, colour):
    hbox_layout = QtWidgets.QHBoxLayout()

    hbox_layout.setAlignment(QtCore.Qt.AlignLeft)
    hbox_layout.setContentsMargins(0, 0, 0, 0)
    hbox_layout.setSpacing(5)

    square_colour = ColorSquare(colour)
    hbox_layout.addWidget(square_colour)

    square_label = QtWidgets.QLabel(legend_name)
    square_label.setStyleSheet("border: 1px solid white; padding: 3px; background-color: white; color: black")
    square_label.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)

    hbox_layout.addWidget(square_label)
    inner_widget = QtWidgets.QWidget()
    inner_widget.setLayout(hbox_layout)
    self.layout.addWidget(inner_widget)
    self.adjustSize()
    self.update()

    class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setGeometry(0, 0, 600, 600)
    self.widget_central = QtWidgets.QWidget()
    self.setCentralWidget(self.widget_central)
    self.widget_layout_v_main = QtWidgets.QVBoxLayout(self.widget_central)
    legend=Legend()
    self.widget_gl = CustomGLViewWidget(legend)
    legend.setParent(self.widget_gl)
    self.widget_layout_v_main.addWidget(self.widget_gl)

    if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()
    sys.exit(app.exec())

    Continue reading...

Compartilhe esta Página