Python 为另一个类中的小部件设置背景图像

Python 为另一个类中的小部件设置背景图像,python,pyqt,pyqt5,python-3.6,Python,Pyqt,Pyqt5,Python 3.6,我最近一直在学习pyqt5作为我的第一个gui框架。到目前为止,我一直在试验QtStackedLayout。我目前有两个窗口屏幕,一个在UI类中创建,另一个在另一个单独的类中创建。我有两个顾虑: 在我开始尝试为Window1添加背景图像之前,一切都正常。没有显示图像,但代码运行正常 在开始的时候,窗口一会首先显示,直到它被加载到主窗口,我尝试在实例化对象时将self传递给sert作为某种父对象,以防止出现这种情况,但我认为我做得不对 请参阅下面的代码(我有不好的导入语句,我将对其进行整理) 默认

我最近一直在学习pyqt5作为我的第一个gui框架。到目前为止,我一直在试验QtStackedLayout。我目前有两个窗口屏幕,一个在UI类中创建,另一个在另一个单独的类中创建。我有两个顾虑:

  • 在我开始尝试为Window1添加背景图像之前,一切都正常。没有显示图像,但代码运行正常
  • 在开始的时候,窗口一会首先显示,直到它被加载到主窗口,我尝试在实例化对象时将
    self
    传递给sert作为某种父对象,以防止出现这种情况,但我认为我做得不对
  • 请参阅下面的代码(我有不好的导入语句,我将对其进行整理)


    默认情况下,只有窗口(与小部件不同)将使用Qpalete的背景色,如果希望小部件使用Qpalete的背景色,则必须启用该属性

    #。。。
    自我设置标签(宽度、高度)
    self.setAutoFillBackground(True)
    # ...
    
    尽管您的代码有点凌乱,例如,您确定某些方法接收某些参数,但从未使用它们。最后,我认为您希望使用窗口的大小重新缩放图像的背景,因此我重写了resizeEvent()方法,以便缩放采用窗口的大小

    考虑到以上所有因素,我改进了您的代码:

    导入系统 从PyQt5导入QtCore、QtGui、QtWidgets 类小部件(qtwidts.QWidget): def uuu init uuu(self,parent=None): 超级(小部件,自我)。\uuuuu初始化\uuuuuuu(父级) self.m_stacked_layout=QtWidgets.QStackedLayout() self.widget_1=WidgetOne() self.widget_2=qtwidts.QWidget() self.widget_2_UI() self.m_layout.addWidget(self.widget_1) self.m_layout.addWidget(self.widget_2) button=QtWidgets.QPushButton( “更改窗口”,单击=self.Change\u窗口 ) lay=qtwidts.QVBoxLayout(self) lay.addLayout(自.m_堆叠布局) lay.addWidget(按钮) @QtCore.pyqtSlot() def更改_窗口(自): ix=self.m_堆叠布局.currentIndex() self.m_stacked_layout.setCurrentIndex(如果ix==0,则为1,否则为0) def小部件_2_用户界面(自身): label=qtwidts.QLabel(“在窗口2中,self.widget_2”) 类WidgetOne(qtwidget.QWidget): def uuu init uuu(self,parent=None): super()。\uuuu init\uuuu(父级) self.setAutoFillBackground(True) self.set_标签() self.m_image=QtGui.QImage(“resource/images/blue_bg.jpg”) def set_标签(自身): label=qtwidts.QLabel(“在窗口1中”,self) def resizeEvent(自我,事件): palete=self.palete() sImage=self.m_image.scaled(event.size()) 调色板.setBrush(10,QtGui.QBrush(sImage)) self.setPalette(调色板) 超级(WidgetOne,self).调整事件大小(event) 类Main(QtWidgets.QMainWindow): def uuu init uuu(self,parent=None): super()。\uuuu init\uuuu(父级) widget=widget() self.setCentralWidget(小部件) 自我调整大小(480720) 如果名称=“\uuuuu main\uuuuuuuu”: app=qtwidts.QApplication(sys.argv) w=主() w、 show() sys.exit(app.exec())
    您好,谢谢您修复我的代码。我仍然在学习和尝试Qt,在发布之前忘记了清理。我通过添加另一种方法来更新背景,例如:
    def set_bg(self):bg=self.setStyleSheet(“path/to/bg.jpg”)
    这与使用调色板有什么区别?@Fer de lance有两种不同的方法,在Qt中至少有3种方式来设置样式:Qt样式表、QStyle和qpalete。每种方法都有其优缺点,请阅读Qt的文档,因为这个空间太小,无法告诉您它们之间的区别。但建议你不要混用这些方法。@Fer de lance另一方面,下一次在发帖前花点时间润色一下你的问题,许多人建议至少花1个小时来回答一个好问题,还指出你必须承受与把工作交给老师、老板等同样的压力。因为如果你的问题提供了一个清晰简洁的代码,它会鼓励更多的人来帮助你,因为这可能很容易得到帮助(我们不会浪费时间实现MRE来理解你的问题)
    import sys
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    
    
    class Ui(QWidget):
    
        def setupUi(self, Main, width, height):
            self.stack = QStackedLayout()
            self.window_1 = WindowOne(width, height)
            self.window_2 = QWidget(self)
            self.window_2_UI()
    
            self.stack.addWidget(self.window_1)
            self.stack.addWidget(self.window_2)
    
            # Only one button
            self.btn = QPushButton("Change window", self)
    
            # Create the central widget of your Main Window
            self.main_widget = QWidget(self)
            layout = QVBoxLayout(self.main_widget)
            layout.addLayout(self.stack)
            layout.addWidget(self.btn)
    
            self.setCentralWidget(self.main_widget)
    
            self.btn.clicked.connect(self.change_window)
    
        def change_window(self):
            if self.stack.currentIndex() == 0:
                self.stack.setCurrentIndex(1)
            else:
                self.stack.setCurrentIndex(0)
    
        def window_2_UI(self):
            label = QLabel("In Window 2", self.window_2)
    
    
    class WindowOne(QWidget):
        def __init__(self, width, height):
            super().__init__()
            self.set_bg(width, height)
            self.set_label()
            # self.setStyleSheet("background-image: url(:resource/images/blue_bg.jpg)")
    
        def set_label(self):
            label = QLabel("In Window 1", self)
    
        def set_bg(self, w, h):
            oImage = QImage("resource/images/blue_bg.jpg")
            sImage = oImage.scaled(QSize(w, h))
            palette = QPalette()
            palette.setBrush(10, QBrush(sImage))
            self.setPalette(palette)
    
    
    class Main(QMainWindow, Ui):
        def __init__(self):
            super().__init__()
            self.w_width = 480
            self.w_height = 720
            self.resize(self.w_width, self.w_height)
            self.init_ui()
            self.setupUi(self, self.w_width, self.w_height)
    
        def init_ui(self):
            self.center()
            self.setWindowTitle('Main Window')
    
        def center(self):
            qr = self.frameGeometry()
            cp = QDesktopWidget().availableGeometry().center()
            qr.moveCenter(cp)
            self.move(qr.topLeft())
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        M = Main()
        M.show()
        sys.exit(app.exec())