当主窗口隐藏时,Qt应用程序会自动退出

4

我是一名新手在Qt中。我遇到了一个奇怪的问题。当我隐藏我的主窗口(它会在应用程序启动时打开)之后,我的应用程序会自动关闭一段时间。但是如果我不使用这个->hide()函数,应用程序就可以正常工作。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "aclogin.h"
#include "atm.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_bank_clicked();
    void on_pushButton_atm_clicked();

private:
    Ui::MainWindow *ui;
    aclogin *_login;
    atm *_atmEnter;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowFlags(Qt::Window | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_bank_clicked()
{
    this->hide();
    _login = new aclogin(this);
    _login->setWindowTitle("Log In");
    _login->setModal(true);
    _login->show();
}

void MainWindow::on_pushButton_atm_clicked()
{
    this->hide();
    _atmEnter = new atm(this);
    _atmEnter->setWindowTitle("ATM");
    _atmEnter->setModal(true);
    _atmEnter->show();
}

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow *_BankSystem = new MainWindow();
    _BankSystem->setWindowTitle("Bank System");
    _BankSystem->show();

    return a.exec();
}

如果我隐藏其他窗口,应用程序就可以正常工作。

缩减了代码,并添加了一个.ui文件。原帖中所示的行为是正确的。在执行hide()方法时:

主窗口确实会隐藏 应用程序从dock中消失 应用程序从任务管理器中消失 (有趣的是,从Creator的角度来看,应用程序并没有退出。如果我点击运行按钮,它会给我“等待应用程序停止”的消息。)

/* mainwindow.h */

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private slots:
    void on_pushButton_bank_clicked();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

/* mainwindow.c */
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}


MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_bank_clicked()
{
    this->hide();
}

/* 主函数.c */

#include "mainwindow.h"
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow *_BankSystem = new MainWindow();

    _BankSystem->show();

    return a.exec();
}

这里是 .ui 文件:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <widget class="QPushButton" name="atm">
   <property name="geometry">
    <rect>
     <x>80</x>
     <y>30</y>
     <width>80</width>
     <height>18</height>
    </rect>
   </property>
   <property name="text">
    <string>atm</string>
   </property>
  </widget>
  <widget class="QPushButton" name="bank">
   <property name="geometry">
    <rect>
     <x>230</x>
     <y>30</y>
     <width>80</width>
     <height>18</height>
    </rect>
   </property>
   <property name="text">
    <string>bank</string>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

这不正常也不是预期的。在我工作使用Qt的11年中,我从未见过这种行为。 - drescherjm
1
你的代码不完整,似乎需要“ui_mainwindow.h”。请将其简化为一个[mcve],以演示问题;谢谢。 - Toby Speight
1
代码示例很好。我花了5分钟就能创建自己的UI文件,并重现他的问题。任何具备Qt设计师知识的人都可以做到同样的事情,而那些没有这种知识的人可能不应该尝试回答这个问题。 - mzimmers
1
一个完整的示例是该网站的要求。第二个评论中的链接解释了这一点。 - drescherjm
好吧,也许代码示例不是“完美的”,但考虑到我能够重现他的问题(并确认QWidget表现出相同的行为),它似乎是一个合法的问题,值得解决。如果它被关闭,我们就无法让更多的人看到它,这将是一件遗憾的事情。当然,这只是我的个人意见。 - mzimmers
2个回答

2

QGuiApplication

quitOnLastWindowClosed : bool 该属性指示当最后一个窗口关闭时,应用程序是否隐式退出。

默认值为true。

如果该属性为true,则当最后一个可见的主窗口(即没有父窗口的窗口)关闭时,应用程序将退出。

访问函数:

bool    quitOnLastWindowClosed()
void    setQuitOnLastWindowClosed(bool quit)

此外,MainWindow *_BankSystem = new MainWindow(); 存在内存泄漏问题。您可以通过为 new MainWindow() 添加父级、删除或使用智能指针来解决这个问题。

“Original Answer” 的翻译是“最初的回答”。


0
使用 a.setQuitOnLastWindowClosed(false) 作为 QApplication::setQuitOnLastWindowClosed,以防止应用程序在最后一个窗口关闭时终止。

3
不确定这是否是问题所在。问题是关于隐藏MainWindow而不是关闭它。 - drescherjm
a.setQuitOnLastWindowClosed(false) 不会重新打开应用程序。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接