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