QMessageBox - url encoding/decoding
QMessageBox - url encoding/decoding
我创建了一个带有 html link:
的 QMessageBox
QTMessageBox msgBox(Utility::UI::topLevelWidget());
msgBox.setText("<a href=\"http://www.example.cz/?url=www%25www\">Link</a>");
msgBox.exec();
如果我左键单击 link,则会打开一个新的 Web 浏览器选项卡。问题是打开 url http://www.example.cz/?url=www**%2525**www
而不是 http://www.example.cz/?url=www**%25**www
如何防止此类行为?
更新: 如果我右键单击 link,选择 "Copy link" 并将其粘贴到浏览器中,link 就可以了。
那是因为 %
有 html 编码 %25
。所以 %25
-> %2525
。
为什么 Qt 会自动编码 links?
在QMessageBox中,有一个QLabel。标签使用 Qt::TextFormat Qt::AutoText by default。因此,它在您的文本中检测到它是 html 编码并生成 link。
QLabel 发送信号linkActivated(const QString& link) or uses QDesktopServices::openUrl(), depending its the boolean openExternalLinks。
QMessageBox 似乎将 openExternalLinks
设置为 true。
由于 link 将用作 QUrl 的输入,因此将对其进行解析。这就是双重编码的原因。
可以使用其静态方法 void QDesktopServices::setUrlHandler
修改 QDesktopServices::openUrl()
的行为。我实施并测试了它的预期行为:
MyUrlHandler urlHandler;
QDesktopServices::setUrlHandler( "http", &urlHandler, "handleUrl" );
QMessageBox msgBox;
msgBox.setText( "<a href=\"http://www.example.cz/?url=www%25www\">Link</a>" );
msgBox.show();
使用 class MyUrlHandler
:
class MyUrlHandler : public QObject
{
Q_OBJECT
public:
MyUrlHandler(QObject* parent=0):QObject(parent){}
public slots:
void handleUrl(const QUrl &url)
{
QDesktopServices::openUrl( QUrl::fromEncoded( url.toString().toAscii() ) );
}
};
技巧很简单,我将 link 地址直接设置为 QUrl
实例,因为它已经有效 url。
但不幸的是,它在全局范围内修改了行为。
我创建了一个带有 html link:
的 QMessageBoxQTMessageBox msgBox(Utility::UI::topLevelWidget());
msgBox.setText("<a href=\"http://www.example.cz/?url=www%25www\">Link</a>");
msgBox.exec();
如果我左键单击 link,则会打开一个新的 Web 浏览器选项卡。问题是打开 url http://www.example.cz/?url=www**%2525**www
而不是 http://www.example.cz/?url=www**%25**www
如何防止此类行为?
更新: 如果我右键单击 link,选择 "Copy link" 并将其粘贴到浏览器中,link 就可以了。
那是因为 %
有 html 编码 %25
。所以 %25
-> %2525
。
为什么 Qt 会自动编码 links?
在QMessageBox中,有一个QLabel。标签使用 Qt::TextFormat Qt::AutoText by default。因此,它在您的文本中检测到它是 html 编码并生成 link。
QLabel 发送信号linkActivated(const QString& link) or uses QDesktopServices::openUrl(), depending its the boolean openExternalLinks。
QMessageBox 似乎将 openExternalLinks
设置为 true。
由于 link 将用作 QUrl 的输入,因此将对其进行解析。这就是双重编码的原因。
可以使用其静态方法 void QDesktopServices::setUrlHandler
修改 QDesktopServices::openUrl()
的行为。我实施并测试了它的预期行为:
MyUrlHandler urlHandler;
QDesktopServices::setUrlHandler( "http", &urlHandler, "handleUrl" );
QMessageBox msgBox;
msgBox.setText( "<a href=\"http://www.example.cz/?url=www%25www\">Link</a>" );
msgBox.show();
使用 class MyUrlHandler
:
class MyUrlHandler : public QObject
{
Q_OBJECT
public:
MyUrlHandler(QObject* parent=0):QObject(parent){}
public slots:
void handleUrl(const QUrl &url)
{
QDesktopServices::openUrl( QUrl::fromEncoded( url.toString().toAscii() ) );
}
};
技巧很简单,我将 link 地址直接设置为 QUrl
实例,因为它已经有效 url。
但不幸的是,它在全局范围内修改了行为。