那是因为%
有 html 编码%25
。所以%25
-> %2525
。
为什么 Qt 会自动对链接进行编码?
在 QMessageBox 中有一个 QLabel。标签默认使用 Qt::TextFormat Qt::AutoText 。因此,它会在您的文本中检测到它是 html 编码的并生成链接。
QLabel 发送信号linkActivated(const QString& link)或使用QDesktopServices::openUrl(),这取决于它的布尔值openExternalLinks。
看来,QMessageBox 设置openExternalLinks
为真。
由于链接将用作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。
但不幸的是,它会全局修改行为。