【问题标题】:pyqt5 layout issue after inherit from parent从父级继承后的pyqt5布局问题
【发布时间】:2020-10-15 13:09:24
【问题描述】:

我创建了一个作为父类的类“commonlessonItem” 创建 parent 后,我​​通过子类 'commonlessonpiskelStepItem' 继承了它 我在布局中添加了一个小部件 运行程序后,我遇到了这个问题。

QLayout: Attempting to add QLayout "" to CommonLessonPiskelStepItem "", which already has a layout
QWidget::setLayout: Attempting to set QLayout "" on CommonLessonPiskelStepItem "", which already has a layout

这里有什么问题? 我的代码来了

class CommonLessonItem(MyFrame):

    def __init__(self,parent):

        super(CommonLessonItem,self).__init__(parent)
        
        self.lbl_title = CommonHeaderLabel(self)
        self.lbl_description = CommonDescriptionLabel(self)
        self.lbl_icon = CommonHeaderIcon(self)
        self.initUI()
        self.isChild = False

    def initUI(self):
        
        #set layout
        self.layout = MyGridLayout(self)
        self.layout.addWidget(self.lbl_title,0,0,1,19)
        self.layout.addWidget(self.lbl_icon,0,19,1,1)
        self.layout.addWidget(self.lbl_description,1,0,1,20)
        
        #initialize info
        self.setInfo("Title","Description",None)
        self.setLayout(self.layout)


    def setInfo(self,title,description,iconPath):
        self.lbl_title.setText(title)
        self.lbl_description.setText(description)
        if(iconPath is not None):
            self.lbl_icon.setPixmap(QPixmap(iconPath))

class CommonLessonPiskelStepItem(CommonLessonItem):
    def __init__(self,parent):
    
        super(CommonLessonPiskelStepItem,self).__init__(parent)
        # self.lbl_referUrl = CommonDescriptionLabel('wwww.piskelapp.com')
        self.initUI()
        self.lbl_icon.setPixmap(QPixmap('icons/lookstep'))
    
    def initUI(self):
        super().initUI()
        pass
    

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mw = CommonLessonPiskelStepItem(None)
    mw.show()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python inheritance layout pyqt5


    【解决方案1】:

    错误来自您尝试多次设置布局的事实。

    • 第一次创建布局时:self.layout = MyGridLayout(self)(使用 self 参数会自动设置小部件的布局)
    • 第二次尝试设置布局时:self.setLayout(self.layout);布局已设置;
    • 第三次调用super().initUI()时:在你使用super().__init__时已经隐式调用了;

    虽然第二点不是问题(如果您使用具有相同布局的setLayout,它将被忽略),第三点是导致错误的原因,因为您正在尝试为一个已有的小部件,稍后您还尝试为该小部件设置新布局。

    只需从子类的initUI 方法中删除super().initUI()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-16
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      相关资源
      最近更新 更多