Qt 从网络请求模型数据

Qt 从网络请求模型数据,qt,qtableview,qtcpsocket,qabstracttablemodel,qdatastream,Qt,Qtableview,Qtcpsocket,Qabstracttablemodel,Qdatastream,在模型方法rowCount()和columnCount()中,我尝试使用qtcsocket从服务器检索数据时,模型会多次调用这些方法,但之后不会调用data()。关联的QTableView不显示任何内容。我使用调试器进行了检查,它显示rowCount()和columnCount()正在返回有效数据 该模型源自QAbstractTableModel。以下是TcpTableModel::rowCount()的代码: //安装程序正在等待服务器响应 定时器; 定时器设置单脉冲(真); QEventLo

在模型方法
rowCount()
columnCount()
中,我尝试使用
qtcsocket
从服务器检索数据时,模型会多次调用这些方法,但之后不会调用
data()
。关联的
QTableView
不显示任何内容。我使用调试器进行了检查,它显示
rowCount()
columnCount()
正在返回有效数据

该模型源自
QAbstractTableModel
。以下是
TcpTableModel::rowCount()
的代码:

//安装程序正在等待服务器响应
定时器;
定时器设置单脉冲(真);
QEventLoop事件循环;
连接(&m_tcpSocket、&qtcsocket::readyRead、&eventLoop、&QEventLoop::quit);
连接(&timer、&QTimer::timeout、&eventLoop、&QEventLoop::quit);
定时器启动(超时);
//使用QDataStream发送和接收模型信息
QDataStream数据流(m_tcpSocket);
dataStream>msgType;
数据流>>行数;
if((msgType!=MSG_请求_行数)||(行数==-1))
{
dataStream.commitTransaction();
返回0;
}
dataStream.commitTransaction();
返回行计数;
服务器使用相同的方法来处理请求。它接收
MSG\u REQUEST\u ROWS\u COUNT
,然后发回
MSG\u REQUEST\u ROWS\u COUNT
和一个包含行数的整数


在我的程序中,这种行为的根源是什么?如果对模型的请求被延迟满足,则可能
QTableView
无法正常工作。或者我应该使用完全不同的方法从服务器获取模型数据?

您是否能够将
QTableView
用于脱机模型?是的,对于脱机模型,它工作得很好。如果我使用放置在模型中的容器(而不是对服务器的请求),它可以正常工作。我猜您的方法有时会返回
0
。如果您更改了模型,即由于数据尚未读取而现在返回0,并在以后处理
TcpTableModel::readyRead
中的tcp请求时,您应该调用并通知视图您的模型已更改。请注意,始终异步发送请求可能更好。可能对您的情况很感兴趣。您是否能够将
QTableView
用于脱机模型?是的,对于脱机模型,它工作得很好。如果我使用放置在模型中的容器(而不是对服务器的请求),它可以正常工作。我猜您的方法有时会返回
0
。如果您更改了模型,即由于数据尚未读取而现在返回0,并在以后处理
TcpTableModel::readyRead
中的tcp请求时,您应该调用并通知视图您的模型已更改。请注意,始终异步发送请求可能更好。可能对你的情况很感兴趣。
//Setup waiting for server response
QTimer timer;
timer.setSingleShot(true);
QEventLoop eventLoop;
connect(&m_tcpSocket, &QTcpSocket::readyRead, &eventLoop, &QEventLoop::quit);
connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
timer.start(TIMEOUT);

//Using QDataStream to send and receive model information
QDataStream dataStream(&m_tcpSocket);
dataStream << MSG_REQUEST_ROWS_COUNT;//Sending request for number of rows
eventLoop.exec();

//If no response received
if(!timer.isActive())
{
    connect(&m_tcpSocket, &QTcpSocket::readyRead, this, &TcpTableModel::readyRead);
    return 0;
}
timer.stop();

//Receiving information from server
dataStream.startTransaction();
int msgType = -1;
int rowCount = -1;
dataStream >> msgType;
dataStream >> rowCount;
if((msgType != MSG_REQUEST_ROWS_COUNT) || (rowCount == -1))
{
    dataStream.commitTransaction();
    return 0;
}
dataStream.commitTransaction();

return rowCount;