我创建了一个带有html链接的QMessageBox:
QTMessageBox msgBox(Utility::UI::topLevelWidget());
msgBox.setText("<a href=\"http://www.example.cz/?url=www%25www\">Link</a>");
msgBox.exec();
如果我左键单击该链接,则会打开一个新的Web浏览器选项卡。问题是网址http://www.example.cz/?url=www**%2525**www
已打开,而不是http://www.example.cz/?url=www**%25**www
如何防止此类行为?
更新:如果我右键点击该链接,请选择“复制链接”并将其粘贴到浏览器中,链接正常。
答案 0 :(得分:1)
那是因为%
具有html编码%25
。所以%25
- &gt; %2525
。
为什么Qt会自动编码链接?
在QMessageBox中,有一个QLabel。标签使用default的Qt :: TextFormat Qt :: AutoText。因此,它会在您的文本中检测到它是html编码并生成链接。
QLabel发送信号linkActivated(const QString& link)或使用QDesktopServices::openUrl(),具体取决于布尔值openExternalLinks。
似乎QMessageBox将openExternalLinks
设置为true。
由于该链接将用作QUrl的输入,因此将对其进行解析。这就是双重编码的原因。
可以使用静态方法QDesktopServices::openUrl()
修改void QDesktopServices::setUrlHandler
的行为。我实现并测试了它的所需行为:
MyUrlHandler urlHandler;
QDesktopServices::setUrlHandler( "http", &urlHandler, "handleUrl" );
QMessageBox msgBox;
msgBox.setText( "<a href=\"http://www.example.cz/?url=www%25www\">Link</a>" );
msgBox.show();
使用班级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() ) );
}
};
诀窍很简单,我将链接地址直接设置为QUrl
实例,因为它已经是有效的URL。
但遗憾的是,它会全局修改行为。