2

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

我该如何防止这种行为?

更新:如果我右键单击链接,选择“复制链接”并将其粘贴到浏览器中,链接就可以了。

4

1 回答 1

2

那是因为%有 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。

但不幸的是,它会全局修改行为。

于 2015-09-16T12:53:57.810 回答