C++ 如何使用QDatastream通过QtcSocket发送QSqlQueryModel?

C++ 如何使用QDatastream通过QtcSocket发送QSqlQueryModel?,c++,qt,qtcpsocket,qabstracttablemodel,qdatastream,C++,Qt,Qtcpsocket,Qabstracttablemodel,Qdatastream,我想用QDatastream和qtcsocket将QSqlQueryModel发送到另一个客户端。我想删除一些行并向QSqlQueryModel添加一些额外的行(不更改数据库),然后将其发送到客户端,如以下伪代码所示:- QTcpSocket socket; socket.setSocketDescriptor(handle); socket.waitForReadyRead(WAIT_TIME); QByteArray req = socket->readAll(); QDataStr

我想用QDatastream和qtcsocket将QSqlQueryModel发送到另一个客户端。我想删除一些行并向QSqlQueryModel添加一些额外的行(不更改数据库),然后将其发送到客户端,如以下伪代码所示:-

QTcpSocket socket;
socket.setSocketDescriptor(handle);
socket.waitForReadyRead(WAIT_TIME);

QByteArray req = socket->readAll();
QDataStream reqstream(&req,QIODevice::ReadOnly);

QSqlQueryModel MyModel;
....
// fetch data with MyModel
// add/remove some rows from that model without adding/removing them from actual database
....

QByteArray res;
QDataStream resstream(&res,QIODevice::WriteOnly);
resstrem << MyModel;
socket.write(res);
qtcsocket插座;
socket.setSocketDescriptor(句柄);
socket.waitForReadyRead(等待时间);
QByteArray req=socket->readAll();
QDataStream reqstream(&req,QIODevice::ReadOnly);
QSqlQueryModel-MyModel;
....
//使用MyModel获取数据
//从该模型中添加/删除某些行,而不从实际数据库中添加/删除它们
....
QByteArray res;
QDataStream resstream(&res,QIODevice::WriteOnly);

resstrem如果不创建“深度拷贝”,您就无法在Qt中做您想做的事情,或者其他任何事情

如果您使用的是real数据库,而不是SQLite或其他不使用数据库引擎的低端存储方法,则无需进行传输即可执行所需操作。请仔细阅读您选择的数据库。你可以找一张临时桌子。这更有效,因为带有活动引擎的数据库只会创建指针的游标,但会将其视为真实的表。如果生成的游标对于RAM来说太大,它会将其写入某个临时暂存区域

之后,让客户端告诉服务器应用程序从临时表中删除要删除的行,并插入要添加的行。只需确保服务器从那时起就在临时表上运行

注意:如果您使用的是一个非常糟糕的电子表格示例,该示例从GUI线程中将数据结果绑定到电子表格,则无法修复该问题。我在网上找到的每一个官方例子都非常糟糕。永远不要在主事件循环中执行数据库I/O


你可能也想得到一份。它将不包含这个问题的答案,但它确实包含许多工作数据库示例。

如果不创建“深度副本”,您无法在Qt中做您想要做的事情,或者其他任何事情

如果您使用的是real数据库,而不是SQLite或其他不使用数据库引擎的低端存储方法,则无需进行传输即可执行所需操作。请仔细阅读您选择的数据库。你可以找一张临时桌子。这更有效,因为带有活动引擎的数据库只会创建指针的游标,但会将其视为真实的表。如果生成的游标对于RAM来说太大,它会将其写入某个临时暂存区域

之后,让客户端告诉服务器应用程序从临时表中删除要删除的行,并插入要添加的行。只需确保服务器从那时起就在临时表上运行

注意:如果您使用的是一个非常糟糕的电子表格示例,该示例从GUI线程中将数据结果绑定到电子表格,则无法修复该问题。我在网上找到的每一个官方例子都非常糟糕。永远不要在主事件循环中执行数据库I/O


你可能也想得到一份。它不会包含这个问题的答案,但它确实包含许多工作数据库示例。

的任何后代的目的都是将一些数据应用到可以显示它们的视图(小部件)中

所以,基本上你们是在尝试做一些本课程设计之外的事情。这就像用铲子砸钉子一样。这是可能的,但危险且不推荐

只需使用
QSqlQuery
(使用hammer)读取debase数据,在行上迭代读取列,并以某种序列化格式存储它们。您可以使用
QDataStream
进行以下操作:

QDataStream out{&socket};
QSqlQuery查询{“从艺术家中选择国家”};
while(query.next()){

out的任何后代的目的都是采用一些数据来表示视图(widget)

所以,基本上你是在尝试做一些本课程设计之外的事情。这就像试图用铲子砸钉子。这是可能的,但很危险,不推荐

只需使用
QSqlQuery
(使用hammer)读取降级数据,在一行上迭代读取列,并以某种序列化格式存储它们。您可以使用
QDataStream

QDataStream out{&socket};
QSqlQuery查询{“从艺术家中选择国家”};
while(query.next()){

不创建新的深度副本是什么意思?@eyllanesc我的意思是不使用for循环复制新QList中的所有记录。类似于这样:-@尤金寶 漢子 您不能通过TCP发送Qt对象。您只能发送一些数据。在
QSqlQueryModel
中,数据(项)在索引中。每个索引都有行和列。如果没有循环,您无法获取每个索引。您需要生成映射或其他东西来发送模型副本。您可以从
QSqlQueryModel
继承并重载
数据()
方法来构建用于发送的映射,但我认为您可以使用它来完成所有操作。另一种简单的方法是编写
QSqlQuery
。不创建新的深度副本是什么意思?@eyllanesc我的意思是不使用for循环来复制新QList中的所有记录。类似以下内容:-@尤金寶 漢子 您不能通过TCP发送Qt对象。您只能发送一些数据。在
QSqlQueryModel
中,数据(项)在索引中。每个索引都有行和列。如果没有循环,您无法获取每个索引。您需要生成映射或其他东西来发送模型副本。您可以从
QSqlQueryModel
继承并重载
数据()
为send构建映射的方法,但我认为您所能做的就是使用它。另一种简单的方法是编写
QSqlQuery