示例一个在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();
}