问题与QTextEdit,QPushButton一起使用QMainWindow,另一个使用QWidget

时间:2017-03-21 17:56:42

标签: python python-3.x pyqt pyqt5

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出现了。无论如何要解决这个问题吗?

1 个答案:

答案 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())

enter image description here

对于第二个问题:您必须使用QSpacerItemQVBoxLayoutQHBoxLayout来组织这些项目。 QMainWindow已加载默认小部件,如QStatusBarQDockWidget等。因此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())

enter image description here