如何在pyside中将Widget类导入Qt主窗口
我想在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()