QMessageBox - url编码/解码

时间:2015-09-16 11:29:14

标签: c++ qt qmessagebox

我创建了一个带有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

如何防止此类行为?

更新:如果我右键点击该链接,请选择“复制链接”并将其粘贴到浏览器中,链接正常。

1 个答案:

答案 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。

但遗憾的是,它会全局修改行为。