如何在QWidget子类之外调用QMessageBox Static API

时间:2013-03-19 15:01:26

标签: c++ qt user-interface

我的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);

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

2 个答案:

答案 0 :(得分:7)

只需传递NULL第一个参数:

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

答案 1 :(得分:3)

比传递nullptr更好的方法是使用您正在使用的qobject树(假设NetworkManager实例的父级是QWidget;根据qobject树的任何内容调整父级的数量)

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

我们使用qobject_cast&lt;&gt;如果它不能向上投射到QWidget *,而不是C或C ++样式,because it adds a little protection and will return 0

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