QWidget 无法在 QMainWindow 实例 PyQt5 上显示
Posted
技术标签:
【中文标题】QWidget 无法在 QMainWindow 实例 PyQt5 上显示【英文标题】:QWidget cannot display on QMainWindow instance PyQt5 【发布时间】:2015-05-09 19:04:23 【问题描述】:我现在正在学习 PyQt5,并尝试自己做一些小事。我做了一个非常基本的自定义工具箱,上面只有 6 个QPushButton
s 按钮,继承自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 mouseClick 事件?