Search code examples
pythonqwidgetpyside6

Why result is different?


I'm going to separate files on pyside6. I divided Widget and separated files in my own way, but the results are different. Why is it different?

import sys
from PySide6.QtWidgets import (
    QApplication,
    QMainWindow,
    QHBoxLayout,
    QWidget,
    QVBoxLayout,
    QLabel,
)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Test")
        self.setGeometry(100, 100, 300, 200)
        central_widget = QWidget()

        widgetsss = QWidget()
        title_1 = QLabel("Title 1")
        title_2 = QLabel("Title 2")
        title_3 = QLabel("Title 3")

        layout = QVBoxLayout()
        layout.addWidget(title_1)
        layout.addWidget(title_2)
        layout.addWidget(title_3)
        widgetsss.setLayout(layout)

        widgetsss.setStyleSheet("background-color:blue;")
        layout = QHBoxLayout(central_widget)
        layout.addWidget(widgetsss)

        self.setCentralWidget(central_widget)

Result is

enter image description here

other is

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Test")
        self.setGeometry(100, 100, 300, 200)
        central_widget = QWidget()

        widgetsss = anoterwidget()

        widgetsss.setStyleSheet("background-color:lightgreen;")
        layout = QHBoxLayout(central_widget)
        layout.addWidget(widgetsss)

        self.setCentralWidget(central_widget)


class anoterwidget(QWidget):

    def __init__(self):
        super().__init__()

        title_1 = QLabel("Title 1")
        title_2 = QLabel("Title 2")
        title_3 = QLabel("Title 3")

        layout = QVBoxLayout()
        layout.addWidget(title_1)
        layout.addWidget(title_2)
        layout.addWidget(title_3)
        self.setLayout(layout)

result is

enter image description here

Why is there such a difference?


Solution

  • Changing colors via set style-sheets can have undesired side effects. In order to control this a bit better, always mention which component you want to modify, e.g. QLabel { #css_goes_here }:

    enter image description here

    from PySide6.QtCore import Qt
    from PySide6.QtWidgets import (
        QApplication,
        QMainWindow,
        QWidget,
        QVBoxLayout,
        QLabel,
    )
    
    
    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
            self.setWindowTitle("Single Class")
    
            widg = QWidget()
    
            layout = QVBoxLayout()
    
            title_1 = QLabel("Title 1")
            title_2 = QLabel("Title 2")
            title_3 = QLabel("Title 3")
    
            layout.addWidget(title_1)
            layout.addWidget(title_2)
            layout.addWidget(title_3)
            widg.setLayout(layout)
    
            p = widg.palette()
            p.setColor(self.backgroundRole(), Qt.red)
            widg.setPalette(p)
    
            widg.setStyleSheet("QLabel {background-color:pink;}")
    
            self.setCentralWidget(widg)
    
    
    class MainWindow2(QMainWindow):
        def __init__(self):
            super().__init__()
            self.setWindowTitle("Double Class")
            widg = anoterwidget()
            widg.setStyleSheet("QLabel {background-color:lightgreen;}")
            self.setCentralWidget(widg)
    
    
    class anoterwidget(QWidget):
        def __init__(self):
            super().__init__()
            layout = QVBoxLayout()
    
            title_1 = QLabel("Title 1")
            title_2 = QLabel("Title 2")
            title_3 = QLabel("Title 3")
    
            layout.addWidget(title_1)
            layout.addWidget(title_2)
            layout.addWidget(title_3)
            self.setLayout(layout)
    
    
    if __name__ == "__main__":
        app = QApplication([])
        window = MainWindow()
        window2 = MainWindow2()
        window.show()
        window2.show()
        app.exec()