Con*_*der 3 c++ user-interface qt
我的Qt GUI应用程序中有一个实用程序类.但是,在我的便利课中,我想调用一个QMessageBox::critical(),warning()等等.该类不是a QWidget,因此我不能this作为父级传递.QObject然而,我的类是子类,因此它可以运行诸如信号和插槽之类的东西.因此,要解决这个问题 - 如果可能的话 - 我是否应该查看属性API而不是使用静态API?
舱位声明:
class NetworkManager : public QObject
Run Code Online (Sandbox Code Playgroud)
这是一个失败的静态API调用的示例:
QMessageBox::critical(this, tr("Network"), tr("Unable to connect to host.\n"),
QMessageBox::Ok | QMessageBox::Discard);
Run Code Online (Sandbox Code Playgroud)
那么,如果我要构建一个基于Property的API消息框,是否可以以QObject某种方式调用它?我还没有真正使用过基于属性的API,但我从文档中了解到它似乎使用了一个事件循环(即exec()).
只需传递NULL第一个参数:
QMessageBox::critical(NULL, QObject::tr("Error"), QObject::tr("..."));
Run Code Online (Sandbox Code Playgroud)
比传递更好的方法nullptr是使用您已经在使用的 qobject 树(假设 NetworkManager 实例的父级是 QWidget;根据您的 qobject 树的外观调整父级的数量)
QMessageBox::critical(qobject_cast<QWidget *> (parent()), "Title", "Message");
Run Code Online (Sandbox Code Playgroud)
我们使用 qobject_cast<> 而不是 C 或 C++ 风格的类型转换是因为它增加了一点保护,如果它不能向上转换到 QWidget *将返回 0。
如果您使用nullptr的QMessageBox将表现为集中在顶层窗口(QWidget的),而不是窗口,实际上是在你的QObject的树出现上涨NetworkManager类。这真的让拥有多台显示器、打开了许多窗口、来自单个应用程序的多个窗口跨越多个显示器等的人很恼火。