在此特别感谢刘大师(Qt侠),本文实现的功能是基于他实现的“Qt编写数据库通用翻页demo”基础上修改而成的。
本文借鉴Demo博客:Qt编写数据库通用翻页demo(开源)_qt mysql数据分页-CSDN博客
刘大师有许多作品,非常值得去学习,他的博客和开源项目地址如下:
csdn:https://blog.csdn.net/feiyangqingyun
原来的Demo我不做过多的说明,需要的可以看刘大师的博客,我在原来的基础上添加了几个功能
1,QString getWhereSql();
为了获取最后一次查询状态我添加了获取最后一次查询条件的方法。
2,void remove();
为实现数据库数据的删除我添加了数据删除方法。
使用方法为:
1)在执行remove语句之前,先调用一个次getWhereSql()保留最后一次查询状态;
2)再使用setWhereSql(QString)方法设置删除条件,然后执行remove方法,即可删除数据。
3)最后再使用setWhereSql(QString)并执行select()方法即可刷新显示。
3,新增一个数据操作父接口
struct DbOperationInfo
{
QString tableName;
DbOperationInfo(QString tableName)
:tableName(tableName)
{
}
virtual QString GetInsertSql(){ return ""; };
virtual QString GetUpdateSql(){ return ""; };
};
它是为了适配不同数据表结构面设计接口,主要是在执行insert和update方法时怎么获取sql语句。
在使用时用户只需要继承该结构体,然后实现GetInsetSql和GetUpdateSql方法,然后将实例对象的地址传给控件的insert与update方法即可。
3,void insert(DbOperationInfo *info);
为实现数据库数据的插入,添加了数据插入方法。
使用方法为:
1) 执行insert(DbOperationInfo *info)方法,即可删除数据。
2)最后执行select()方法即可刷新显示。
4.void updata(DbOperationInfo *info);
为实现数据库数据的修改,添加了数据修改方法。
使用方法为:
1) 执行updata(DbOperationInfo *info)方法,即可删除数据。
2)最后执行select()方法即可刷新显示。
5.代码示例
1)删除与刷新
void HRNetEventEditorWidget::on_pushButton_Del_clicked()
{
int row = ui->tableMain->currentIndex().row();
if(row >= 0){
QString selectWhereSql = _p->_dbPage->getWhereSql();
QAbstractItemModel *model = ui->tableMain->model();
QModelIndex index = model->index(row, 0); //选中行第一列的内容
QVariant data = model->data(index);
QString id = data.toString();
QString sql = QString("where id='%0'").arg(id);
_p->_dbPage->setWhereSql(sql);
_p->_dbPage->remove();
_p->_dbPage->setWhereSql(selectWhereSql);
_p->_dbPage->select();
}
}
2)编辑与刷新
void HRNetEventEditorWidget::on_tableMain_doubleClicked(const QModelIndex &index)
{
int row = index.row();
if(row >= 0){
struct HRNetEventInfoCn info = getLineData(row);
_p->_eventViewDlg = new HRNetEventInfoWidget(info,UPDATE,this);
_p->_eventViewDlg->setWindowTitle("编辑事件");
connect(_p->_eventViewDlg,SIGNAL(UpdateNetEventInfo(HRNetEventInfoCn)),this,SLOT(onUpdatetEventInfo(HRNetEventInfoCn)));
_p->_eventViewDlg->show();
}
}
void HRNetEventEditorWidget::onUpdatetEventInfo(HRNetEventInfoCn mHRNetEventInfoCn){
HRNetEventInfo info = HRNetEventInfo::decodeData(mHRNetEventInfoCn,tableName);
_p->_dbPage->updata(&info);
_p->_dbPage->select();
}
3)插入与刷新
void HRNetEventEditorWidget::on_pushButton_Add_clicked()
{
QTreeWidgetItem * dirItem = ui->treeWidget->currentItem();
if (dirItem)
{
HRNetEventInfoCn mHRNetEventInfoCn;
mHRNetEventInfoCn.id = GetUUID();
_p->_eventViewDlg = new HRNetEventInfoWidget(mHRNetEventInfoCn,INSERT,this);
_p->_eventViewDlg->setWindowTitle("添加事件");
connect(_p->_eventViewDlg,SIGNAL(AddNetEventInfo(HRNetEventInfoCn)),this,SLOT(onAddNetEventInfo(HRNetEventInfoCn)));
_p->_eventViewDlg->show();
}
}
void HRNetEventEditorWidget::onAddNetEventInfo(HRNetEventInfoCn mHRNetEventInfoCn){
HRNetEventInfo info = HRNetEventInfo::decodeData(mHRNetEventInfoCn,tableName);
_p->_dbPage->insert(&info);
_p->_dbPage->select();
}
6,实现数据库操作sql
struct HRNetEventInfo : public DbOperationInfo
{
QString id; //事件ID;
QString content; //事件内容;
int attact_defense; //敌我方;
int emotion; //情绪值;
int politics; //政治倾向;
int timing; //产生时机;
QDateTime datetime; //插入时间;
HRNetEventInfo()
:DbOperationInfo("")
{
}
HRNetEventInfo(QString tableName)
:DbOperationInfo(tableName)
{
}
//使用中文信息初始化;
HRNetEventInfo(HRNetEventInfoCn mHRNetEventInfoCn,QString tableName)
:DbOperationInfo(tableName)
{
this->id = mHRNetEventInfoCn.id;
this->content = mHRNetEventInfoCn.content;
this->attact_defense = decodeAttactDefense(mHRNetEventInfoCn.attact_defense);
this->emotion = mHRNetEventInfoCn.emotion;
this->politics = decodePolitics(mHRNetEventInfoCn.politics);
this->timing = decodeTiming(mHRNetEventInfoCn.timing);
this->datetime = mHRNetEventInfoCn.datetime;
}
//获取数据库插入语句;
virtual QString GetInsertSql(){
QString sql = QString("insert into %0(id,content,attack_or_defense,emotion_val,politics,timing,datetime) "
"values('%1','%2',%3,%4,%5,%6,'%7')")
.arg(tableName).arg(id).arg(content).arg(attact_defense).arg(emotion)
.arg(politics).arg(timing).arg(datetime.toString("yyyy-MM-dd hh:mm:ss"));
return sql;
}
//获取数据库更新语句;
virtual QString GetUpdateSql(){
QString sql = QString("update %0 set content='%1',attack_or_defense=%2,emotion_val=%3,politics=%4,timing=%5 where id='%6'")
.arg(tableName).arg(content).arg(attact_defense).arg(emotion)
.arg(politics).arg(timing).arg(id);
return sql;
}
};
7,源代码