最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

python - Why does PySide6.QtWidgets.QVBoxLayout not expand despite setting QSizePolicy.Expanding - Stack Overflow

programmeradmin4浏览0评论

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.

But after subsequent clicks, there is less squish

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())
发布评论

评论列表(0)

  1. 暂无评论