QT使用QTableView基于Sqlite的数据库查看,翻页,添加、修改、删除

在此特别感谢刘大师(Qt侠),本文实现的功能是基于他实现的“Qt编写数据库通用翻页demo”基础上修改而成的。

本文借鉴Demo博客:https://blog.csdn.net/feiyangqingyun/article/details/82530643

刘大师有许多作品,非常值得去学习,他的博客和开源项目地址如下:

csdn:https://blog.csdn.net/feiyangqingyun

gitee:https://gitee.com/feiyangqingyun/QWidgetDemo

github:https://github.com/feiyangqingyun/QWidgetDemo

原来的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,源代码

https://download.csdn.net/download/octdream/11872864

 

你可能感兴趣的:(QT,C++,sql)