我已按照先前问题(如this
)的说明进行操作所以现在,如果我将链接放到常规页面,它可以使用默认浏览器打开。但是,如果我想从QT QLabel 4.8.6打开mailto链接,该链接什么都不做。 我做错了什么?
这是代码:
void UpgradeMessageDialog::linkOpen(const QString &link)
{
QDesktopServices::openUrl(QUrl(link));
}
(这被定义为适当的h文件中的公共插槽)
E4
请注意:我的计算机中设置了默认邮件程序,当我在浏览器中输入mailto:a@b.c时程序打开正常。
答案 0 :(得分:3)
首先,有两种方法可以处理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();
答案 1 :(得分:0)
#include <QUrl>
#include <QDesktopServices>
myLabel = new QLabel(this);
myLabel->setTextFormat(Qt::RichText);
myLabel->setText("Email:href='mailto:serge@essetee.be'>serge@essetee.be</a>");
myLabel->setOpenExternalLinks(true);
现在您只需点击该链接即可启动标准邮件客户端。