Qt:如何使用从evaluateJavaScript返回的QVariant

Qt: How to use the returned QVariant from evaluateJavaScript?

本文关键字:返回 QVariant evaluateJavaScript 何使用 Qt      更新时间:2023-10-16

我使用Qt 4.8.1与evaluateJavaScript函数想要得到一些DOM元素回到Qt应用程序。我使用的代码是:

QVariant paragraphs = view->page()->mainFrame()->evaluateJavaScript("document.getElementsByTagName("p")");
const char* returnTypeName = paragraphs.typeName();
std::cout << "returnTypeName = " << returnTypeName << std::endl;

我发现:

returnTypeName = QVariantMap

但是,我不知道QVariantMap中的实际返回类型。

我想知道我能在返回的QVariantMap中找到实际类型吗?我可以转换QVariantMap到QWebElement/QWebElementCollection吗?或者我如何使用返回的QVariantMap(因为我没有使用QVariant对象的经验)。

谢谢你的建议

您应该做的第一件事是查阅QVariant文档。Qt文档非常全面;好好利用它。

无论如何,QVariantMapQMap<QString, QVariant>的类型定义。因此,您可以使用字符串键(变量名)来提取单个值。

// Convert your result into the underlying map
QVariantMap returnedMap = paragraphs.toMap();
// Get some values
QVariant value1 = returnedMap["key1"];
QVariant value2 = returnedMap["key2"];
// Find out their types
std::cout << "Type 1 = " << value1.typeName() << std::endl;
std::cout << "Type 2 = " << value1.typeName() << std::endl;
// Convert them to their underlying types
// (assuming value1 is a string, value2 is an int)
QString str = value1.toString();
int number = value2.toInt();

正如JKSH建议的那样,如果你想把一个DOM元素以一种有用的形式拉到Qt中来操纵该对象,你不能使用Javascript求值来这样做,因为Javascript元素引用不能转换为QWebElement对象。

要在Qt中获得DOM元素,需要直接使用Qt方法。这段代码应该返回您正在寻找的QWebElementCollection,而不需要Javascript求值:

QWebElementCollection paragraphs = view->page()->mainFrame()->documentElement().findAll("p");