2017-09-28 117 views
0

我想在其中包含很多複選框和按鈕小部件的groupbox放到PyQt4的GridLayout中。另外,我希望在groupBox外部有一個按鈕(但它的佈局相同),只要選中了複選框,就可以通過單擊它來運行某些功能。如何將GroupBox放入GridLayout中? PyQt4

此外,我想有一個滾動條(也許QScrollArea會做?)到groupbox,因爲我可能會在未來添加更多的按鈕。

有一點需要注意的是,這個佈局/窗口中有多個選項卡(我不確定這個術語)。所有groupbox /按鈕/ etc應該全部在Tab 1中。

我已閱讀了幾篇文章,它們都有相同的情況,但都沒有提供正確的答案......如果有人知道如何解決問題,請讓我知道。不勝感激!

編輯:我的代碼如下。正如你所看到的,我在底部有一個組框。我想要做的就是將groupbox放在最上面的所有複選框/按鈕,除了在groupbox外部的底部的Run按鈕。而這些都應該只發生在標籤1.

import PyQt4 

from PyQt4 import QtGui, QtCore 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

import os, sys 

class Page1 (QTabWidget): 

    def __init__(self, parent=None): 
     super(Page1, self).__init__(parent) 

     self.tab1 = QWidget() 
     self.tab2 = QWidget() 
     self.tab3 = QWidget() 
     self.addTab(self.tab1, "Tab1") 
     self.addTab(self.tab2, "Tab2") 
     self.addTab(self.tab3, "Tab3") 
     self.tab1_initUI() 
     self.tab2_initUI() 
     self.tab3_initUI() 

    def tab1_initUI(self): 

     btn1a = QPushButton('A1') 
     btn1a.resize(btn1a.sizeHint()) 
     btn1b = QPushButton('A2') 
     btn1b.resize(btn1b.sizeHint()) 

     btn2a = QPushButton('B1') 
     btn2a.resize(btn2a.sizeHint()) 
     btn2b = QPushButton('B2') 
     btn2b.resize(btn2b.sizeHint()) 

     btn3a = QPushButton('C1') 
     btn3a.resize(btn3a.sizeHint()) 
     btn3b = QPushButton('C2') 
     btn3b.resize(btn3b.sizeHint()) 

     btn4a = QPushButton('D1', self) 
     btn4a.resize(btn4a.sizeHint()) 
     btn4b =QPushButton('D2', self) 
     btn4b.resize(btn4b.sizeHint()) 

     btn5a = QPushButton('E1', self) 
     btn5a.resize(btn5a.sizeHint())  
     btn5b = QPushButton('E2', self) 
     btn5b.resize(btn5b.sizeHint()) 

     self.checkBox1 = QtGui.QCheckBox('1', self) 
     self.checkBox2 = QtGui.QCheckBox('2', self) 
     self.checkBox3 = QtGui.QCheckBox('3', self) 
     self.checkBox4 = QtGui.QCheckBox('4', self) 
     self.checkBox5 = QtGui.QCheckBox('5', self) 

     btnRun = QPushButton('Run', self) 
     btnRun.resize(btnRun.sizeHint()) 

     grid = QtGui.QGridLayout() 

     grid.addWidget(self.checkBox1, 1, 0) 
     grid.addWidget(btn1a, 1, 1) 
     grid.addWidget(btn1b, 1, 2) 
     grid.addWidget(self.checkBox2, 2, 0) 
     grid.addWidget(btn2a, 2, 1) 
     grid.addWidget(btn2b, 2, 2) 
     grid.addWidget(self.checkBox3, 3, 0) 
     grid.addWidget(btn3a, 3, 1) 
     grid.addWidget(btn3b, 3, 2) 
     grid.addWidget(self.checkBox4, 4, 0) 
     grid.addWidget(btn4a, 4, 1) 
     grid.addWidget(btn4b, 4, 2) 
     grid.addWidget(self.checkBox5, 5, 0) 
     grid.addWidget(btn5a, 5, 1) 
     grid.addWidget(btn5b, 5, 2) 
     grid.addWidget(btnRun, 6, 0, 1, 3) 

     groupbox = QtGui.QGroupBox(self) 

     hbox = QtGui.QHBoxLayout() 
     grid2= QtGui.QGridLayout() 
     hbox.addLayout(grid2) 


     groupbox.setLayout(hbox) 

     scroll = QtGui.QScrollArea() 
     scroll.setWidget(groupbox) 
     scroll.setWidgetResizable(True) 

     grid.addWidget(groupbox,7,0,1,3) 
     self.tab1.setLayout(grid) 

    def tab2_initUI(self): 
     grid = QtGui.QGridLayout() 
     self.tab2.setLayout(grid) 

    def tab3_initUI(self): 
     grid = QtGui.QGridLayout() 
     self.tab3.setLayout(grid) 

class MainWindow(QMainWindow): 

    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 

     self.setGeometry(300, 200, 600, 370) 
     self.startPage1() 


    def startPage1(self): 
     x = Page1(self) 
     self.setWindowTitle("Auto Benchmark") 
     self.setCentralWidget(x) 
     self.show() 

def main(): 
    app = QApplication(sys.argv) 

    main = MainWindow() 
    main.show() 

    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

enter image description here

+0

我不明白,你可以更好地解釋你想要什麼或放置一個圖像,顯示你想要的東西。 – eyllanesc

+0

@eyllanesc請看我上面的'編輯'評論 – ryan9025

+0

我想我明白了,但是給我們一個你想要的圖像是件很棒的事情。 :D – eyllanesc

回答

0

它始終是最好劃分任務,在這種情況下,我們將創建類Widget,我們將會把按鈕和複選框。

class Widget(QWidget): 
    def __init__(self, parent=None): 
     QWidget.__init__(self, parent) 
     self.setLayout(QGridLayout()) 
     for i in range(20): 
      letter = chr(ord('a') + i) 
      checkBox = QtGui.QCheckBox('{}'.format(i+1), self) 
      self.layout().addWidget(checkBox, i, 0) 

      btna = QPushButton("{}1".format(letter), self) 
      btnb = QPushButton("{}2".format(letter), self) 

      self.layout().addWidget(btna, i, 1) 
      self.layout().addWidget(btnb, i, 2) 

二是實現包含WidgetQScrollArea和運行按鈕插件的類Tab1

class Tab1(QWidget): 
    def __init__(self, parent=None): 
     QWidget.__init__(self, parent) 
     self.setLayout(QGridLayout()) 

     self.group = Widget(self) 
     scroll = QtGui.QScrollArea(self) 
     scroll.setWidget(self.group) 
     scroll.setWidgetResizable(True) 

     self.layout().addWidget(scroll) 
     self.runBtn = QPushButton("Run", self) 
     self.layout().addWidget(self.runBtn) 

然後將按鈕添加到QTabWidget(你不再需要的功能tab1_initUI()

class Page1(QTabWidget): 
    def __init__(self, parent=None): 
     super(Page1, self).__init__(parent) 
     self.tab1 = Tab1() 
     self.tab2 = QWidget() 
     self.tab3 = QWidget() 
     self.addTab(self.tab1, "Tab1") 
     self.addTab(self.tab2, "Tab2") 
     [...] 

屏幕截圖:

enter image description here

完整的代碼是在下面的link