2017-03-21 164 views
0

QMainWindow類中有什麼東西不會允許正確放置一個QPushButton我想要它嗎?問題與QTextEdit,QPushButton一個與QMainWindow和另一個與QWidget一起工作

這裏的QPushButton「退出」是在錯誤的地方,比平常有點大。

我的代碼是

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的按鈕將被妥善安置,但如果我繼承我不能使用一些其他的功能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") 

注意的QPushbutton,這也是錯位的,我不能編輯任何

。通過改變父類QWidget的用的QMainWindow和添加此以下行

self.setCentralWidget(self.textEdit) 

文本編輯器的問題消失了,我可以編輯。但是然後我的QPushButton出現。無論如何要解決這個問題嗎?

回答

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

+0

真棒!謝謝您的幫助。我也很好奇,爲什麼你有時會添加自例如 'VBOX = QVboxLayout(個體經營)' ,但不包括自行在 '橫向盒= QHLayout()' 還什麼是「微件」,在'超級(Widget,self)'? – Hawoona

+0

'layout = {layout class}({parent})'類似於{parent} .setLayout(layout)' – eyllanesc

+0

當你繼承時,你必須初始化父親所做的事情。 '超級(class .__ name__,self).__ init __(* args,** kwargs)' – eyllanesc

相關問題