QT动态创建单项选择

文章详细描述了如何在Qt的QWidget界面中使用QVector存储问题和选项,通过for循环动态创建单选按钮,并利用QButtonGroup确保互斥性,最后通过信号槽连接捕获用户的选择。
摘要由CSDN通过智能技术生成

示例一个在QWidget界面内根据QVector容器中的值动态创建单选题的代码:

1.数据结构

        (1)将信息拆分为:问题 和 选项 两个部分存储在结构体中,然后使用QVector存放结构体。

        (2)radiobuttonlist 指向单选按钮的指针,方便建立点击事件查找用户选择的值

struct question{
        QString questiontext;    //题目内容
        QStringList questionanswerlist;    //各个选项内容
        QList<QRadioButton *> radiobuttonlist;    //单选按钮指针
    };
    QVector<question> questions;    //题库,存放所有题目信息

2.创建过程

        (1)使用for()循环并且通过questions.size()函数就可以遍历到所有的题目,使用questions[i].questionanswerlist.size()可以访问到某个题目的所有选项的内容。

        (2)创建QRadioButton单选按钮时,使用QButtonGroup将一个题目的所有选项对应的单选按钮放入一个组中,保证了每一个问题的选项都是互斥的。

        (3)因为是用来for()循环创建的QRadioButton按钮,在创建完之后无法访问其中的某一个QRadioButton按钮。所以在创建QRadioButton指针变量之后也存储指针的值,并将它放在结构体中,方便之后管理访问以及创建信号槽连接。

//动态创建组件
    for(int i=0; i<questions.size();i++)    //遍历每一个题目
    {
        //添加题目名
        QLabel *label = new QLabel();
        //设置题目内容
        label->setText(questions[i].questiontext);
        //添加题目
        layout->addWidget(label);
        // 创建空的 radiobuttonlist
        questions[i].radiobuttonlist = QList<QRadioButton *>();
        //创建选项组
        QButtonGroup *buttongroup = new QButtonGroup();
        //添加单选按钮
        for(int j=0;j<questions[i].questionanswerlist.size();j++)
        {
            QRadioButton *radiobutton = new QRadioButton();
            //设置选项内容
            radiobutton->setText(questions[i].questionanswerlist[j]);            //将选项指针添加到数据结构中
            questions[i].radiobuttonlist.append(radiobutton);
            //将按钮设置为同一组
            buttongroup->addButton(radiobutton);
            //添加选项
            layout->addWidget(radiobutton);
        }
    }
    setLayout(layout);

3.连接信号槽

        通过结构体中保存的QRadioButton指针就能够轻松访问到每一个选项对应的QRadioButton按钮了。

connect(button,&QPushButton::clicked,[&]{
        for(int i=0;i<questions.size();i++)    //遍历每一个问题
        {
            for(int j=0;j<questions[i].questionanswerlist.size();j++)    //为问题的所有选项创建信号槽连接
            {
                if(questions[i].radiobuttonlist[j]->isChecked())
                    qDebug() << "第" << i <<"题选择了" << questions[i].questionanswerlist[j];
            }
        }
    });

4.运行结果

5.完整代码

MainWidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include <QVBoxLayout>
#include <QRadioButton>
#include <QPushButton>
#include <QLabel>
#include <QDebug>
#include <QButtonGroup>
#include <QVector>
#include <QPair>
#include <QString>
#include <QStringList>


QT_BEGIN_NAMESPACE
namespace Ui { class MainWidget; }
QT_END_NAMESPACE

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = nullptr);
    ~MainWidget();

private:
    Ui::MainWidget *ui;
    struct question{
        QString questiontext;
        QStringList questionanswerlist;
        QList<QRadioButton *> radiobuttonlist;
    };
    QVector<question> questions;
};
#endif // MAINWIDGET_H

MainWidget.cpp

#include "mainwidget.h"
#include "ui_mainwidget.h"

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MainWidget)
{
    ui->setupUi(this);
   
    //创建数据结构
    questions.append({"1+1+?", {"1", "2", "3", "4"}});
    questions.append({"1+2=?", {"1", "2", "3", "4"}});
    questions.append({"1+3=?", {"1", "2", "3", "4"}});
    questions.append({"1+4=?", {"1", "2", "3", "5"}});
    //创建垂直布局
    QVBoxLayout *layout = new QVBoxLayout();
    qDebug() << "容器中有" << questions.size() << "个题目";

    //动态创建组件
    for(int i=0; i<questions.size();i++)    //遍历每一个题目
    {
        //添加题目名
        QLabel *label = new QLabel();
        //设置题目内容
        label->setText(questions[i].questiontext);
        //添加题目
        layout->addWidget(label);
        // 创建空的 radiobuttonlist
        questions[i].radiobuttonlist = QList<QRadioButton *>();
        //创建选项组
        QButtonGroup *buttongroup = new QButtonGroup();
        //添加单选按钮
        for(int j=0;j<questions[i].questionanswerlist.size();j++)
        {
            QRadioButton *radiobutton = new QRadioButton();
            //设置选项内容
            radiobutton->setText(questions[i].questionanswerlist[j]);            //将选项指针添加到数据结构中
            questions[i].radiobuttonlist.append(radiobutton);
            //将按钮设置为同一组
            buttongroup->addButton(radiobutton);
            //添加选项
            layout->addWidget(radiobutton);
        }
    }
    setLayout(layout);
    QPushButton *button = new QPushButton();
    button->setText("提交");
    layout->addWidget(button);
    qDebug() << "题库中有题目:\n" ;
    for(int n=0;n<questions.size();n++)
    {
        qDebug() << questions[n].questiontext;
        for(int m=0;m<questions[n].questionanswerlist.size();m++)
        {
            qDebug() << questions[n].questionanswerlist[m] << Qt::endl;
        }
    }
    //连接点击按钮事件,输出选择的选项
    connect(button,&QPushButton::clicked,[&]{
        for(int i=0;i<questions.size();i++)
        {
            for(int j=0;j<questions[i].questionanswerlist.size();j++)
            {
                if(questions[i].radiobuttonlist[j]->isChecked())
                    qDebug() << "第" << i <<"题选择了" << questions[i].questionanswerlist[j];
            }
        }
    });

}

MainWidget::~MainWidget()
{
    delete ui;
}

main.cpp

#include "mainwidget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWidget w;
    w.show();
    return a.exec();
}

       

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值