Qt窗口hide()后的关闭机制

假设有这么一个“游戏”需求:

1、用户登陆界面。

2、登陆成功后,才能进入“游戏”主界面。

如图:

登陆成功了,游戏界面显示了,但登陆界面并没有消失/隐藏。

为了使登陆界面隐藏,我们调用了hide()函数:

问题来了:

当“游戏”窗口关闭后,这个隐藏的“登陆”窗口怎么办?是否还在运行?如果关闭了,是属于正常关闭么?

当然,强大的“信号和槽”机制给任何问题都提供了一个行得通的思路,即:重写closeEvent(QCloseEvent *event)的方法来通知“登陆窗口”.......

其实,“游戏”窗口关闭后,隐藏的“登陆”窗口属于正常关闭

Qt的帮助文档里面是这么说的:

quitOnLastWindowClosed : bool

This property holds whether the application implicitly quits when the last window is closed.

The default is true.

If this property istrue, the applications quits when the last visible primary window (i.e. window with no parent) is closed.

Access functions:

bool quitOnLastWindowClosed()

void setQuitOnLastWindowClosed(bool quit).

即:

quitOnLastWindowClosed是一个bool型的属性,这个属性用来保留"当最后一个窗口关闭的时候,应用程序是否隐式退出",默认值是true。

当这个属性为true的时候,应用程序会在最后一个可见的主窗口(比如:没有父窗口的窗口)关闭的时候退出。

访问函数:

quitOnLastWindowClosed()来获取当前的具体值。

setQuitOnLastWindowClosed(bool quit)来更改当前值。true:退出,false:不退出。

 

因此,当main函数做以下更改时,"登陆"窗口不会关闭,如图所示:

