QT学习:根据数据库的内容动态添加Button

it2025-10-10  9

 

如果需要对数据库操作,必须在.pro文件中加入:

QT +=sql

 

代码如下:

#include <QString> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> #include <QSqlDriver> #include <QDateTime> #include <QDebug> #include <QPushButton> #include <QVBoxLayout> #include <QToolBox>

#include "mainwindow.h" #include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :     QMainWindow(parent),     ui(new Ui::MainWindow) {     ui->setupUi(this);     //下面进行数据库的设置    int i;    QVBoxLayout *layInstruct = new QVBoxLayout;//ToolBox的Layout    QToolBox *tbInstruct=new QToolBox();    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  //使用sqlite数据库驱动    db.setDatabaseName("G:\\SerialInstruct.db3");  //我们之前建立的数据库    if (db.open())//尝试连接数据库    {  //已经成功连上数据库        QSqlQuery query;  //新建一个查询的实例        if (query.exec("select * from UnitData"))   //尝试列出 student 表的所有记录        {  //本次查询成功            int numRows = 0;  //询问数据库驱动,是否驱动含有某种特性            if (db.driver()->hasFeature(QSqlDriver::QuerySize))                {                    numRows = query.size();  //如果支持结果影响的行数,那么直接记录下来                }            else            {                query.last(); //否则定位到结果最后,qt 文档说,这个方法非常慢                numRows = query.at() + 1;                query.seek(-1);            }            QString name, age;            i=0;            while(query.next())            {  //定位结果到下一条记录                name = query.value(0).toString();                age = query.value(1).toString();                QString result = name + " " + age;                QWidget *pages=new QWidget();                tbInstruct->addItem(pages,age);                QSqlQuery qryInstruct;//查询子表内容,用于创建Button                if (qryInstruct.exec(QString("Select ID,Description from InstructList Where UnitID=%1").arg(i+1)))                {                    tbInstruct->setCurrentIndex(i);                    QVBoxLayout *layout = new QVBoxLayout;//建立一个坚排的规则

                   while(qryInstruct.next())                    {                        QString sID,sCaption;                        sID=qryInstruct.value(0).toString();                        sCaption=qryInstruct.value(1).toString();                        QPushButton *button = new QPushButton(sCaption);                        button->setAccessibleDescription(sID);                        button->setCheckable(true);                        button->setAutoExclusive(true);                        layout->addWidget(button);//把Button放入Layout中                    }                    layout->setSpacing(0);                    pages->setLayout(layout);                }                i=i+1;            }            //ui->toolBox->removeItem(0);            tbInstruct->setCurrentIndex(0);            layInstruct->addWidget(tbInstruct);            layInstruct->setSpacing(0);            ui->centralWidget->setLayout(layInstruct);        }        else        {  //如果查询失败,用下面的方法得到具体数据库返回的原因            QSqlError error = query.lastError();            //display.append("From mysql database: " + error.databaseText());        }    }    else    {  //打开数据库失败,显示数据库返回的失败描述        //display.append("cannot open database.");        //display.append("Reason: " + db.lastError().databaseText());    } }

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

void MainWindow::changeEvent(QEvent *e) {     QMainWindow::changeEvent(e);     switch (e->type()) {     case QEvent::LanguageChange:         ui->retranslateUi(this);         break;     default:         break;     } }

转载于:https://www.cnblogs.com/bennylam/archive/2010/03/22/1691782.html

最新回复(0)