从网络请求模型数据

时间:2017-06-17 12:24:06

标签: qt qtableview qtcpsocket qabstracttablemodel qdatastream

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

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

//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;

服务器使用相同的方法处理请求。它接收MSG_REQUEST_ROWS_COUNT然后发送回MSG_REQUEST_ROWS_COUNT和一个包含行数的int。

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

0 个答案:

没有答案