QMainWindow课程中是否有某些内容不允许将QPushButton正确放置在我想要的位置?
这里是QPushButton" Quit"是在错误的地方,有点太大了。
我的代码是
import sys
from PyQt5.QtWidgets import (QApplication , QPushButton, QToolTip, QMessageBox, QMainWindow, QAction,
QHBoxLayout, QVBoxLayout, QWidget, QTextEdit)
from PyQt5.QtGui import QIcon, QFont
class QQtWidget(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
btn = QPushButton("Quit", self)
btn.clicked.connect(self.close)
hbox = QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(btn)
vbox = QVBoxLayout()
vbox.addStretch(1)
vbox.addLayout(hbox)
self.setLayout(vbox)
self.setGeometry(500, 500, 300, 150)
self.setWindowTitle("PyQt Test")
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
f = DemoQt()
sys.exit(app.exec())
如果我让类继承自QWidget而不是QMainWindow,那么PushButton将被正确放置,但如果我从QWidget继承,我就不能使用其他函数。
另一个问题是QTextEdit模块。看来我无法编辑任何内容
如果我使用此代码,请填写
class OpenSavePath(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.textEdit = QTextEdit()
"I realise here that this might be the problem as there is no
setCentralWidget() module in QWidget"""
#self.setCentralWidget(self.textEdit)
save_btn = QPushButton("Save", self)
save_btn.clicked.connect(self.saveCSV)
hbox = QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(save_btn)
vbox = QVBoxLayout()
vbox.addStretch(1)
vbox.addLayout(hbox)
self.setGeometry(300, 300, 300, 250)
self.setWindowTitle("Rocket Packet Preview")
请注意,QPush按钮也放错了地方。通过使用QMainWindow更改父类QWidget并添加以下行
self.setCentralWidget(self.textEdit)
文本编辑器问题已经消失,我可以编辑。但后来我的QPushButton出现了。无论如何要解决这个问题吗?
答案 0 :(得分:0)
对于第一个问题:您必须使用QSpacerItem
将其放在角落里。
示例:
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout, QSizePolicy, QSpacerItem, QPushButton
import sys
class Widget(QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent=parent)
vbox = QVBoxLayout(self)
spacerItem = QSpacerItem(20, 10, QSizePolicy.Minimum, QSizePolicy.Expanding)
vbox.addItem(spacerItem)
hbox = QHBoxLayout()
spacerItem1 = QSpacerItem(10, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
hbox.addItem(spacerItem1)
btn = QPushButton("Quit", self)
btn.clicked.connect(self.close)
hbox.addWidget(btn)
vbox.addLayout(hbox)
self.setGeometry(300, 300, 300, 250)
self.setWindowTitle("Rocket Packet Preview")
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec())
对于第二个问题:您必须使用QSpacerItem
,QVBoxLayout
,QHBoxLayout
来组织这些项目。 QMainWindow
已加载默认小部件,如QStatusBar
,QDockWidget
等。因此setCentralWidget()
函数用于放置主要小部件。
示例:
from PyQt5.QtWidgets import QWidget, QSpacerItem, QSizePolicy, QTextEdit, QApplication, QVBoxLayout, QHBoxLayout, QPushButton
import sys
class Widget(QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent=parent)
vbox = QVBoxLayout(self)
self.textEdit = QTextEdit(self)
vbox.addWidget(self.textEdit)
hbox = QHBoxLayout()
spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
hbox.addItem(spacerItem)
save_btn = QPushButton("Save", self)
hbox.addWidget(save_btn)
vbox.addLayout(hbox)
self.setGeometry(300, 300, 300, 250)
self.setWindowTitle("Rocket Packet Preview")
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec())