2017-05-30 9 views
0

私はPyQtレイアウト用のデザインを作成し、これを手動で実現しようとしていますが、QT Creatorの後に.uiファイルからpythonコードを生成する方法については、私は手動で学びたいと思っています。ここに私のソースコードがあります、私はグループボックスにすべての必要な部分を分割した、私はそれらを正しく見つける方法を知らない。レイアウトの部分が違うPyQt5

次に、チェックボックス「詳細」がオフのときに、グループボックス「秘密」を非表示にすることはできますか?私はそのようなチュートリアルは見つけていません。

私の希望レイアウト

import sys 
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton, QGridLayout, QCheckBox, QLabel, QGroupBox, QSpinBox, QVBoxLayout, QHBoxLayout, QGridLayout, QProgressBar 
from PyQt5.Qt import QIcon 

class Example(QWidget): 

def __init__(self): 
    super().__init__() 
    self.initUI() 

def initUI(self): 

    self.setWindowIcon(QIcon('icon.png')) 
    self.setFixedSize(400,200) 
    self.setWindowTitle('My app') 

    #self.statusBar().showMessage('ready') 

    groupBox1 = QGroupBox('Config') 
    vBox1 = QVBoxLayout(self) 

    readFile = QPushButton('Read File') 
    decodeFile = QPushButton('Decode') 
    chBox = QCheckBox('Advanced') 

    vBox1.addWidget(readFile) 
    vBox1.addWidget(decodeFile) 
    vBox1.addWidget(chBox) 
    groupBox1.setLayout(vBox1) 

    groupBox2 = QGroupBox('Secret') 
    gLayout = QGridLayout(self) 

    label1 = QLabel('Label 1') 
    label2 = QLabel('Label 2') 

    edit2 = QSpinBox() 
    edit3 = QSpinBox() 

    gLayout.addWidget(label1, 0, 0)  
    gLayout.addWidget(label2, 1, 0) 
    gLayout.addWidget(edit2, 0, 1) 
    gLayout.addWidget(edit3, 1, 1) 

    groupBox2.setLayout(gLayout) 

    groupBox3 = QGroupBox('Progress') 
    vBox2 = QVBoxLayout(self) 

    pBar = QProgressBar() 

    vBox2.addWidget(pBar) 
    groupBox3.setLayout(vBox2) 

    hbox1 = QHBoxLayout(self) 
    hbox1.addWidget(groupBox1) 
    hbox1.addWidget(groupBox2) 
    hbox1.addWidget(groupBox3) 
    self.setLayout(hbox1) 
    self.resize(480, 320); 
    self.show() 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 

私はまた、ソースコードについての批評をお願い申し上げます。

答えて

1

図のサンプルとしてウィジェットを対応させるには、QVBoxLayout、QHBoxLayout、QFormLayoutの組み合わせを使用する必要があります。常に比例すると占有スペースのために、私たちはストレッチを使用する必要があります。

{your layout}.addWidget(QWidget * widget, int stretch = 0, Qt::Alignment alignment = 0) 
{your layout}.addLayout(QLayout * layout, int stretch = 0) 

この要因は、ウィジェットまたは親のレイアウト内のサブレイアウトに与えられる重みです。

QGroupBoxを非表示にするには、hide関数を使用する必要があります。表示するには、stateChangedQCheckBoxで制御する必要があります。

def onSecret(s): 
    if s == Qt.Checked: 
     groupBox2.show() 
    else: 
     groupBox2.hide() 

onSecret(chBox.checkState()) 
chBox.stateChanged.connect(onSecret) 

グループボックスの秘密は、グループボックスの進捗状況を非表示にするために起こっているように、我々はQSpacerItemを使用する部分にそれをプッシュし、真ん中に滞在します。

スクリーンショット:

enter image description here

enter image description here

完全なコード:

import sys 
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton, QFormLayout, QCheckBox, QLabel, QGroupBox, QSpinBox, QVBoxLayout, QHBoxLayout, QProgressBar, QSpacerItem, QSizePolicy 
from PyQt5.QtCore import Qt 

class Example(QWidget): 
    def __init__(self, parent=None): 
     QWidget.__init__(self, parent=parent) 
     self.initUI() 

    def initUI(self): 
     self.setFixedSize(400,200) 
     self.setWindowTitle('My app') 

     hbox = QHBoxLayout(self) 
     groupBox1 = QGroupBox("Config", self) 
     vbox = QVBoxLayout(groupBox1) 
     readFile = QPushButton("Read File", groupBox1) 
     vbox.addWidget(readFile, 1) 

     decodeFile = QPushButton("Decode", groupBox1) 
     vbox.addWidget(decodeFile, 1) 

     chBox = QCheckBox("Advanced", groupBox1) 
     vbox.addWidget(chBox, 1) 


     hbox.addWidget(groupBox1, 1) 

     vbox2 = QVBoxLayout() 
     groupBox2 = QGroupBox("Secret", self) 
     vbox3 = QVBoxLayout(groupBox2) 
     flay = QFormLayout() 

     label1 = QLabel("Label 1", groupBox2) 
     edit2 = QSpinBox(groupBox2) 

     flay.addRow(label1, edit2) 

     label2 = QLabel("Label 2", groupBox2) 
     edit3 = QSpinBox(groupBox2) 

     flay.addRow(label2, edit3) 

     vbox3.addLayout(flay, 1) 

     vbox2.addWidget(groupBox2) 

     groupBox3 = QGroupBox("Progress", self) 

     vbox4 = QVBoxLayout(groupBox3) 

     pBar = QProgressBar(groupBox3) 

     pBar.setValue(21) 
     vbox4.addWidget(pBar) 
     vbox2.addWidget(groupBox3) 
     spacerItem = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) 
     vbox2.addItem(spacerItem) 

     hbox.addLayout(vbox2, 1) 

     def onSecret(s): 
      if s == Qt.Checked: 
       groupBox2.show() 
      else: 
       groupBox2.hide() 

     onSecret(chBox.checkState()) 
     chBox.stateChanged.connect(onSecret) 


if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    ex = Example() 
    ex.show() 
    sys.exit(app.exec_()) 
関連する問題