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

来源:互联网 发布:高港区人民法院淘宝 编辑:程序博客网 时间:2024/06/02 07:29

如果需要对数据库操作,必须在.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;
    }
}

 

原创粉丝点击