1

我想向用户显示一个带有链接的警告 QMessageBox。这相对容易,我只需要确保我在消息框上设置了 RichText 文本格式,QMessageBox其余的由设置完成。done()但是,如果用户单击链接,我还想关闭消息框(如 some-sort-of-call-to ) - 语义是用户确认消息并做出决定。

问题:QMessageBox隐藏linkActivated来自其内部的信号QLabel(用于存储文本)。

我想我可以扩展QMessageBox类并在构造函数中做这个非常丑陋的黑客攻击:

QLabel *lbl = findChild<QLabel*>(QString("qt_msgbox_label"));
assert(lbl != NULL);

connect(lbl, SIGNAL(linkActivated(const QString&)), this, SLOT(handle_link_activation(const QString&)));

但是虽然找到的标签findChild不为空,并且"qt_msgbox_label"绝对正确(从源代码复制),并且没有“没有这样的信号/插槽”消息,但当我单击链接时,我的插槽永远不会被调用。

我想避免自己编写QDialog会模仿这种QMessageBox行为的代码。有谁知道我如何捕捉到这个信号?

4

1 回答 1

3

尝试定义您自己的链接“协议”,即 msgboxurl://yoururl.is.here 并为其安装 url 处理程序

QDesktopServices::setUrlHandler("msgboxurl", urlHandlerObj, "slotName");

urlHandlerObj 可能是创建消息框的对象。在插槽中,您可以隐藏您的消息框并在 // 之后获取 url 部分并打开它,QDesktopServices::openUrl但请记住您必须在前面加上 http/https 前缀(在某些平台上,没有“方案”的 url 处理不正确)。QDesktopServices::openUrl插槽处理 url 必须具有与静态方法相同的参数

于 2010-01-12T16:18:04.880 回答