【问题标题】:Custom Widget stays invisible in PyQt5自定义小部件在 PyQt5 中保持不可见
【发布时间】:2017-11-04 11:24:29
【问题描述】:

我正在尝试使用 PyQt5 创建一个自定义 QWidget,但似乎我错过了一些重要信息。代码本身不会产生任何错误,但是每当我尝试将我的自定义小部件之一添加到 MainWindow 的布局时,它都会保持不可见。有趣的是,放置在我的自定义小部件中的 QWidget 显示在 MainWindow 中。 我还没有找到遇到完全相同问题的其他人,但我希望有人能向我解释我的代码或对 PyQt5 的理解有什么问题。

import sys
from PyQt5.QtWidgets import *

class CustomWidget(QWidget):

    def __init__(self):

        super().__init__()
        self.layout = QVBoxLayout(self)
        self.setLayout(self.layout)


        self.innerwidget=QWidget()
        self.layout.addWidget(self.innerwidget)
        self.innerwidget.setFixedSize(50,50)

        self.setFixedSize(100,100)
        self.setStyleSheet("background-color:blue;")




class MainWindow(QMainWindow):

    def __init__(self):

        super().__init__()

        self.CentralWidget=QWidget()
        self.setCentralWidget(self.CentralWidget)
        self.CentralWidget.setStyleSheet("background-color:green;")


        self.CentralWidget.resize(1000,600)

        self.Layout=QHBoxLayout()
        self.CentralWidget.setLayout(self.Layout)

#----Script---------

App=QApplication(sys.argv)

TestWindow=MainWindow()

#This one is there, since I can´t reduce the size of the MainWindow further than 100x100,
# but it doesnt get drawn
TestWidget=CustomWidget()
TestWindow.Layout.addWidget(TestWidget)

#This one is shown correctly
TestWidget2=CustomWidget()
TestWidget2.show()

TestWindow.show()

App.exec()

【问题讨论】:

  • 你的例子对我来说很好。你到底期待看到什么?您在哪个平台上进行测试?
  • 与子innerwidget 大小相比,这与自定义小部件的大小有关吗?
  • 我添加了一张在 Windows 10 上执行的代码的图片。左边是主窗口,里面有一个自定义小部件,右边是它自己的自定义小部件。我希望在 MainWindow 中也能看到蓝色方块(代表 CustomWidget)。但是我只看到 InnerWidget(红色方块)。
  • 我使用 setFixedSize-Function 只是为了确保我在 CustomWidget-Constructor 中创建的 QWidget 没有 CustomWidget 本身那么大。此外,我可以通过尝试最小化它来验证 MainWindow 中是否存在 CustomWidget。由于我不能将 MainWindow 的大小减小到小于 100x100,我假设 CustomWidget 只是由于某种原因没有被绘制。
  • @eNceo1423。您发布的代码不可能在您的屏幕截图中产生结果。没有一个小部件被赋予红色背景。

标签: python-3.x pyqt5 qwidget


【解决方案1】:

这个答案可能来得有点晚,但最终我找到了解决问题的方法。似乎继承 QWidget 的对象中的函数“setStyleSheet”存在错误。这导致对象永远不会改变它的背景颜色,因此保持不可见。下面的“setStyleSheet”重载解决了这个问题:

def setStyleSheet(self,p_str):                                    
    super(CustomWidget,self).setStyleSheet(p_str)
    self.show()
    self.setAutoFillBackground(True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2022-07-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多