【问题标题】:QWidget cannot display on QMainWindow instance PyQt5QWidget 无法在 QMainWindow 实例 PyQt5 上显示
【发布时间】:2015-05-09 19:04:23
【问题描述】:

我现在正在学习 PyQt5,并尝试自己做一些小事。我做了一个非常基本的自定义工具箱,上面只有 6 个QPushButtons 按钮,继承自QWidget 类。

我的问题是我无法在QMainWidow 实例上显示我的工具箱。让我告诉你我做了什么;

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class ToolBox(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        btn = [QPushButton('B', self) for i in range(6)]
        for Btn in btn:
            Btn.resize(30, 30)
        self.resize(60, 90)
        k = 0
        for i in range(6):
            btn[i].move((i%2)*30, k*30)
            k += 1 if i % 2 == 1 else 0
        self.show()

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.resize(300, 200)
        self.statusBar().showMessage('Ready!')

        exitAction = QAction(QIcon('idea.png'), 'Exit', self)
        exitAction.setStatusTip('Exit application')
        exitAction.setShortcut('Ctrl+Q')
        exitAction.triggered.connect(qApp.quit)

        menuBar = self.menuBar()
        fileMenu = menuBar.addMenu('File')
        fileMenu.addAction(exitAction)

        t = ToolBox()
        t.move(150, 150)
        t.show() #With and without this line, it doesn't work.

        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    m = MainWindow()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python-3.x pyqt5


    【解决方案1】:

    您只需要将您的小部件放置在 QMainWindow 画布中的某个位置。您所要做的就是将它放在主窗口中。举个例子,我用setCentralWidget() 来定位你的QWidget。

    import sys
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    
    class ToolBox(QWidget):
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            btn = [QPushButton('B', self) for i in range(6)]
            for Btn in btn:
                Btn.resize(30, 30)
            self.resize(60, 90)
            k = 0
            for i in range(6):
                btn[i].move((i%2)*30, k*30)
                k += 1 if i % 2 == 1 else 0
    
    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            self.resize(300, 200)
            self.statusBar().showMessage('Ready!')
    
            exitAction = QAction(QIcon('idea.png'), 'Exit', self)
            exitAction.setStatusTip('Exit application')
            exitAction.setShortcut('Ctrl+Q')
            exitAction.triggered.connect(qApp.quit)
    
            menuBar = self.menuBar()
            fileMenu = menuBar.addMenu('File')
            fileMenu.addAction(exitAction)
    
            t = ToolBox()
            self.setCentralWidget(t)
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        m = MainWindow()
        m.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 好的!它可以工作,但是如何更改主窗口中小部件的坐标?
    • 这不是您最初的问题的一部分,也不适合您当前的代码库。我建议你阅读这篇关于 PyQt 布局的文章:zetcode.com/gui/pyqt4/layoutmanagement
    • 我建议您也查看这些 pyqt5 示例。 github.com/baoboa/pyqt5/tree/master/examples
    • @ham-sandwich 我遇到了与 OP 报告的问题相同的问题。这是我的QWidget。我可以很好地运行它,除非我从我的QtWidgets.QMainWindow(第 325 行)调用它。即使按照您的建议更改我的代码,也就是链接中显示的版本,对我来说它不起作用。我检查了您的示例是否正确,但不知道为什么在我的情况下不是解决方案。
    猜你喜欢
    • 2020-06-07
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2015-05-23
    • 2014-05-18
    • 2019-08-07
    相关资源
    最近更新 更多