我从Qml获取文件路径,如下所示:
mainView.projectFilePath = Qt.resolvedUrl(newProjectFileDlg.fileUrl).toString();
Run Code Online (Sandbox Code Playgroud)
上面的文件路径如下所示:file:/// C:/uuuu.a3
但当这条路径传递给QFile时,它会抱怨
The filename, directory name, or volume label syntax is incorrect
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题呢?
在Qt4,使用下面的代码QUrl工作:
QUrl u;
foreach (const settings::PostItem & pi, settings.post)
u.addQueryItem(pi.name, pi.value);
postData = u.encodedQuery();
Run Code Online (Sandbox Code Playgroud)
注意:此代码来自wkhtmltopdf并且postData是QByteArray.
但是,Qt5不再具有该addQueryItem()功能.你如何移植这段代码?
我有一段代码在4.8中工作但现在我需要将它移植到Qt5(beta2)
这应该发生:
我想将一些数据发布到网络服务器,网址应该是这样的"http:// server/actions.php"然后我的字段("Action"-string和"data"字符串(json))应该使用post发送到服务器.未在网址中编码
QUrl params;
// The data to post
QVariantMap map;
map["Title"]="The title";
map["ProjectId"]="0";
map["Parent"]="0";
map["Location"]="North pole";
map["Creator"]="You";
map["Group"]="a group";
QByteArray data = Json::serialize(map); //the map is converted to json im a QByteArray
params.addEncodedQueryItem("Data",data);
params.addQueryItem("Action", "Update");
QNetworkRequest Request(QUrl("http://server.com/actions.php"));
Request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
NetManager->post(Request,params.encodedQuery());
Run Code Online (Sandbox Code Playgroud)
现在,我可能不会在第一时间做到这一点,(它工作在4.8)但真正的问题是addEncodedQueryItem和addQueryItem现在从Qt5开始消失了,我不知道应该用它替换它们.
我已经阅读了新文档并看到了新的QUrlQuery,但我无法弄清楚如何在我的情况下使用它.
我使用用户输入的URL作为文本来初始化QUrl对象.后来我想将QUrl转换回字符串以显示它并使用正则表达式进行检查.只要用户没有输入任何百分比编码的URL,这就可以正常工作.
为什么以下示例代码不起作用?
qDebug() << QUrl("http://test.com/query?q=%2B%2Be%3Axyz%2Fen").toDisplayString(QUrl::FullyDecoded);
Run Code Online (Sandbox Code Playgroud)
它根本不解码任何百分比编码的字符.它应该打印"http://test.com/query?q=++e:xyz/en"但实际打印"http://test.com/query?q=%2B%2Be%3Axyz%2Fen".
我还尝试了许多其他方法,如fromUserInput(),但我无法在Qt5.3中使代码正常工作.
有人可以解释我如何做到这一点,以及为什么上面的代码不起作用(即显示解码的URL),即使使用QUrl :: FullyDecoded?
UPDATE
获取fromPercentEncoding()提示后,我尝试了以下代码:
QUrl UrlFromUserInput(const QString& input)
{
QByteArray latin = input.toLatin1();
QByteArray utf8 = input.toUtf8();
if (latin != utf8)
{
// URL string containing unicode characters (no percent encoding expected)
return QUrl::fromUserInput(input);
}
else
{
// URL string containing ASCII characters only (assume possible %-encoding)
return QUrl::fromUserInput(QUrl::fromPercentEncoding(input.toLatin1()));
}
}
Run Code Online (Sandbox Code Playgroud)
这允许用户输入unicode URL和百分比编码的URL,并且可以解码这两种URL以进行显示/匹配.但是,百分比编码的URL在QWebView中不起作用... Web服务器响应不同(它返回了不同的页面).很明显,QUrl :: fromPercentEncoding()不是一个干净的解决方案,因为它有效地改变了URL.我可以在上面的函数中创建两个QUrl对象...一个直接构造,一个使用fromPercentEncoding()构建,第一个用于QWebView,后者仅用于显示/匹配......但这看起来很荒谬.
我正在使用Qt 4.7.1和我试图找到解码网址的方法: https://xxx.com&since=2011-01-27T10%3A33%3A50%2B0000 到vaild日期,但我现在可以找到任何方法来做到这一点..它曾经是QUrl :: decode.
我目前正在 Qt 中编写一个网络应用程序,需要以以下形式分隔网络地址:
example.org:1234
Run Code Online (Sandbox Code Playgroud)
到单独的主机名和端口 QStrings 中。
是否有 Qt 函数可以轻松解析它并检查给定的输入是否正确?
提前致谢!
我有一个QUrl,我需要提取路径+文件+参数.基本上除了主机名之外的所有内容 - 通过HTTP请求的内容.
我查看了Qt 4.6文档,但我找不到任何看起来会这样做的内容.
我会用什么方法打电话?
我有一个QUrl这样的:
https://www.example.com/index.html#token=SomeToken&user=guest
我想获取令牌的值 ie SomeToken。我知道方法QUrl::queryItemValue,所以这段代码必须有效:
void MainWindow::get_token(QUrl url)
{
url = url.toString().replace("?","#");
QString token = url.queryItemValue("token");
}
Run Code Online (Sandbox Code Playgroud)
但是Qt5我不能使用这个方法,我该如何解析url?
在我的应用程序中,我生成一个HTML文件,我想通过单击按钮打开它.所以我的文件被命名,例如:
QString file = "F:/the_path/to_the_/generated_html_file.html";
Run Code Online (Sandbox Code Playgroud)
在Windows上我将其更改为:
file = "file:///F:/the_path/to_the_/generated_html_file.html";
Run Code Online (Sandbox Code Playgroud)
所以我可以打开它:
QDesktopServices::openUrl(QUrl(file));
Run Code Online (Sandbox Code Playgroud)
它将在默认浏览器中打开.
但是当字符#存在于路径或文件名中时,它不再起作用,并且似乎URL在之后被截断#.
例如,如果我命名该文件generated#_html_file.html,我收到此错误消息:
ShellExecute 'F:/the_path/to_the_/generated' failed (error 2).
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,我该如何避免呢?
如果我有一个可以是文件或URL的字符串,是否有任何现有的聪明方法可以用来区分它们?
例如:
这是加载设计器UI文件,所以我需要制作远程文件的本地临时副本。所以最重要的是知道我什么时候需要下载文件。
我有一个QUrl:https://www.example.com/success.html#token=XYZ&user=guest我想获得令牌的值,即XYZ
我目前的代码
QString token = url.queryItemValue(QString("token"));
cout << QString("access token is %1").arg(access_token);
Run Code Online (Sandbox Code Playgroud)
返回一个空字符串.