gpt4 book ai didi

c++ - Qt 4.8.6 中的 qlabel mailto 链接

转载 作者:行者123 更新时间:2023-11-30 02:25:40 25 4
gpt4 key购买 nike

我已经按照之前问题给出的说明进行操作,例如 this

所以现在如果我放置一个指向常规页面的链接,它可以在默认浏览器中正常打开。但是如果我想从 QT QLabel 4.8.6 打开一个 mailto 链接,这个链接什么都不做。我做错了什么?

代码如下:

UpgradeMessageDialog* umd = new UpgradeMessageDialog();
umd->ui->label->setOpenExternalLinks(true);
umd->ui->label->setTextInteractionFlags(Qt::TextBrowserInteraction);
umd->ui->label->setText("<a href='mailto:user@foo.com?subject=Test&body=Just a test'>My link</a>");
umd->exec();
umd->ui->label->connect(umd->ui->label,
SIGNAL(linkActivated(const QString&)), umd,
SLOT(linkOpen(const QString&)));

(这在适当的 h 文件中被定义为公共(public)槽)

void UpgradeMessageDialog::linkOpen(const QString &link)
{
QDesktopServices::openUrl(QUrl(link));
}

澄清一下:我的计算机中设置了一个默认邮件程序,当我在浏览器中键入 mailto:a@b.c 时,该程序可以正常打开。

最佳答案

首先,QLabel 中有两种处理链接激活的方法。您应该使用其中之一,但我看到您正在尝试同时使用两者。

这两种方式是:

  • 调用 openExternalLinks(true),这样 QLabel 将使用 QDesktopServices::openUrl() 自动打开链接,而不是发出 linkActivated() 信号。
  • 连接到 linkActivated() 信号,然后在连接的插槽中手动打开链接(例如通过调用 QDesktopServices::openUrl())。

您还错误地使用了exec() 函数。您应该将 exec() 调用放在 connect() 调用之后,因为 exec() 是阻塞的,所以信号连接实际上会在之后发生对话框关闭。

所以你的代码应该是这样的:

umd->ui->label->setText("<a href='mailto:user@foo.com?subject=Test&body=Just a test'>My link</a>");
connect(umd->ui->label, SIGNAL(linkActivated(QString)), umd, SLOT(linkOpen(QString)));
umd->exec();

或者像这样:

umd->ui->label->setTextFormat(Qt::RichText);
umd->ui->label->setTextInteractionFlags(Qt::TextBrowserInteraction);
umd->ui->label->setOpenExternalLinks(true);
umd->ui->label->setText("<a href='mailto:user@foo.com?subject=Test&body=Just a test'>My link</a>");

还有一点建议:将标签初始化代码放入 UpgradeMessageDialog 构造函数中。

UpgradeMessageDialog::UpgradeMessageDialog(QDialog* parent) : QDialog(parent)
{
ui->label->setTextFormat(Qt::RichText);
ui->label->setTextInteractionFlags(Qt::TextBrowserInteraction);
ui->label->openExternalLinks(true);
ui->label->setText("<a href='mailto:user@foo.com?subject=Test&body=Just a test'>My link</a>");
}

然后你可以这样使用你的对话框:

QScopedPointer<UpgradeMessageDialog> umd = new UpgradeMessageDialog;
umd->exec();

关于c++ - Qt 4.8.6 中的 qlabel mailto 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43993770/

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