用QT和sqlite做一个小小的进销存(1)

进销存在学习案例中最为常见,当然,也是我们日常生活中比较常用的工具,它的扩展性比较大,比如我们的家庭记账本,个人图书管理,个人杂物管理都可以通过它来进行扩展编写。这里以一个中药药房进销存为设计目标来探索学习QT中sqlite的用法以及QT的项目编程。

一、界面及按钮事件的设计
1、界面设计
在这里插入图片描述
2、添加按钮事件为widget添加数据
接下来,为按钮增加事件,在“”添加“”按钮中采用静态的方法向表格中添加内容(QT与微软的产品不同,微软的产品双击为添加事件,而QT则要通过右键菜单的go to slot添加信息槽),如下图:
在这里插入图片描述
这里添加的是clicked事件,确定后我们可以在对应的cpp文件中找到它(如果添加错了,要删除的话一定要记得在cpp和头文件中一同删除它,否则运行就会报错):

void MainWindow::on_addBtn_clicked()
{
    ui->lineEdit->setText(QString("HQ001"));
    ui->tableWidget->setRowCount(3);                                   		  //设定行数(否则无法显示单元格内容
    ui->tableWidget->verticalHeader()->setVisible(false);               // 隐藏水平header
    ui->tableWidget->setItem(0,0,new QTableWidgetItem("HQ001"));
    ui->tableWidget->setItem(1,0,new QTableWidgetItem("ZGC01"));
    ui->tableWidget->setItem(2,0,new QTableWidgetItem("MH001"));
}

上面的代码初步演示了,如何通过UI对象来操作UI界面上的各个控件。下面我们来批量为tableWidget添加数据并显示出来,代码如下:

 ui->lineEdit->setText(QString("HQ001"));
    mInfo[0] = new medicineListInfo(QString("HQ001"), QString::fromLocal8Bit("黄芪"), QString::fromLocal8Bit("根部"), QString::fromLocal8Bit("云南"),  10, 0.3);
    mInfo[1] = new medicineListInfo(QString("GC001"), QString::fromLocal8Bit("甘草"), QString::fromLocal8Bit("根部"), QString::fromLocal8Bit("宁夏"), 10,0.07);
    mInfo[2] = new medicineListInfo(QString("ZR001"), QString::fromLocal8Bit("竹茹"), QString::fromLocal8Bit("其他"), QString::fromLocal8Bit("湖南"),  15,0.45);
    mInfo[3] = new medicineListInfo(QString("MX001"), QString::fromLocal8Bit("芒硝"), QString::fromLocal8Bit("矿石"), QString::fromLocal8Bit("甘肃"),  21,0.24 );
    mInfo[4] = new medicineListInfo(QString("ZSW01"), QString::fromLocal8Bit("制首乌"), QString::fromLocal8Bit("根部"),QString::fromLocal8Bit("四川"),  30,0.15);
    ui->tableWidget->setRowCount(5);


    for(int i = 0; i < ui->tableWidget->rowCount(); i++) {

        QTableWidgetItem *item_code = new QTableWidgetItem();
        item_code->setText(mInfo[i]->mlistInfoCode);
        item_code->setFlags(item_code->flags() & (~Qt::ItemIsEditable));
        ui->tableWidget->setItem(i, 0, item_code);

        QTableWidgetItem *item_name = new QTableWidgetItem();
        item_name->setText(mInfo[i]->mlistInfoName);
        item_name->setFlags(item_name->flags() & (~Qt::ItemIsEditable));
        ui->tableWidget->setItem(i,1, item_name);

        QTableWidgetItem *item_class = new QTableWidgetItem();
        item_class->setText(mInfo[i]->mlistInfoClass);
        item_class->setFlags(item_class->flags() & (~Qt::ItemIsEditable));
        ui->tableWidget->setItem(i, 2, item_class);

        QTableWidgetItem *item_mount = new QTableWidgetItem();
       ui->tableWidget->setItem(i, 3, item_mount);
       ui->tableWidget->item(i, 3)->setText(mInfo[i]->mlistInfoProductor);

       QTableWidgetItem *item_productor = new QTableWidgetItem();
       item_productor->setText(mInfo[i]->mlistInfoProductor);
       item_productor->setFlags(item_productor->flags() & (~Qt::ItemIsEditable));
       ui->tableWidget->setItem(i, 4, item_productor);

       QTableWidgetItem *item_price = new QTableWidgetItem();
      ui->tableWidget->setItem(i, 5, item_price);
      ui->tableWidget->item(i, 5)->setText(QString("%1").arg(mInfo[i]->mlistInfoPrice));
...................
    }

