【问题标题】:Connecting to a signal hidden by QMessageBox连接到 QMessageBox 隐藏的信号
【发布时间】:2010-01-12 14:12:30
【问题描述】:

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

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

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

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" 绝对正确(c/p'ed from the source),并且没有“没有这样的信号/插槽”消息,我的插槽当我点击链接时永远不会被调用。

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

【问题讨论】:

    标签: qt signals-slots


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢你 - 它帮助我找出了我遗漏的大部分内容(我引用了):openExternalLinks: Specifies whether QLabel should automatically open links using QDesktopServices::openUrl() instead of emitting the linkActivated() signal.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 2013-02-06
    • 1970-01-01
    • 2012-05-19
    • 2012-12-07
    • 2014-08-31
    • 2016-06-24
    相关资源
    最近更新 更多