【问题标题】:How to call QMessageBox Static API outside of a QWidget Sub-Class如何在 QWidget 子类之外调用 QMessageBox 静态 API
【发布时间】:2013-03-19 15:01:26
【问题描述】:

我的 Qt GUI 应用程序中有一个实用程序类。但是,在我的便利课中,我想调用QMessageBox::critical()warning() 等。该类不是QWidget,因此我不能将this 作为父级传递。但是,我的类是 QObject 的子类,因此它可以运行诸如信号和插槽之类的东西。因此,要解决这个问题——如果可能的话——我是否应该查看属性 API 而不是使用静态 API?

类声明:

class NetworkManager : public QObject

下面是一个失败的静态 API 调用示例:

QMessageBox::critical(this, tr("Network"), tr("Unable to connect to host.\n"),
QMessageBox::Ok | QMessageBox::Discard);

那么,如果我要构建一个基于属性的 API 消息框,是否可以以某种方式在 QObject 中调用它?我并没有真正使用过基于属性的 API,但我从文档中了解到它似乎使用了事件循环(即exec())。

【问题讨论】:

  • 我以为你可以通过nullptr?对于静态便捷方法,对话框无论如何都固定为应用程序模式。
  • 这实际上是一个有趣的想法。这样做比使用我不熟悉的 API 重做 10 多个消息框要容易得多:P

标签: c++ qt user-interface


【解决方案1】:

第一个参数只需传递NULL

QMessageBox::critical(NULL, QObject::tr("Error"), QObject::tr("..."));

【讨论】:

    【解决方案2】:

    比传递nullptr 更好的方法是使用您已经在使用的 qobject 树(假设 NetworkManager 实例的父级是 QWidget;根据您的 qobject 树的样子调整父级的数量)

    QMessageBox::critical(qobject_cast<QWidget *> (parent()), "Title", "Message");
    

    如果不能向上转换为 QWidget *,我们使用 qobject_cast 代替 C 或 C++ 样式转换为 because it adds a little protection and will return 0

    如果您使用nullptrQMessageBox 将显示在最顶层窗口 (QWidget) 的中心,而不是实际出现在 NetworkManager 类的 qobject 树中较高位置的窗口。这真的让那些拥有多个显示器、打开大量窗口、来自单个应用程序的多个窗口跨越多个显示器等的人感到恼火。

    【讨论】:

    • 这是个好主意。但是,NetworkManager 基本上是由 MainWindow 使用的,所以使用 nullptr 应该没问题。不过,我会牢记这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    相关资源
    最近更新 更多