在这里插入图片描述
上面完成了数据的静态批量添加,这也为我们实现数据的动态添加奠定了基础。让我们熟悉了表格控件(tableWidget)的使用。

二、设计数据库并加载数据
这里的数据库我们使用文件数据库sqlite,这个不需要安装什么服务就能依靠文件来运行,方便,但如果您需要运行大量的数据就可以选择更强大一些的mysql或者sqlserver,oracle等。 数据库设计我们使用一个简单的sqlite可视化设计工具sqlite studio。

在这里插入图片描述
1、数据表格设计如下:
在这里插入图片描述
我们向表格中添加数据后,通过QT的自带的sqlite数据引起就可以直接显示出来了。显示数据到tableWdiget中的代码如下:

2、数据库连接须注意的事项

a、在工程文件中设置好sql如下图:
在这里插入图片描述
b、数据库路径的设置
在开发调试阶段,数据库文件放置的路径不是在工程文件目录中,应该在调试目录中,如下
在这里插入图片描述
在这里插入图片描述
许多初学者在这里吃了大亏,总是不能成功连接数据库,所以这里特别提出来。如果我们的确想使用运行路径下的data中的数据库文件,可以这么来使用applicationpath来获取。
最恐怖的是,调试的时候,路径不在工程文件并列的同文件夹而是跑到其他文件夹去了,比如:
C:\Users\Administrator\Documents\build-testSqlite-Desktop_Qt_5_11_0_MinGW_32bit-Debug\debug
所以,我们在实在无法连接数据库的时候,先找找你的调试目录在哪里,我们可以打开QT项目设置看看就知道了:
在这里插入图片描述

3、将数据载入tableWidget
在这里插入图片描述

代码如下:

void  display(){
//确保数据链接成功
    if(!createConnection())
    {
        QMessageBox::about(NULL, "About", "Fail to connect database!");

    }
    model = new QSqlTableModel(this);
    model->setTable("tbMain"); //与数据库中的表tbMain绑定
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();
	//设置表头
    model->setHeaderData(0, Qt::Horizontal, QString::fromLocal8Bit( "编号"));
    model->setHeaderData(1, Qt::Horizontal,  QString::fromLocal8Bit("药名"));
    model->setHeaderData(2, Qt::Horizontal,  QString::fromLocal8Bit("类别"));
    model->setHeaderData(3, Qt::Horizontal,  QString::fromLocal8Bit("产地"));
    model->setHeaderData(4, Qt::Horizontal,  QString::fromLocal8Bit("厂家"));
    model->setHeaderData(5, Qt::Horizontal,  QString::fromLocal8Bit("价格"));
    model->setHeaderData(6, Qt::Horizontal,  QString::fromLocal8Bit("剂量"));
    model->setHeaderData(7, Qt::Horizontal,  QString::fromLocal8Bit("总价"));
    model->sort(0, Qt::AscendingOrder); // 第0列升序排序
    
    //与控件tableView绑定,设置表格宽度
	ui->tvMain->setModel(model);
    ui->tvMain->setEditTriggers(QAbstractItemView::NoEditTriggers);   //使其不可编辑
    ui->tvMain->setColumnWidth(0,80);
    ui->tvMain->setColumnWidth(1,100);
    ui->tvMain->setColumnWidth(2,60);
    ui->tvMain->setColumnWidth(3,100);
    ui->tvMain->setColumnWidth(4,160);
    ui->tvMain->setColumnWidth(5,76);
    ui->tvMain->setColumnWidth(6,76);

    }

static bool createConnection()
{

    QString dbFileName =".//data//tcmp.db";
    QSqlDatabase m_db = QSqlDatabase::addDatabase("QSQLITE");
    m_db.setDatabaseName(dbFileName);
    if (false == m_db.open())
    {
         qDebug() << "Error: Failed to connect database.";
         return false;

    }

   else
   {
    qDebug() << "Info: Successed to connect database.";
    QSqlQuery query;
    query.exec("create table medicine(id int primary key,药材名 vchar,生产企业 vchar,进货价 int,出货价 vchar,库存 vchar,销量 int)");
    query.exec("create table sale(id int primary key,药材名 vchar,生产企业 vchar,销量 vchar,日期 vchar)");
    query.exec("create table product(id int primary key,products vchar)");
    return true;
   }
}

这篇博客就到这里,小小进销存的内容后面继续,请继续关注下面的博客。

发布了116 篇原创文章 · 获赞 79 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/haigear/article/details/101018046
今日推荐