5

我的 Qt GUI 应用程序中有一个实用程序类。但是,在我的便利课中,我想调用 a QMessageBox::critical(),warning()等。该类不是 a 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())。

4

2 回答 2

9

只需传递NULL第一个参数:

QMessageBox::critical(NULL, QObject::tr("Error"), QObject::tr("..."));
于 2013-03-19T15:17:38.597 回答
5

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

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

我们使用 qobject_cast<> 而不是 C 或 C++ 风格的转换是因为它增加了一点保护,如果它不能向上转换到 QWidget * 将返回 0。

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

于 2013-03-19T16:05:17.380 回答