如何将Widget类导入到pyside中的Qt MainWindow中

时间:2014-08-13 20:15:39

标签: python pyside

我想在pyside中定义两个类。

第一个:StartFrame是MainWindow。第二个:HelpPanel是GUI的一部分。

我尝试将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 个答案:

答案 0 :(得分: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()