QT中如何将 Qvariant类型到sqlite3 *

zhusizhi007 2012-03-13 09:24:44
sqlite3 数据库的操作,因为想要将数据库加密,所以在Qsqldatabase类中自己加了一个函数GetHandle(),但是由于基类中是返回的Qvariant 类型,所以GetHandle(),实际上是该返回值为sqlite3 *,请问一下高手,如何将Qvariant 类型转换为sqlite3 *, 直接转换时编译报错,因为sqlite3 *并不是Qvariant的内置类型。
我试了一下将 Qvariant 先转换为int 再转换为(sqlite3 *),但是得到的指针值为0.
...全文
473 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tony_Works 2013-08-01
  • 打赏
  • 举报
回复
怎么解决的呢??
SunFrank1987 2012-03-15
  • 打赏
  • 举报
回复
Q_DECLARE_METATYPE 指定的是数据类型, 不应该是一个指针把
zhusizhi007 2012-03-15
  • 打赏
  • 举报
回复
谢谢以上两位大侠的指点,但是问题还是有的,可能我说的不清楚,详细一点如下:
其实已经在 qsql_sqlite.cpp文件中通过以下语句将sqlite3 *类型加入到了QVariant中:
#include <sqlite3.h>
Q_DECLARE_METATYPE(sqlite3*)
Q_DECLARE_METATYPE(sqlite3_stmt*)
但后面的编译还是报错:

问题说明:
在QT开发工具的源码类QSqlDatabase中新增加一个函数, 函数原型为:
QVariant sqlite3handle() const; //此函数返回的QVariant类型值,在转换前实际类型为sqlite3 *,是sqlite3数据库连接的指针

在项目中要将返回的QVariant类型的值转换回 sqlite3 *类型的指针,代码如下:
sqlite3 *sqlDb = NULL;
QVariant vaTemp = m_db.sqlite3handle(); //m_db 为QSqlDatabase类型的私有成员,已经初始化sqlite3连接
sqlDb = vaTemp.value<sqlite3 *>(); //此处总是报错
系统总是提示错误,错误提示如下:

2>LINK : 没有找到 ..\..\Src\HcsPlugin.dll 或上一个增量链接没有生成它;正在执行完全链接
1>d:\qt\4.7.3\include\qtcore\../../src/corelib/kernel/qmetatype.h(169) : error C2039: “qt_metatype_id”: 不是“QMetaTypeId<T>”的成员
1> with
1> [
1> T=sqlite3 *
1> ]
1> d:\qt\4.7.3\include\qtcore\../../src/corelib/kernel/qmetatype.h(169): 编译类 模板 成员函数“int QMetaTypeId2<T>::qt_metatype_id(void)”时
1> with
1> [
1> T=sqlite3 *
1> ]
1> d:\qt\4.7.3\include\qtcore\../../src/corelib/kernel/qmetatype.h(230): 参见对正在编译的类 模板 实例化“QMetaTypeId2<T>”的引用
1> with
1> [
1> T=sqlite3 *
1> ]
1> d:\qt\4.7.3\include\qtcore\../../src/corelib/kernel/qvariant.h(579): 参见对正在编译的函数 模板 实例化“int qMetaTypeId<T>(T *)”的引用
1> with
1> [
1> T=sqlite3 *
1> ]
1> d:\qt\4.7.3\include\qtcore\../../src/corelib/kernel/qvariant.h(599): 参见对正在编译的函数 模板 实例化“T qvariant_cast<T>(const QVariant &)”的引用
1> with
1> [
1> T=sqlite3 *
1> ]
1> d:\qt\4.7.3\include\qtcore\../../src/corelib/kernel/qvariant.h(336): 参见对正在编译的函数 模板 实例化“T qVariantValue<T>(const QVariant &)”的引用
1> with
1> [
1> T=sqlite3 *
1> ]
1> .\Source\DataStore\cdbmanager.cpp(175): 参见对正在编译的函数 模板 实例化“T QVariant::value<sqlite3*>(void) const”的引用
1> with
1> [
1> T=sqlite3 *
1> ]
zhusizhi007 2012-03-15
  • 打赏
  • 举报
回复
已经解决了,感谢各位
xiachm 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ak47zhangzhiwei 的回复:]

Q_DECLARE_METATYPE(MyStruct) 可以向QVariant中添加自定义类型
[/Quote]
正解
SunFrank1987 2012-03-14
  • 打赏
  • 举报
回复
Q_DECLARE_METATYPE(MyStruct) 可以向QVariant中添加自定义类型
zhusizhi007 2012-03-14
  • 打赏
  • 举报
回复
自己顶,急啊,

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