隐藏mainWindow时Qt应用程序自动退出

时间:2019-03-08 13:53:13

标签: c++ qt

我是Qt的新手。我有一个奇怪的问题。当我隐藏mainWindow(在应用程序启动时打开)时,我的应用程序将在一段时间后自动关闭。但是,如果我不使用this-> 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文件。 OP指示的行为是正确的。执行hide()方法后:

主窗口确实隐藏了 该应用程序从码头上消失了 该应用程序从任务管理器中消失 (有趣的是,从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();
}

/ * main.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>

2 个答案:

答案 0 :(得分:1)

QGuiApplication

quitOnLastWindowClosed:布尔 此属性保存在关闭最后一个窗口时是否隐式退出应用程序。

默认值为true。

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

访问功能:

bool    quitOnLastWindowClosed()
void    setQuitOnLastWindowClosed(bool quit)

此外,您在MainWindow *_BankSystem = new MainWindow();处发生内存泄漏。您可以通过向new MainWindow()添加父项,删除或智能指针来解决此问题。

答案 1 :(得分:0)

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