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

27 篇文章 0 订阅
5 篇文章 0 订阅

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

本文借鉴Demo博客:Qt编写数据库通用翻页demo(开源)_qt mysql数据分页-CSDN博客

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

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

gitee:QWidgetDemo: Qt编写的一些开源的demo,支持Qt4、Qt5、Qt6,支持任意系统,预计会有100多个,一直持续更新完善,代码简洁易懂注释详细,每个都是独立项目,非常适合初学者,代码随意传播使用,拒绝打赏和捐赠,欢迎留言评论!公众号:Qt实战/Qt入门和进阶/Qt教程

github:GitHub - feiyangqingyun/QWidgetDemo: Qt编写的一些开源的demo,预计会有100多个,一直持续更新完善,代码简洁易懂注释详细,每个都是独立项目,非常适合初学者,代码随意传播使用,拒绝打赏和捐赠,欢迎留言评论!公众号:Qt实战/Qt入门和进阶/Qt教程

原来的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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值