实战PyQt5: 047-分组框控件QGroupBox

QGroupBox简介

分组框控件QGroupBox为对界面中的控件分组控制提供了支持,分组框通常带有一个边框和一个标题栏,同时也可以提供键盘快捷键,作为容器部件来使用,在其中可以布置各种窗口部件。分组框的标题通常在上方显示,其位置可以设置为靠左、居中、靠右、自动调整这几种方式之一。布局时可以用作一组控件的容器,但需要注意的是,内部必须使用布局控件(如QBoxLayout)进行布局。

QGroupBox不仅可以将布局分成一个个区域显示,而且还能起到隔绝的作用,在PyQt布局中,通常一个界面中的所有QRadioBox只能选中其中一个,但是将QRadioBox分开布局到QGroupBox中去的话,那么每一个QGroupBox中的QRadioBox就是独立的一组,在其中只能选中一个QRadioBox,界面中如果有多个QGroupBox的话,就可以在同时在每个QGroupBox中各选中一个QRadioBox。

QGroupBox常用方法:

  • setTitle(): 设置标题栏文本;
  • setFlat(): 设置扁平外观,无边框;
  • setCheckbale(): 设置成可选状态;
  • setChecked(): 设置为选中;
  • isChecked(): 是否选中;
  • isFlat(): 是否是扁平外观;
  • isCheckable(): 是否是可选状态;
  • title(): 获得标题文本;

QGroupBox常用信号:

  • clicked(): 点击QGroupBox控件时,发射该信号;
  • toggled(): 当QGroupBox的状态发生了改变时,发射该信息。

注: Qt中 clicked 和 toggled 之间的区别:

共同点是:当点击按钮时,状态信号都会被发送。不同点是:toggled要比clicked更容易触发。clicked()有的toggled有,而toggled有的,clicked()却不一定有!

QGroupBox类继承关系:

实战PyQt5: 047-分组框控件QGroupBox

 

测试QGroupBox

创建qgroupbox.py,使用网格布局,添加四个QGroupBox,演示QGroupBox外观及常用方法,完整代码如下:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QApplication, QWidget, QGroupBox, QMenu, QAction,
                            QPushButton, QCheckBox, QRadioButton,
                            QVBoxLayout, QGridLayout)
 
class DemoGroupBox(QWidget):
    def __init__(self, parent=None):
        super(DemoGroupBox, self).__init__(parent)       
        
        # 设置窗口标题
        self.setWindowTitle('实战PyQt5: QGroupBox Demo!')      
        # 设置窗口大小
        self.resize(480, 360)
      
        self.initUi()
        
    def initUi(self):
        gLayout = QGridLayout(self)
        
        gLayout.addWidget(self.createFirstExclusiveGroup(), 0, 0)
        gLayout.addWidget(self.createPushButtonGroup(), 1, 1)
        gLayout.addWidget(self.createNonExclusiveGroup(), 1, 0)
        gLayout.addWidget(self.createSecondExclusiveGroup(), 0, 1)
        
        self.setLayout(gLayout)
        
    def createFirstExclusiveGroup(self):
        groupBox = QGroupBox('Exclusive Radio Buttons', self)
        
        radio1 = QRadioButton('&Radio Button 1', self)
        radio1.setChecked(True)
        radio2 = QRadioButton('R&adio button 2', self)
        radio3 = QRadioButton('Ra&dio button 3', self)
        
        vLayout = QVBoxLayout(groupBox)
        vLayout.addWidget(radio1)
        vLayout.addWidget(radio2)
        vLayout.addWidget(radio3)
        vLayout.addStretch(1)
        
        groupBox.setLayout(vLayout)
        
        return groupBox
    
    def createSecondExclusiveGroup(self):
        groupBox = QGroupBox('E&xclusive Radio Buttons', self)
        groupBox.setCheckable(True)
        groupBox.setChecked(True)
        
        radio1 = QRadioButton('Rad&io button1', self)
        radio1.setChecked(True)
        radio2 = QRadioButton('Radi&o button2', self)
        radio3 = QRadioButton('Radio &button3', self)
        chkBox = QCheckBox('Ind&ependent checkbox', self)
        
        vLayout = QVBoxLayout(groupBox)
        vLayout.addWidget(radio1)
        vLayout.addWidget(radio2)
        vLayout.addWidget(radio3)
        vLayout.addWidget(chkBox)
        vLayout.addStretch(1)
        
        groupBox.setLayout(vLayout)
        
        return groupBox
    
    def createNonExclusiveGroup(self):
        groupBox = QGroupBox('No-Exclusive Checkboxes', self)
        groupBox.setFlat(True)
        
        chBox1 = QCheckBox('&Checkbox 1')
        chBox2 = QCheckBox('C&heckbox 2')
        chBox2.setChecked(True)
        tristateBox = QCheckBox('Tri-&state buttton')
        tristateBox.setTristate(True)
        tristateBox.setCheckState(Qt.PartiallyChecked)
        
        vLayout = QVBoxLayout(groupBox)
        vLayout.addWidget(chBox1)
        vLayout.addWidget(chBox2)
        vLayout.addWidget(tristateBox)
        vLayout.addStretch(1)
        
        groupBox.setLayout(vLayout)
        
        return groupBox
    
    def createPushButtonGroup(self):
        groupBox = QGroupBox('&Push Button', self)
        groupBox.setChecked(True)
        groupBox.setChecked(True)
        
        pushButton = QPushButton('&Normal Button', self)
        toggleButton = QPushButton('&Toggle Button', self)
        toggleButton.setCheckable(True)
        toggleButton.setChecked(True)
        
        flatButton = QPushButton('&Flat Button')
        flatButton.setFlat(True)
        
        popupButton = QPushButton('Pop&up Button')
        menu = QMenu(self)
        menu.addAction('&First Item')
        menu.addAction('&Second Item')
        menu.addAction('Third Item')
        menu.addAction('F&ourth Item')
        popupButton.setMenu(menu)
 
        subMenu = menu.addMenu('Submenu')
        subMenu.addAction('Item 1')
        subMenu.addAction('Item 2')
        subMenu.addAction('Item 3')
        
        vLayout = QVBoxLayout(groupBox)
        vLayout.addWidget(pushButton)
        vLayout.addWidget(toggleButton)
        vLayout.addWidget(flatButton)
        vLayout.addWidget(popupButton)
        vLayout.addStretch()
        
        groupBox.setLayout(vLayout)
        
        return groupBox
     
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = DemoGroupBox()
    window.show()
    sys.exit(app.exec())

实战PyQt5: 047-分组框控件QGroupBox

测试QGroupBox

本文知识点

  • QGroupBox的分作隔离效果;
  • QGroupBox设置可选状态的作用域;
  • PyQt中,clicked信号和toggled信号的相同和不同点;
  • 为QMenu菜单添加子菜单;
  • 为QPushButton按钮设置菜单。

前一篇:  实战PyQt5: 046-框架外形控件QFrame

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值