gpt4 book ai didi

c++ - 更新类变量 Qt 信号和槽

转载 作者:行者123 更新时间:2023-11-28 05:39:36 25 4
gpt4 key购买 nike

我有以下代码,使用 C++ 在 Qt 中填充 QStringList。当我在 GetCountriesList 插槽中填充我的列表并尝试打印更新的 QStringList m_CountriesList 时,列表是空的。我如何才能确保 GetCountriesList 插槽 void 方法有效并在 GetIndicatorsList() 方法中打印正确的值。

   void MainWindow::GetIndicatorsList()
{
QNetworkAccessManager *networkManager;
networkManager = new QNetworkAccessManager(this);
QUrl url("http://api.worldbank.org/countries?per_page=264&format=json");
QNetworkReply* reply = networkManager->get(QNetworkRequest(url));
connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(GetCountriesList(QNetworkReply*)));
qDebug()<< this->m_CountriesList;

}

void MainWindow::GetCountriesList(QNetworkReply* reply)
{
if(reply->error() == QNetworkReply::NoError) {


QString strReply = (QString)reply->readAll();

QStringList CountriesList;
QJsonDocument jsonResponse = QJsonDocument::fromJson(strReply.toUtf8());
QJsonArray JsonArray = jsonResponse.array();
JsonArray.removeFirst();

QJsonArray JsonArray2 = JsonArray[0].toArray();

for (int i = 0; i < JsonArray2.size(); i++) {
CountriesList.append(JsonArray2.at(i).toObject().value("name").toString());
}
//qDebug() << CountriesList;

this->m_CountriesList = CountriesList;
qDebug() << this->m_CountriesList;

}

else {
qDebug() << "ERROR";
}

}

最佳答案

你的问题是:

connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(GetCountriesList(QNetworkReply*)));

当网络回复完成并发出信号时,插槽将稍后被调用。 connect 操作非常快,不等待信号执行,它只是创建一个连接。

所以当你这样做的时候

qDebug()<< this->m_CountriesList;

就在连接之后,插槽尚未被调用。

此时数据根本不可用,因为信号还没有发出,存储国家的代码也没有执行。

这个答案:https://stackoverflow.com/a/27034939/835629向您展示如何处理这种情况。无论如何,您不能立即返回 GetIndicatorsList 中的值,因为这会阻止程序执行几秒钟,这是发出网络请求并获得答案的时间。

您还可以提供一个函数或对象,以便在数据准备就绪时回调。 Lambda functions可能会帮助你。

例如:

#include <functional>

void MainWindow::GetIndicatorsList(std::function<void(QStringList)> callback)
{
if (m_CountriesList.length() > 0) {
callback(m_CountriesList);
return;
}
QNetworkAccessManager *networkManager;
networkManager = new QNetworkAccessManager(this);
QUrl url("http://api.worldbank.org/countries?per_page=264&format=json");
QNetworkReply* reply = networkManager->get(QNetworkRequest(url));
connect(networkManager, &QNetworkAccessManager::finished, [this,callback](QNetworkReply *reply) {
if(reply->error() == QNetworkReply::NoError) {


QString strReply = (QString)reply->readAll();

QStringList CountriesList;
QJsonDocument jsonResponse = QJsonDocument::fromJson(strReply.toUtf8());
QJsonArray JsonArray = jsonResponse.array();
JsonArray.removeFirst();

QJsonArray JsonArray2 = JsonArray[0].toArray();

for (int i = 0; i < JsonArray2.size(); i++) {
CountriesList.append(JsonArray2.at(i).toObject().value("name").toString());
}
//qDebug() << CountriesList;

this->m_CountriesList = CountriesList;
qDebug() << this->m_CountriesList;
callback(CountriesList);
}
else {
qDebug() << "ERROR";
}
});
}

然后你可以这样调用它:

mainWindow->GetIndicatorsList([](QStringList list) {
qDebug() << "Called back! " << list;
});

关于c++ - 更新类变量 Qt 信号和槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37444086/

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