QWidget 无法在 QMainWindow 实例 PyQt5 上显示

Posted

技术标签:

【中文标题】QWidget 无法在 QMainWindow 实例 PyQt5 上显示【英文标题】:QWidget cannot display on QMainWindow instance 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_())

【问题讨论】:

【参考方案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 行)调用它。即使按照您的建议更改我的代码,也就是链接中显示的版本,对我来说它不起作用。我检查了您的示例是否正确,但不知道为什么在我的情况下不是解决方案。

以上是关于QWidget 无法在 QMainWindow 实例 PyQt5 上显示的主要内容,如果未能解决你的问题,请参考以下文章

C ++ QT如何从QMainWindow布局访问QWidget的公共类成员

QMainWindow和QWidget

如何从父级不是 QMainWindow 的 QWidget 访问 QMainWindow

如何在无父 QWidget 中接收 QMainWindow mouseClick 事件?

从 QWidget (PyQt4) 调用 QMainWindow 中的方法/属性

QWidget QMainWindow QDialog 之间的区别