学习日记2:qt数据管理库(连通mysql后导入数据实现搜索功能,并对表格进行增改删查)


成果展示

在这里插入图片描述

已实现功能:

  1. 可导入mysql中所有表格数据
  2. 可使用搜索按钮查找表名或参数
  3. 可使用多选框实现单个、多个以及全部参数显示
  4. 可对表格进行增改删查

主要代码

  1. 数据库导入功能
//导入数据
void MainWindow::on_pushButton_import_clicked()
{
	
    ui->treeWidget->clear();//清空树形窗口
    QString cmd = "show tables;";//显示所有表
    QSqlQuery query(cmd);


    //获取所有表名,并添加顶层结点
    while (query.next())
    {
        QString biaoming=query.value(0).toString().trimmed();//获取表名
        allbiaoming << biaoming;//将单个表名加入表名数组
        qDebug() << "table name:" << biaoming;//打印表名
        QTreeWidgetItem *item = new QTreeWidgetItem();
        item->setText(0,query.value(0).toString());//设置顶层结点
        item->setCheckState(0,Qt::Unchecked);//默认未选中
        ui->treeWidget->addTopLevelItem(item);

        //设置子节点
        QString selectsql="show columns from %1";//获取所有列
        QSqlQuery selectquery(selectsql.arg(biaoming));
        int j=0;
        while(selectquery.next())
        {
            allcanshu<<selectquery.value(0).toString();//添加项
            if(j>2)//此段为特殊操作,我所处理的表格参数,我只需要取第三列及以后的表头
            {
                qDebug() <<"参数名为"<<allcanshu.at(j);
                QTreeWidgetItem *childitem=new QTreeWidgetItem(item,QStringList(allcanshu.at(j)));
                childitem->setCheckState(0,Qt::Unchecked);//添加
            }
            j++;
        }
    }
}

2、搜索按钮查找表名或参数

void MainWindow::on_toolButton_clicked()
{
    QString search = ui->lineEdit->text();//获取搜索框中的内容
    QTreeWidgetItemIterator it(ui->treeWidget);//获取树形窗口的所有子项
    while(*it)
    {
    		//将子项与搜索框文本比较,不区分大小写
            if(QString::compare((*it)->text(0),search,Qt::CaseInsensitive))
            {
                 //不满足满足条件先隐藏,它的子项目满足条件时会再次让它显示
                (*it)->setHidden(true);
            }
            else
            {
                (*it)->setHidden(false);
                QTreeWidgetItem *item = *it;
                //显示父节点
                while (item->parent())
                {
                    item->parent()->setHidden(false);
                    item = item->parent();
                 }
            }
            ++it;
    }
    ui->treeWidget->expandAll();//展开所有符合的所有节点
}

3、多选框实现单个、多个以及全部参数显示

void MainWindow::childrenclicked(QTreeWidgetItem* item)
{
    QString filtername=item->text(0).trimmed();//获取节点名,子节点时为参数名,父节点时为表格名
    
	//将表名数列拿来与节点名一一比较,如果表格名(父节点)被选中,则表示全选
    for(int i=0;i<allbiaoming.count();i++)
    {
        if(QString::compare(filtername,allbiaoming.at(i),Qt::CaseSensitive))//返回0表示相等,区分大小写
            ;
        else
            showtable=true;//全选标志位
    }
    if(showtable)//全选
    {
        if(item->checkState(0))//checkbox未选中为0,半选1,全选2
        {
            qDebug()<<"用户选择了父节点"<<filtername;
            mymodel->setTable(filtername);
            mymodel->select();
            ui->tableView->setModel(mymodel);//显示整张表
            showtable=false;
        }
        else
        {
            //清空tableview
            model->clear();
            ui->tableView->setModel(model);
        }
    }
    else//未全选,多选及单选
    {
        int columncount=model->columnCount();
        qDebug()<< columncount;//当前列
        QString filtertable=item->parent()->text(0).trimmed();//子节点时为表格名,父节点时为空

        if(item->checkState(0))    //选中状态
        {
            qDebug()<<"用户选择了子节点"<<filtername;
            QString filtersql="select %1.`%2` from %1";//筛选结果
            QSqlQuery filterquery(filtersql.arg(filtertable).arg(filtername));

            QList<QStandardItem*> items;
            while(filterquery.next())
            {
                QString value = filterquery.value(0).toString();//单个数据值
                qDebug() <<"单个数据值"<<value;
                QStandardItem *item = new QStandardItem(value);//QStandardItem是存储数据的单元格,它存储的是QString
                items<<item;
            }
            model->appendColumn(items);//插入列
            model->setHorizontalHeaderItem(columncount,new QStandardItem(filtername));//设置表头
        }

        else//未被选中,删除未选中列
        {
            int columncount=model->columnCount();
            qDebug() <<"当前有列:"<<columncount;
            for(int j = 0; j < columncount; j++)                // 遍历每一个单元格(列)
            {
                QVariant currenttext=model->headerData(j,Qt::Horizontal);
                if(QString::compare(filtername,currenttext.toString(),Qt::CaseSensitive));
                else
                    model->takeColumn(j);
            }
        }
        ui->tableView->setModel(model);//表视图,用于显示
    }
}

4、增改删查

//增加一行,表格可修改
void MainWindow::on_pushButton_modify_clicked()
{
    ui->tableView->setEditTriggers(QAbstractItemView::DoubleClicked);//设置为双击可修改
    int rowNum = mymodel->rowCount(); //获得表的行数
    int id = rowNum+1;
    mymodel->insertRow(rowNum); //添加一行
    mymodel->setData(mymodel->index(rowNum,0),id);
}
//删除按钮
void MainWindow::on_pushButton_delete_clicked()
{
    int curRow = ui->tableView->currentIndex().row();
    mymodel->removeRow(curRow);
    int ok = QMessageBox::warning(this,tr("提示:"),tr("你确定"
    "删除当前行吗? "),QMessageBox::Yes,QMessageBox::No);
    if(ok == QMessageBox::No)
    {
        mymodel->revertAll(); //如果不删除,则撤销
    }
    else 
    	mymodel->submitAll(); //否则提交,在数据库中删除该行
}

小结

1、checkbox的三态
2、 相关的sql语句
(1)show tables
(2)show columns from 表名
(3)select 表名.`字段名’ from 表名
注意:如果表头中有括号或者有特殊符号,要加上反引号,具体看下列链接
https://blog.csdn.net/weixin_43424867/article/details/118210268

代码下载

链接:https://pan.quark.cn/s/7f16aece6ef4
提取码:CetH

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值