2017-07-27 16 views
0

私はGUI開発が初めてで、pyqt5をPythonで使用する方法を学びたいと考えています。 以下は、私が取り組んでいるサンプルコードです。ウィンドウの右側にチェックボックス、コンボボックス、ラジオボタンがあるウィンドウが必要です。 QtWidgetオブジェクトの詳細はコード内にあります。ウィジェットの位置とウィンドウのサイズ

from PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy, QWidget, QPushButton, QComboBox, QRadioButton, QVBoxLayout, QCheckBox 
from PyQt5.QtGui import QIcon 

class App(QMainWindow): 

    def __init__(self): 
     super().__init__() 
     self.left = 0 
     self.top = 500 
     self.title = 'Chip2 Torque Data' 
     self.width = 500 
     self.height =500 
     self.initUI() 

    def initUI(self): 
     self.setWindowTitle(self.title) 
     self.setGeometry(self.left, self.top, self.width, self.height) 

     xselect=QRadioButton("X",self) 
     xselect.setChecked(True) 

     xselect.move(340,400) 
     zselect=QRadioButton("Z",self) 
     zselect.move(380,400) 
     sselect=QRadioButton("SP1",self) 
     sselect.move(420,400) 
     pass_list=QComboBox(self) 
     pass_list.addItems(sheets_idealcut) 
     pass_list.move(340,300) 
     rawdata_check=QCheckBox("Raw Data",self) 
     rawdata_check.setChecked(True) 
     rawdata_check.move(340,200) 
     mvgavg_check=QCheckBox("Moving average",self) 
     mvgavg_check.setChecked(True) 
     mvgavg_check.move(380,200) 
     mvgstd_check=QCheckBox("Moving stdev",self) 
     mvgstd_check.setChecked(True) 
     mvgstd_check.move(420,200) 
     self.show() 
if __name__ == '__main__': 
  sheets_idealcut=['pass2','pass3','pass4','pass5'] 

    app = QApplication.instance() 
    if app is None: 
     app = QApplication(sys.argv) 
    else: 
     print('QApplication instance already exists: %s' % str(app)) 
    ex = App() 
    #ex.show() 
    app.exec_() 

以下はコードの出力です。 (重複チェックボックス名を無視してください。私は後でそれを修正しようとする。)

enter image description here

私の問題は、私はこのウィンドウを最大化するとき、QtWidgetオブジェクト(QComboBoxQRadioButtonQCheckBoxが)自分の位置を再調整していないです新しいウィンドウサイズで
enter image description here

したがって、自動的にウィジェットの位置を変更するには、どの方法を使用する必要がありますか?

私はそれを見つけましたが、何か役に立つものが見つかりませんでした。

助けてください。

+0

あなたは[レイアウト]にウィジェットを追加する必要があります(https://doc.qt.io/qt-5/layout.html ) – user3419537

+0

私はレイアウトについて知っていましたが、レイアウトがウィンドウの右側になるようにQMainwindow内のレイアウトの位置を調整する方法を理解できませんでした。 – Kanmani

答えて

1

ダイナミックサイジングにはレイアウトを使用する必要があります。さまざまなレイアウトがたくさんあります。この例で使用されるレイアウトは最も基本的なタイプです。私はまた、 "App"の親をQDialogに変更しました。彼らは扱いが簡単です。ここで

は、レイアウトを使用して、あなたのアプリケーションの一例です:

import sys 
from PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy, QWidget, QPushButton, QComboBox, QRadioButton, \ 
QVBoxLayout, QCheckBox, QHBoxLayout, QGroupBox, QDialog 
from PyQt5.QtGui import QIcon 

class App(QDialog): 

    def __init__(self): 
     super().__init__() 
     self.left = 0 
     self.top = 500 
     self.title = 'Chip2 Torque Data' 
     self.width = 500 
     self.height = 500 
     self.initUI() 

    def initUI(self): 
     self.setWindowTitle(self.title) 
     self.setGeometry(self.left, self.top, self.width, self.height) 

     self.main_layout = QVBoxLayout() 

     xselect=QRadioButton("X",self) 
     xselect.setChecked(True) 
     # xselect.move(340,400) 
     self.main_layout.addWidget(xselect) 

     zselect=QRadioButton("Z",self) 
     # zselect.move(380,400) 
     self.main_layout.addWidget(zselect) 

     sselect=QRadioButton("SP1",self) 
     # sselect.move(420,400) 
     self.main_layout.addWidget(sselect) 



     pass_list=QComboBox(self) 
     pass_list.addItems(sheets_idealcut) 
     self.main_layout.addWidget(pass_list) 
     #pass_list.move(340,300) 
     rawdata_check=QCheckBox("Raw Data",self) 
     rawdata_check.setChecked(True) 
     self.main_layout.addWidget(rawdata_check) 
     #rawdata_check.move(340,200) 
     mvgavg_check=QCheckBox("Moving average",self) 
     mvgavg_check.setChecked(True) 
     #mvgavg_check.move(380,200) 
     mvgstd_check=QCheckBox("Moving stdev",self) 
     mvgstd_check.setChecked(True) 
     #mvgstd_check.move(420,200) 

     self.check_group = QHBoxLayout() 
     self.check_group.addWidget(mvgavg_check) 
     self.check_group.addWidget(mvgstd_check) 
     self.check_group.stretch(1) 

     self.main_layout.addLayout(self.check_group) 
     self.setLayout(self.main_layout) 
     self.show() 

if __name__ == '__main__': 
    sheets_idealcut=['pass2','pass3','pass4','pass5'] 

    app = QApplication.instance() 
    if app is None: 
     app = QApplication(sys.argv) 
    else: 
     print('QApplication instance already exists: %s' % str(app)) 
    ex = App() 
    #ex.show() 
    app.exec_() 
1

move(x,y)を使用しており、ウィジェットを特定の固定位置に設定しています。したがって、ウィンドウを最大化するために呼び出される関数を記述し、それに従ってウィジェットを再配置することができます。

もう1つの自動化された方法は、ボックスレイアウトを使用することです。​​とQtGui.QVBoxLayoutは、ウィジェットを水平または垂直に並べる基本レイアウトクラスです。あなたの写真からは、ウィジェットの最終的な位置を正確に知ることができないので、私はあなたが望むと思うように説明しようとします。

要素の各行は、次のようにHBoxのに割り当てることができます:あなたは、ウィジェットが自動にウィンドウの右側に再配置する必要があるウィンドウのサイズを変更する場合は

hbox = QtGui.QHBoxLayout() 
hbox.addStretch(1) 
hbox.addWidget(rawdata_check) 
hbox.addWidget(mvgavg_check) 
hbox.addWidget(mvgstd_check) 

。 QtDesignerは、すべての要素を整理するのに役立ちます。

関連する問題