我创建了一个带有html链接的QMessageBox:
QTMessageBox msgBox(Utility::UI::topLevelWidget());
msgBox.setText("<a href="http://www.example.cz/?url=www%25www">Link</a>");
msgBox.exec();
如果我左键点击链接,一个新的网页浏览器选项卡打开。问题是url http://www.example.cz/?url=www**%2525**www
被打开而不是http://www.example.cz/?url=www**%25**www
我如何防止这种行为?
更新:如果我右键单击链接,选择"复制链接"并粘贴到浏览器中,链接就可以了
这是因为%
具有%25
的html编码。所以%25
-> %2525
。
为什么Qt自动编码链接?
在QMessageBox中有一个QLabel。标签默认使用Qt::TextFormat Qt::AutoText。因此,它在您的文本中检测到它是html编码并生成链接。
QLabel发送信号linkActivated(const QString&链接)或使用QDesktopServices::openUrl(),取决于它的布尔值openexternalllinks。
QMessageBox似乎将openExternalLinks
设置为true。
由于链接将用作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();
使用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
实例。但不幸的是,它修改了全局行为。