PyQt6第五章容器布局之5.1控件容器布局(5.1.2分组框:QGroupBox)

分组框:QGroupBox

GroupBox称为分组框控件,属于QGroupBox类,为其他控件提供分组容器,以便细分窗口的功能。把部分单选按钮加入其中,它们就形成一个组,该组中的单选按钮只能一个被选中。 GroupBox常用方法及说明如下:

setAlignment():设置对齐方式,有水平和垂直这两种。

setTitle():设置分组标题

setFlat():设置是否以扁平样式显示

【例5.2】采用QGroupBox将性别和专业分成2个单选分组,如下:

import sys  # 导入Python的sys模块,用于获取命令行参数和退出程序

from PyQt6.QtWidgets import QApplication, QWidget, QGroupBox, QRadioButton, QHBoxLayout, \
    QVBoxLayout  # 导入PyQt6库中的相关类,用于创建图形用户界面


class MyWidget(QWidget):  # 定义一个继承自QWidget的自定义类,用于创建窗口部件

    def __init__(self):  # 初始化方法,当创建MyWidget对象时调用
        super(MyWidget, self).__init__()  # 调用父类QWidget的初始化方法

        # 创建四个单选按钮,分别代表不同的专业选项
        self.rbJSJ = QRadioButton('计算机', self)  # 创建标签为“计算机”的单选按钮
        self.rbRJGC = QRadioButton('软件工程', self)  # 创建标签为“软件工程”的单选按钮
        self.rbTXGC = QRadioButton('通信工程', self)  # 创建标签为“通信工程”的单选按钮
        self.rbRGZN = QRadioButton('人工智能', self)  # 创建标签为“人工智能”的单选按钮

        # 将四个单选按钮添加到列表中
        self.list = [self.rbJSJ, self.rbRJGC, self.rbTXGC, self.rbRGZN]

        # 将每个单选按钮的clicked信号连接到rbListFunc槽函数
        [rb.clicked.connect(self.rbListFunc) for rb in self.list]

        # 创建两个单选按钮,分别代表性别选项
        self.rbNan = QRadioButton('男', self)  # 创建标签为“男”的单选按钮
        self.rbNv = QRadioButton('女', self)  # 创建标签为“女”的单选按钮

        # 将“女”单选按钮的toggled信号连接到rbNxxFunc槽函数
        self.rbNv.toggled.connect(self.rbNxxFunc)

        # 创建两个水平布局管理器
        self.hLayout1 = QHBoxLayout()  # 第一个水平布局
        self.hLayout2 = QHBoxLayout()  # 第二个水平布局

        # 创建垂直布局管理器
        self.vLayout = QVBoxLayout()  # 垂直布局

        # 初始化窗口部件的布局
        self.layout_init()

    def layout_init(self):
        # 将性别单选按钮添加到第一个水平布局中
        self.hLayout1.addWidget(self.rbNan)
        self.hLayout1.addWidget(self.rbNv)

        # 将专业单选按钮添加到第二个水平布局中
        self.hLayout2.addWidget(self.rbJSJ)
        self.hLayout2.addWidget(self.rbRJGC)
        self.hLayout2.addWidget(self.rbTXGC)
        self.hLayout2.addWidget(self.rbRGZN)

        # 创建两个组框,分别用于包含性别和专业单选按钮
        self.gBox1 = QGroupBox('性别', self)  # 性别组框
        self.gBox2 = QGroupBox('专业', self)  # 专业组框

        # 设置组框的布局
        self.gBox1.setLayout(self.hLayout1)  # 性别组框使用第一个水平布局
        self.gBox2.setLayout(self.hLayout2)  # 专业组框使用第二个水平布局

        # 将组框添加到垂直布局中
        self.vLayout.addWidget(self.gBox1)
        self.vLayout.addWidget(self.gBox2)

        # 默认选中“女”和“人工智能”单选按钮
        self.rbNv.setChecked(True)
        self.rbRGZN.setChecked(True)

        # 设置窗口部件的布局为垂直布局
        self.setLayout(self.vLayout)

    def rbListFunc(self):
        # 当任何一个专业单选按钮被点击时调用该函数
        for rb in self.list:
            if rb.isChecked():  # 检查哪个单选按钮被选中
                print(rb.text())  # 打印被选中单选按钮的标签

    def rbNxxFunc(self):
        # 当性别单选按钮的状态发生变化时调用该函数
        if self.rbNan.isChecked():  # 如果“男”单选按钮被选中
            print("男")
        else:  # 否则
            print("女")


if __name__ == '__main__':
    # 程序入口
    app = QApplication(sys.argv)  # 创建应用程序对象
    w = MyWidget()
    w.show()# 显示窗口部件  
    sys.exit(app.exec())# 进入应用程序的主事件循环,等待用户交互

