我对 Qt
和编程还很陌生,遇到了一个我找不到解决方案的问题。
我想从在线 XML 文件中读取一些信息并将其发送到我的主程序。
为此,我创建了一个类 XMLParser 并将以下内容添加到构造函数中:
XMLParser::XMLParser(QString searchstring)
{
QNetworkAccessManager *manager2 = new QNetworkAccessManager(this);
reply = manager2->get(QNetworkRequest(QUrl("http://www.boardgamegeek.com/xmlapi/search?search="+searchstring)));
XMLParser::connect(reply, SIGNAL(finished()),
this, SLOT(fileIsReady()) );
}
和fileIsReady
填充一个QMap并将其存储为私有(private)类成员。
在我的第二节课上,我打电话
XMLParser *xmlpars = new XMLParser(input_gamename->text());
QMap<QString, int> searchResults = xmlpars->getSearchList();
getSearchList 是一个简单的 getter 函数。
问题是,getSearchList 在 fileIsReady 完成读取 XML 文件并返回空映射之前执行。
据我了解,在 fileIsReady()
完成其工作之前,构造函数不应完成。因此,不应提前调用 getSearchList()。
我的两个问题:
- 为什么我的程序在运行,而函数没有读完。
- 如何让第二次调用“getSearchList”等待?
提前致谢!
最佳答案
首先,您需要了解信号和槽的基本概念。
建立连接后,每次发出信号时都会调用插槽。
connect()
函数在将信号连接到插槽后返回。它不会等待信号发出。
在您的 XMLParser 构造函数中,您的 connect()
函数注册了这个:“当 finished()
信号发出时,运行 fileIsReady()
功能"。
现在,回答您的问题。
- Why does my programm progresses while the function didn't finish reading.
因为在您的构造函数代码中,您要求构造函数在将信号连接到插槽后完成。您没有要求它等待下载完成。
然后,您无需等待 finished() 信号即可调用 getSearchList()。因此,getSearchList() 在 fileIsReady() 之前被调用。
- How can I make the second call "getSearchList" wait?
正如 MrEricSir 所说,您不应该让它等待! (想一想:如果您失去互联网连接并且无法完成文件下载会怎样?答案是,您的程序将卡住,因为它将永远等待。这很糟糕。)
不要在构造 XMLParser 后立即调用 getSearchList()
。相反,让 XMLParser 在完成解析 XML 文件时发出“finishedParsing()”信号。然后,进行另一个信号槽连接:将 finishedParsing() 信号连接到调用 getSearchList() 的槽。
关于c++ - Qt中的异步函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27028190/