【问题标题】:QMessageBox - url encoding/decodingQMessageBox - url 编码/解码
【发布时间】:2015-09-16 11:29:14
【问题描述】:

我创建了一个带有 html 链接的 QMessageBox:

QTMessageBox msgBox(Utility::UI::topLevelWidget());

msgBox.setText("<a href=\"http://www.example.cz/?url=www%25www\">Link</a>");

msgBox.exec();

如果我左键单击该链接,则会打开一个新的 Web 浏览器选项卡。问题是打开的url是http://www.example.cz/?url=www**%2525**www而不是http://www.example.cz/?url=www**%25**www

如何防止此类行为?

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

【问题讨论】:

  • 我认为问题不是来自这里,发布在浏览器中打开选项卡的方法。可能你再次编码 url ?
  • 我更改了代码。如果我右键单击链接,选择“复制链接”并将其粘贴到浏览器中,链接就可以了。
  • 所以你想阻止 qt 将“特殊”字符转换为 html 符号(如 % 转换为 %25 或“空格”转换为 %20)?

标签: c++ qt qmessagebox


【解决方案1】:

这是因为% 的html 编码为%25。所以%25 -> %2525

为什么 Qt 会自动对链接进行编码?

在QMessageBox 中有一个QLabel。标签使用default 的Qt::TextFormat Qt::AutoText。因此,它会在您的文本中检测到它是 html 编码的并生成链接。

QLabel 发送信号linkActivated(const QString& link) 或使用QDesktopServices::openUrl(),取决于它的布尔值openExternalLinks

看起来,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 实例作为已经有效的url。

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

【讨论】:

  • 完美运行。非常感谢你。 QDesktopServices::unsetUrlHandler("https");将给定方案 (https) 的处理行为返回到默认行为。
  • 太棒了。是的,但是如果可以选择更改单个实例的行为,那就更好了。不过,如果它适合您的需求,那就足够了,我很高兴。
猜你喜欢
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多