2017-03-21 5 views
0

QMainWindowクラスにQPushButtonを適切に配置できないものがありますか?QTextEdit、QPushButtonの問題QMainWindowとQWidgetとの関係

QPushButton「Quit」は間違った場所にあり、通常よりも少し大きすぎます。

私のコード私はQWidgetからクラスを継承を作る代わりにQMainWindowプッシュボタンが適切に配置されますが、私は継承した場合、私はいくつかの他の機能を使用できない場合

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。

もう1つの問題は、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このコードを使用する場合、私はそれで

何かを編集することはできませんようです。 QMainWindowを持つ親クラスのQWidgetを変更すると、この次の行を追加することで

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(自己)' を追加する理由として興味があります。しかしにおける「ウィジェット」で何も ' 'のhbox = QHLayout() に自己を含んでいませんでした'スーパー(ウィジェット、自己)'? – Hawoona

+0

'layout = {レイアウトクラス}({親})'は '{親} .setLayout(レイアウト) 'に似ています – eyllanesc

+0

あなたが継承するとき、あなたは父親が何をしているのかを初期化する必要があります。 – eyllanesc