打赏二维码:

  • 11
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 在Qt中,要实现窗口关闭后打开另一个窗口,可以使用信号与槽机制来实现。 首先,在需要打开的窗口类中,我们可以定义一个槽函数,用于接收来自其他窗口的信号。这个槽函数可以是一个普通的成员函数,用于打开新窗口。 接下来,在需要关闭窗口类中,在窗口关闭的事件中发送一个信号。可以使用窗口的closeEvent()函数来捕获窗口关闭事件,并发出自定义的信号。 然后,在主窗口中,创建需要打开的窗口对象,并将其信号与关闭窗口的槽函数进行连接。可以使用QObject类的connect()函数来实现信号与槽的连接。 最后,运行程序,当关闭窗口时,会触发窗口关闭事件,发送关闭信号,从而触发槽函数,打开新的窗口。 例如:代码示例 MainWindow.h中定义: ``` class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void openNewWindow(); private: Ui::MainWindow *ui; AnotherWindow *anotherWindow; }; ``` MainWindow.cpp中实现: ``` MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); anotherWindow = new AnotherWindow(); connect(this, SIGNAL(close()), anotherWindow, SLOT(show())); } MainWindow::~MainWindow() { delete ui; } void MainWindow::openNewWindow() { // 打开新窗口的逻辑 } ``` AnotherWindow.h中定义: ``` class AnotherWindow : public QWidget { Q_OBJECT public: AnotherWindow(QWidget *parent = nullptr); ~AnotherWindow(); public slots: void showNewWindow(); private: Ui::AnotherWindow *ui; }; ``` AnotherWindow.cpp中实现: ``` AnotherWindow::AnotherWindow(QWidget *parent) : QWidget(parent), ui(new Ui::AnotherWindow) { ui->setupUi(this); connect(this, SIGNAL(show()), this, SLOT(showNewWindow())); } AnotherWindow::~AnotherWindow() { delete ui; } void AnotherWindow::showNewWindow() { // 显示新窗口的逻辑 } ``` 这样,当关闭窗口时,会触发主窗口的close()信号,并调用槽函数openNewWindow(),从而执行打开新窗口的逻辑。同时,新窗口中的槽函数showNewWindow()会在其信号show()被触发时调用,执行显示新窗口的逻辑。 ### 回答2: 在Qt中,要实现窗口关闭后打开另一个窗口,可以通过以下步骤来实现: 1. 创建两个窗口类,比如`MainWindow`和`SecondWindow`。在这两个类的头文件中,使用`#include`指令引入Qt相关的头文件,并继承`QMainWindow`类。 2. 在`MainWindow`类中,在构造函数中创建一个按钮,并设置按钮的文本为"打开窗口"。连接按钮的`clicked()`信号到槽函数`openSecondWindow()`。 3. 在`openSecondWindow()`槽函数中,创建一个`SecondWindow`类的对象,然后使用`show()`函数显示该窗口。 4. 在`SecondWindow`类中,可以继续添加其他窗口中需要的控件。 5. 在`MainWindow`的实现文件中,实现`openSecondWindow()`槽函数,通过`SecondWindow`类的构造函数创建一个`SecondWindow`类的对象,并显示出来。 6. 编译运行程序后,在`MainWindow`中点击"打开窗口"按钮,`SecondWindow`窗口将会显示出来。 下面是示例代码: mainwindow.h文件: ```cpp #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void openSecondWindow(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H ``` mainwindow.cpp文件: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "secondwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); QPushButton *button = new QPushButton("打开窗口", this); connect(button, &QPushButton::clicked, this, &MainWindow::openSecondWindow); } MainWindow::~MainWindow() { delete ui; } void MainWindow::openSecondWindow() { SecondWindow *secondWindow = new SecondWindow(this); secondWindow->show(); } ``` secondwindow.h文件: ```cpp #ifndef SECONDWINDOW_H #define SECONDWINDOW_H #include <QMainWindow> namespace Ui { class SecondWindow; } class SecondWindow : public QMainWindow { Q_OBJECT public: explicit SecondWindow(QWidget *parent = nullptr); ~SecondWindow(); private: Ui::SecondWindow *ui; }; #endif // SECONDWINDOW_H_H ``` secondwindow.cpp文件: ```cpp #include "secondwindow.h" #include "ui_secondwindow.h" SecondWindow::SecondWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::SecondWindow) { ui->setupUi(this); } SecondWindow::~SecondWindow() { delete ui; } ``` 以上就是使用Qt实现窗口关闭后打开另一个窗口的简单示例。通过点击`MainWindow`中的按钮,可以打开一个新的`SecondWindow`窗口。 ### 回答3: 在Qt中,要在关闭一个窗口后打开另一个窗口,我们可以使用信号与槽机制来实现。首先,我们需要定义两个窗口类,一个是用于关闭窗口类,另一个是要打开的窗口类。 在关闭窗口类中,我们可以重写closeEvent()函数来捕捉窗口关闭事件。在该函数中,我们可以发射一个自定义的信号,表示窗口关闭。例如: ```cpp void CloseWindow::closeEvent(QCloseEvent *event) { // 发射自定义的关闭信号 emit windowClosed(); // 执行默认的关闭操作 event->accept(); } ``` 在打开窗口类中,我们可以使用槽函数来接收关闭信号,并在槽函数中实现打开另一个窗口的操作。例如: ```cpp void OpenWindow::openNewWindow() { // 创建新的窗口对象 NewWindow *newWindow = new NewWindow(); // 显示新的窗口 newWindow->show(); } ``` 接下来,我们需要在主程序中连接信号与槽,并执行Qt的事件循环。例如: ```cpp int main(int argc, char *argv[]) { QApplication a(argc, argv); // 创建关闭窗口对象 CloseWindow *closeWindow = new CloseWindow(); // 创建打开窗口对象 OpenWindow *openWindow = new OpenWindow(); // 连接关闭信号与打开槽函数 QObject::connect(closeWindow, SIGNAL(windowClosed()), openWindow, SLOT(openNewWindow())); // 显示关闭窗口 closeWindow->show(); // 执行Qt的事件循环 return a.exec(); } ``` 这样,当关闭窗口关闭时,就会发射关闭信号,触发打开槽函数,在槽函数中实现打开另一个窗口的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值