gpt4 book ai didi

c++ - 从 QThread 返回 QSqlQuery 结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:21:22 25 4
gpt4 key购买 nike

我正在使用 Qt 5.3.1 SQL 模块访问 MySQL 5.6 数据库。目前,我尝试将一些代码从主线程移动到自定义线程,以允许 GUI 线程在数据库更新期间保持响应。

我知道一切(包括建立连接)都必须移至自定义线程。我正在使用排队的信号和插槽来实现这一点并且它工作正常。

但是有一件事我不确定:如何将查询结果返回到主线程?当然,我会为此使用一个信号。但是我应该在该信号中返回什么样的对象?

我应该返回 QSqlQuery 吗?我想这会很危险,因为 QSqlQuery 以某种方式附加到连接/数据库。

我应该返回从使用 record() 的查询中获取的 QSqlRecord 对象列表吗?不幸的是,文档没有说明这是否安全。

安全返回结果的正确容器/方式是什么?

最佳答案

例如,如果数据库包含个人详细信息,您可以创建一个单独的类,派生自 QObject:-

class Person : public QObject
{
Q_OBJECT

public:
Person();

private:
QString m_firstName;
QString m_surname;
QString m_address
QDateTime m_dateOfBirth;
};

然后,有registered its metadata对于与信号和槽一起使用,检索数据库记录,填充 Person 对象并使用信号和槽发送它。然后,您创建的类可以表示数据库中的表。

但是,更简单的方法是使用 QMap 并用它发出信号:-

QMap personMap;
personMap["name"] = sqlRecord.value().toString("name");
personMap["surname"] = sqlRecord.value().toString("surname");
personMap["address"] = sqlRecord.value().toString("address");
...etc

发射一个带有 token 和 map 的函数可能是个好主意,其中 token 表示 map 包含的信息类型:-

emit RetrievedData("Person", personMap);

我会避免发送 SqlRecord 或任何与存储数据的底层方法有关的事情。用loosely coupled classes总是好的.这样,您可以决定用另一种机制替换数据库存储,而无需重构所有其他代码。

------------ 回复评论------------

用 sql 记录填充 map 。为简单起见,我们假设所有返回的项目都是字符串。如果记录项是数字,只需在存储到 map 之前转换为字符串。

QMap PopulateMap(SQLRecord& sqlRecord)
{
QMap map;

for(int i=0; i<sqlRecord.count(); ++i)
{
map[sqlRecord.fieldName(i)] = sqlRecord.value(i).toString();
}

return map;
}

关于c++ - 从 QThread 返回 QSqlQuery 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25780400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com