2017-09-28 115 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