如何在pyside中将Widget类导入Qt主窗口

-1 投票
1 回答
1155 浏览
提问于 2025-04-18 17:12

我想在pyside中定义两个类。

第一个类是StartFrame,它是主窗口。第二个类是HelpPanel,它是图形界面的一部分。

我尝试把HelpPanel导入到StartFrame中并显示出来。但是结果是一个空窗口,里面没有HelpPanel。

这是我的代码:

import sys
from PySide import QtGui
from PySide import QtCore
from PySide.QtCore import Signal as pyqtSignal
from PySide.QtCore import Slot as pyqtSlot


class StartFrame(QtGui.QMainWindow):
    def __init__(self, parent = None):
        super(StartFrame, self).__init__(parent)  
        self.parent = parent
        self.initialize()
    def initialize(self):
        self.hp = HelpPanel(self)
        grid = QtGui.QGridLayout()
        grid.addWidget(self.hp, 1, 0)
        self.setLayout(grid)
        self.show()


class HelpPanel(QtGui.QWidget):
    def __init__(self, parent):
        super(HelpPanel,self).__init__(parent)    
        self.parent = parent                      
        bsize = QtGui.QVBoxLayout()                 
        title = QtGui.QLabel('Help Information')    
        text_area = QtGui.QTextEdit()
        text_area.setReadOnly(True)
        bsize.addWidget(title)        
        bsize.addStretch(0)
        bsize.addWidget(text_area)     
        bsize.addStretch(1)
        self.setLayout(bsize)           
        self.show()


def main():
    app = QtGui.QApplication(sys.argv)
    ex = StartFrame()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main() 

如果没有StartFrame,HelpPanel本身可以运行并显示结果。我怀疑问题出在self.hp = HelpPanel(self)这一行,但我不太确定。

提前谢谢你。

1 个回答

1

我不太明白为什么PySide没有给出警告,但如果你在PyQt下运行这段代码,你会看到这个信息:

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

问题在于,QMainWindow这个类自带了一个布局,而你试图去覆盖它。解决这个问题的一种方法是把你的布局放在一个新的小部件里,然后使用QMainWindow::setCentralWidget()来把它设置为你创建的QMainWindow的中心部件。

你新的initialize函数大概会是这样的:

    def initialize(self):
        self.hp = HelpPanel(self)
        grid = QtGui.QGridLayout()
        grid.addWidget(self.hp)
        widget = QtGui.QWidget()
        widget.setLayout(grid)
        self.setCentralWidget(widget)
        self.show()

撰写回答