进销存在学习案例中最为常见,当然,也是我们日常生活中比较常用的工具,它的扩展性比较大,比如我们的家庭记账本,个人图书管理,个人杂物管理都可以通过它来进行扩展编写。这里以一个中药药房进销存为设计目标来探索学习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项目设置看看就知道了:
代码如下:
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;
}
}
这篇博客就到这里,小小进销存的内容后面继续,请继续关注下面的博客。