QMessageBox - url编码/解码
QMessageBox - url encoding/decoding
我创建了一个带有html链接的QMessageBox:
QTMessageBox msgBox(Utility::UI::topLevelWidget());
msgBox.setText("<a href="http://www.example.cz/?url=www%25www">Link</a>");
msgBox.exec();
如果我左键点击链接,一个新的网页浏览器选项卡打开。问题是url http://www.example.cz/?url=www**%2525**www
被打开而不是http://www.example.cz/?url=www**%25**www
我如何防止这种行为?
更新:如果我右键单击链接,选择"复制链接"并粘贴到浏览器中,链接就可以了
这是因为%
具有%25
的html编码。所以%25
-> %2525
。
为什么Qt自动编码链接?
在QMessageBox中有一个QLabel。标签默认使用Qt::TextFormat Qt::AutoText。因此,它在您的文本中检测到它是html编码并生成链接。
QLabel发送信号linkActivated(const QString&链接)或使用QDesktopServices::openUrl(),取决于它的布尔值openexternalllinks。
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
实例。但不幸的是,它修改了全局行为。
相关文章:
- 使用已使用 java 编码的 openssl 解码数据
- 在CRC-16 CCITT中将数据从二进制解码为文本,我应该输入一个码字,使用CRC生成器进行编码
- 如何使用 ffmpeg 将 3840 nb_samples编码为请求 1024 的编解码器
- Opus编码和解码没有错误,但值不同
- YAML-CPP 编码/解码指针?
- 解码 c++ 中以 base64 编码的大量数据
- 如何使用位操作在单个整数中编码和解码两个数字
- 为什么这个base64解码/编码功能不能正常工作?
- 如何在C 服务器中解码卷曲URL编码的字符串
- C++ 使用 GMime 3.0 解码引用的可打印编码
- 如何在没有wchar_t的情况下在 c++ 中解码/编码 UTF-8 字符
- 使用 UDP 协议从 Windows 套接字发送到 Qt 套接字的网络数据包上的结构编码和解码
- CryptoPP vs PHP Base64 编码/解码
- Python3中的编码/解码(伯克利数据库记录)
- 在C 中对二进制对象进行编码/解码的标准方法
- 流文件Delta编码/解码
- RSA用加密 编码,并用C#rsacryptoserviceProvider解码
- Windows API base64编码/解码
- 将在64位应用程序中编码Protobuf消息并在32位应用程序中解码
- 解码编码的俄罗斯字符从url到实际字符在BHO