Qt的isVisible ()函数介绍和判断窗口是否在当前界面显示
1、现象:当Qt的窗口最小化时,isVisible值一定是true,这是正常的。
解释:在Qt中,当你点击窗口的最小化按钮时,Qt内部不会自动调用 hide()
方或 setVisible(false)
来隐藏窗口。相反,它会改变窗口的状态,将其标记为最小化。窗口的最小化是一个特殊的状态,不同于被显式隐藏。在最小化状态下,窗口的内容不再显示在屏幕上,但它仍然存在于系统中,并且可以通过操作系统恢复显示。Qt通过 isMinimized()
方法提供了检测窗口是否处于最小化状态的能力。
2、isVisible()
方法在以下情况下返回 true
:
- 窗口已经被创建并且没有被调用
hide()
方法隐藏。 - 窗口没有被父窗口(如果有的话)隐藏或遮挡到不可见。
- 窗口没有被操作系统级别的其他窗口遮挡到不可见(这通常取决于窗口管理器和操作系统的行为,但
isVisible()
本身不考虑这一点)。
isVisible()
方法在以下情况下返回 false
:
- 窗口被显式调用
hide()
方法隐藏。 - 窗口被其父窗口隐藏(如果父窗口被隐藏,通常子窗口也会被隐藏,除非它们被设置为独立于父窗口显示)。
- 窗口被关闭(即调用了
close()
方法)。注意,关闭窗口通常会触发窗口的销毁,但在某些情况下(比如设置了Qt::WA_DeleteOnClose
属性为false
),窗口可能仍然存在但不可见。
总结一下,isVisible()
方法主要用于检测窗口是否存在且没有被显式隐藏,而 isMinimized()
方法用于检测窗口是否被最小化。这两个方法提供了不同的信息,应该根据具体需求使用。
3、测试
//.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();QMainWindow* m_window{nullptr};
protected:void changeEvent(QEvent *event)override;
}
//.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);connect(ui->m_btn,&QPushButton::clicked,this,&MainWindow::OpenWindow);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::changeEvent(QEvent *event)
{QMainWindow::changeEvent(event);if (event->type() == QEvent::WindowStateChange) {if (isMinimized()) {qDebug() << "Window is minimized";qDebug() << "Visible1:----" << isVisible();hide();qDebug() << "Visible2:---- " << isVisible();} else if (isVisible()) {qDebug() << "Window is visible";}}
}
运行结果:
(1)点击最小化按钮时,打印如下:
(2)Visible为true时任务栏程序图标
(3)Visible为false时任务栏无程序图标
4、判断窗口显示在屏幕上方法
void MainWindow::changeEvent(QEvent *event)
{QMainWindow::changeEvent(event);if (event->type() == QEvent::WindowStateChange) {if (isVisible() && !isMinimized()) {//值是1,窗口就是显示qDebug() << "Window is visible and not minimized";} else if (!isVisible()) {qDebug() << "Window is hidden";} else if (isMinimized()) {qDebug() << "Window is minimized";}}
}
窗口非最小化且非隐藏状态即为显示状态,上面的判断窗口是否显示在屏幕上也可以主动调用isVisible() && !isMinimized()接口的值来判断。