我有一个Qt应用程序,它使用QMainWindow
派生类作为主UI。在启动时,我想进行一些安全检查,如果失败,则向用户显示一条消息并关闭主窗口。目前我在QMainWindow
构造函数中进行了这些检查,但是如果我调用close
方法,则没有任何反应,应用程序继续运行。例如:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
setupUi(this);
...
if (checkFails())
{
QMessageBox::warning(this, tr("Error"), tr("You cannot run this app"));
// This has no effect
close();
}
}
或者我可以在main函数中进行检查,但后来我失去了显示特定于语言的消息框的能力(tr
宏仅适用于QObject
派生类的外观事情。)
有关如何在启动时关闭主窗口或使tr
宏在QObject
派生类之外工作的任何想法?
答案 0 :(得分:23)
在成功关闭主窗口之前,需要运行事件循环。由于您可能首先构造一个窗口,然后启动事件循环,close()
调用无效。请尝试以下解决方案:
QTimer::singleShot(0, this, SLOT(close()));
一旦启动了事件循环,QTimer::singleShot()
就会触发,然后在应用程序主窗口中调用close()
方法。
上述解决方案可能会导致您的主应用程序窗口在短时间内可见,从而导致不必要的闪烁。
更清洁的解决方案应在构建主窗口之前执行安全检查。由于tr()
在QObject
上也可用作静态方法,因此可以从main函数中完成。
答案 1 :(得分:2)
tr
是QObject的public static member。您应该可以在主要功能中拨打QObject::tr("Error")
。
答案 2 :(得分:2)
大多数应用程序分三步启动:1)构建窗口; 2)显示窗口; 3)启动事件循环。您可以通过将窗口构造函数设置的标志添加到窗口类来使步骤1成功的第2步和第3步成为条件:
窗口类:
class myMainWindowClass : public QMainWindow
{
Q_OBJECT
public:
myMainWindowClass()
: isFinished_(false) { if (error) isFinished_ = true; } // constructor
bool isFinished() const { return isFinished_; }
private:
bool isFinished_;
}
申请代码:
int main()
{
myMainWindowClass main_window(); // Step 1
// Finish early if isFinished flag is set
if (main_window.isFinished())
return 0;
main_window.show(); // Step 2
return a.exec(); // Step 3
}
这也应该避免任何闪烁,因为应用程序将在窗口show()n。
之前结束答案 3 :(得分:0)
你有没有尝试过第一次隐藏()窗口(当调用close()时应该会发生这种情况)看看是否允许close()来破坏窗口。
如果这不起作用,你总是可以试着破坏(真实,真实)窗口以及任何子窗口。