gpt4 book ai didi

c++ - QMessageBox - url编码/解码

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:46 25 4
gpt4 key购买 nike

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

如何防止此类行为?

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

最佳答案

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

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

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

QLabel 发送信号 linkActivated(const QString& link)或使用 QDesktopServices::openUrl() ,取决于它的 bool 值 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。

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

关于c++ - QMessageBox - url编码/解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32607343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com