在上面的两段代码中,我们主要看到的是一个基于PyQt6的图形用户界面(GUI)应用程序的布局和控件设置。以下是布局、控件和关键语句的详细解释:

布局(Layout)

  1. QHBoxLayout:水平布局管理器,用于将控件水平排列。在这个例子中,有两个QHBoxLayout实例,self.hLayout1用于性别单选按钮,self.hLayout2用于专业单选按钮。

  2. QVBoxLayout:垂直布局管理器,用于将控件垂直排列。self.vLayout是一个垂直布局,它将性别组框和专业组框垂直排列。

控件(Widgets)

  1. QWidget:所有用户界面对象的基类。在这里,MyWidget类继承自QWidget,用于创建自定义的窗口部件。

  2. QRadioButton:单选按钮控件。self.rbJSJself.rbRJGCself.rbTXGCself.rbRGZN是代表不同专业的单选按钮;self.rbNanself.rbNv是代表性别的单选按钮。

  3. QGroupBox:组框控件,用于将相关的控件组合在一起,并带有标题。self.gBox1self.gBox2分别是性别和专业组框。

关键语句

  1. 信号与槽的连接
    • rb.clicked.connect(self.rbListFunc) for rb in self.list:将每个专业单选按钮的clicked信号连接到rbListFunc槽函数。当任何一个专业单选按钮被点击时,rbListFunc将被调用。
    • self.rbNv.toggled.connect(self.rbNxxFunc):将性别单选按钮“女”的toggled信号连接到rbNxxFunc槽函数。当这个单选按钮的状态发生变化时(被选中或取消选中),rbNxxFunc将被调用。
  2. 布局设置
    • self.gBox1.setLayout(self.hLayout1) 和 self.gBox2.setLayout(self.hLayout2):将水平布局设置到性别和专业组框中。
    • self.vLayout.addWidget(self.gBox1) 和 self.vLayout.addWidget(self.gBox2):将组框添加到垂直布局中。
    • self.setLayout(self.vLayout):设置MyWidget的布局为垂直布局。
  3. 控件的初始状态
    • self.rbNv.setChecked(True) 和 self.rbRGZN.setChecked(True):默认选中“女”和“人工智能”单选按钮。
  4. 窗口部件的显示
    • w.show():显示MyWidget实例化的窗口部件。
  5. 应用程序的执行
    • app = QApplication(sys.argv):创建应用程序对象。
    • sys.exit(app.exec()):启动应用程序的主事件循环,并在应用程序结束时退出程序。

这些关键语句共同协作,创建了一个简单的图形用户界面,其中包含两组单选按钮,分别用于选择性别和专业,并处理用户的交互事件。

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Qt中,你可以使用拖放操作来将按钮(或其他控件)拖动到容器控件中。下面是一个简单的示例,展示如何实现这个功能: 1. 首先,在容器控件的类中,你需要启用拖放操作。这可以通过在构造函数中设置setAcceptDrops(true)来完成。 ```cpp ContainerWidget::ContainerWidget(QWidget *parent) : QWidget(parent) { setAcceptDrops(true); } ``` 2. 然后,在按钮(或其他控件)的类中,你需要实现拖放事件。这包括mousePressEvent、mouseMoveEvent和drag事件。 ```cpp ButtonWidget::ButtonWidget(QWidget *parent) : QPushButton(parent) { // 设置按钮可拖动 setDragEnabled(true); } void ButtonWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { // 鼠标左键按下时,开始拖动按钮 QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setText(text()); // 设置拖动数据为按钮的文本 drag->setMimeData(mimeData); drag->exec(Qt::MoveAction); } } void ButtonWidget::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { // 鼠标左键按下并移动时,移动按钮 QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setText(text()); // 设置拖动数据为按钮的文本 drag->setMimeData(mimeData); drag->exec(Qt::MoveAction); } } ``` 3. 最后,在容器控件的类中,你需要实现拖放事件。这包括dragEnterEvent和dropEvent。 ```cpp void ContainerWidget::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasText()) { event->acceptProposedAction(); } } void ContainerWidget::dropEvent(QDropEvent *event) { if (event->mimeData()->hasText()) { QString buttonText = event->mimeData()->text(); ButtonWidget *button = new ButtonWidget(this); button->setText(buttonText); button->move(event->pos()); button->show(); event->acceptProposedAction(); } } ``` 现在,你可以创建一个容器控件和多个按钮控件,并将这些按钮拖动到容器控件中。按钮会在容器中显示,并且你可以随意移动它们。 希望这可以帮助到你!如果有任何进一步的问题,请随时问我。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值