首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QMainWindow对QWidget

QMainWindow对QWidget
EN

Stack Overflow用户
提问于 2018-03-26 15:08:07
回答 1查看 7.5K关注 0票数 2

对于QMainWindow和QWidget在PyQt5中的不同用法,我找不到很好的解释(我猜Qt在一般情况下也是如此)。据我所读,QMainWindow继承了QWidget,所以应该能够做QWidget所能做的一切。但是,当我试图将从QWidget找到的示例转换为QMainWindow时,布局就会变得一团糟。

我想要解决的例子来自qstackedwidget.htm。(我的GUI将有一个StackedWidget作为中心小部件,带有一个用于导航的sidepanel,所以让这个示例在QMainWidget中工作将是我自己的代码的一个很好的基础。)

PyQT5 5-转换和稍微缩短版本:

代码语言:javascript
复制
#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import (QApplication, QFormLayout, QLabel, QRadioButton, QCheckBox,
                             QListWidget, QStackedWidget, QLineEdit,
                             QHBoxLayout, QGridLayout
                             )
from PyQt5.Qt import QWidget, QMainWindow

class StackedExample(QMainWindow):
    def __init__(self):
        super(stackedExample, self).__init__()
        self.leftlist = QListWidget ()
        self.leftlist.insertItem (0, 'Contact' )
        self.leftlist.insertItem (1, 'Personal' )

        self.stack1 = QWidget()
        self.stack2 = QWidget()

        self.stack1UI()
        self.stack2UI()

        self.Stack = QStackedWidget (self)
        self.Stack.addWidget (self.stack1)
        self.Stack.addWidget (self.stack2)
        grid = QGridLayout()
        self.setLayout(grid)
        grid.addWidget(self.leftlist,0,0)
        grid.addWidget(self.Stack,0,1)

        self.leftlist.currentRowChanged.connect(self.display)
        self.resize(300,100)
        self.show()

    def stack1UI(self):
        layout = QFormLayout()
        layout.addRow("Name",QLineEdit())
        layout.addRow("Address",QLineEdit())
        self.stack1.setLayout(layout)

    def stack2UI(self):
        layout = QFormLayout()
        sex = QHBoxLayout()
        sex.addWidget(QRadioButton("Male"))
        sex.addWidget(QRadioButton("Female"))
        layout.addRow(QLabel("Sex"),sex)
        layout.addRow("Date of Birth",QLineEdit())

        self.stack2.setLayout(layout)

    def display(self,i):
        self.Stack.setCurrentIndex(i)

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

if __name__ == '__main__':
    main()

这段代码在基于QWidget的时候运行得很好,但是当它基于QMainWidget (如上面的版本)时,所有的东西都会塞进左上角。

需要进行哪些更改才能显示QMainWindow?中适用于QWidget的布局

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-26 15:31:09

QMainWindow必须有一个中央小部件才能正确显示。您需要定义一个中央小部件,然后向其添加任何布局,而不是主窗口。

代码语言:javascript
复制
class StackedExample(QMainWindow):

def __init__(self):
    QMainWindow.__init__(self)
    self.leftlist = QListWidget()
    self.leftlist.insertItem(0, 'Contact' )
    self.leftlist.insertItem(1, 'Personal' )

    self.central_widget = QWidget()               # define central widget
    self.setCentralWidget(self.central_widget)    # set QMainWindow.centralWidget

    self.stack1 = QWidget()
    self.stack2 = QWidget()

    self.stack1UI()
    self.stack2UI()

    self.Stack = QStackedWidget (self)
    self.Stack.addWidget (self.stack1)
    self.Stack.addWidget (self.stack2)
    grid = QGridLayout()
    self.centralWidget().setLayout(grid)          # add the layout to the central widget
    grid.addWidget(self.leftlist,0,0)
    grid.addWidget(self.Stack,0,1)

    self.leftlist.currentRowChanged.connect(self.display)
    self.resize(300,100)
    self.show()

除了为centralWidget定义的QMainWindow之外,还有其他领域。这是文件 for QMainWindow.它更详细地解释了这一点。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49494759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档