QWidget的isHidden和isVisible

article/2025/10/13 2:20:16

文章目录

  • 问题的出现
  • QWidget的show()函数
  • QWidget的isVisible和isHidden
  • 源码追溯

QWidget的isHidden和isVisible

问题的出现

最近在写代码的时候,出现了一个问题,我新建了两个类,分别是Chapter2和ConsecutiveCurtain

// ConsecutiveCurtain.cpp
ConsecutiveCurtain::ConsecutiveCurtain(QWidget *parent):QWidget(parent)
{number = 1;this->setFixedSize(1920, 1080);
}void ConsecutiveCurtain::start()
{if (m_curtainList.isEmpty()) {qDebug() << "显示列表为空";return;}m_curtain = new Curtain(m_curtainList.at(0), this);connect(m_curtain, &Curtain::signal_pageEnd,this, &ConsecutiveCurtain::slot_nextPage, Qt::UniqueConnection);m_curtain->start();
}
// chapter2.cpp
Chapter2::Chapter2(QWidget *parent):QWidget(parent)
{m_curtains = new ConsecutiveCurtain(this);this->start();
}void Chapter2::slot_Curtains1()
{m_phone->close();QStringList curtains;curtains.push_back("chapter2_4.png");curtains.push_back("chapter2_5.png");curtains.push_back("chapter2_6.png");curtains.push_back("chapter2_7.png");m_curtains->setCurtainList(curtains);connect(m_curtains, &ConsecutiveCurtain::signal_consecutiveCurtainEnd,this, &Chapter2::slot_Phone2);m_curtains->start();m_curtains->show();
}

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

这几个的结构如图所示:

 

但是在我新建ConsecutiveCurtain这个类的实例,并在chapter2.cppshow()时,什么都没有显示。

我左思右想,发现了两种解决方法:

第一种方法是:

ConsecutiveCurtain::ConsecutiveCurtain(QWidget *parent):QWidget(parent)
{number = 1;this->setFixedSize(1920, 1080);this->hide();
}

ConsecutiveCurtain类里调用this->hide(),之后就可以正常显示了。

第二种方法是:

void ConsecutiveCurtain::start()
{if (m_curtainList.isEmpty()) {qDebug() << "显示列表为空";return;}m_curtain = new Curtain(m_curtainList.at(0), this);connect(m_curtain, &Curtain::signal_pageEnd,this, &ConsecutiveCurtain::slot_nextPage, Qt::UniqueConnection);m_curtain->show();m_curtain->start();
}

 在start()函数里调用m_curtain->show()

两种方法都可以显示出来,于是我开始纠结,为啥会显示。第二方法我还是能理解的,因为直接把m_curtain显示出来了。但是第一种方法的调用hide()函数后,就可以显示的问题,使我百思不得其解。

QWidget的show()函数

在我印象中,show()是会将调用者和调用者的子窗口也一起show出来,于是我就有了一个疑问,在chapter2::slot_Curtains1函数中,我调用了m_curtains->show(),按道理是会将Consecutive中的m_curtain一起show()出来的。

于是我去看QWidget的源码,发现所有的show()函数,都是调用的setVisible()这一个函数。

void QWidgetPrivate::setVisible(bool visible)
{Q_Q(QWidget);if (visible) { // show// Designer uses a trick to make grabWidget work without showingif (!q->isWindow() && q->parentWidget() && q->parentWidget()->isVisible()&& !q->parentWidget()->testAttribute(Qt::WA_WState_Created))q->parentWidget()->window()->d_func()->createRecursively();//create toplevels but not children of non-visible parentsQWidget *pw = q->parentWidget();if (!q->testAttribute(Qt::WA_WState_Created)&& (q->isWindow() || pw->testAttribute(Qt::WA_WState_Created))) {q->create();}

这里的createRecursively则是去递归的show子窗口,这里是否创建子窗口有一个判断依据,那就是子窗口的isHidden是不是返回的false,也就是说子窗口是不是没有被隐藏。

void QWidgetPrivate::createRecursively()
{Q_Q(QWidget);q->create(0, true, true);for (int i = 0; i < children.size(); ++i) {QWidget *child = qobject_cast<QWidget *>(children.at(i));if (child && !child->isHidden() && !child->isWindow() && !child->testAttribute(Qt::WA_WState_Created))child->d_func()->createRecursively();}
}

QWidget的isVisible和isHidden

在找寻为什么调用hide()之后,就能正常显示时,我发现了这两个函数isVisibleisHidden,然后我用这两个函数加到代码里做测试(得到正确的测试方法不知道走了多少弯路)

void Chapter2::slot_Curtains1()
{m_phone->close();qDebug() << m_curtains->isVisible();QStringList curtains;curtains.push_back("chapter2_4.png");curtains.push_back("chapter2_5.png");curtains.push_back("chapter2_6.png");curtains.push_back("chapter2_7.png");m_curtains->setCurtainList(curtains);connect(m_curtains, &ConsecutiveCurtain::signal_consecutiveCurtainEnd,this, &Chapter2::slot_Phone2);m_curtains->start();m_curtains->show();qDebug() << m_curtains->isVisible();
}
void ConsecutiveCurtain::start()
{if (m_curtainList.isEmpty()) {qDebug() << "显示列表为空";return;}m_curtain = new Curtain(m_curtainList.at(0), this);connect(m_curtain, &Curtain::signal_pageEnd,this, &ConsecutiveCurtain::slot_nextPage, Qt::UniqueConnection);qDebug() << "m_curtain visible :" << m_curtain->isVisible();qDebug() << "m_curtain hidden :" << m_curtain->isHidden();m_curtain->start();
}

在不调用hide()函数时,输出如下:

 truem_curtain visible : falsem_curtain hidden : truetrue

调用hide()函数后,输出如下:

falsem_curtain visible : falsem_curtain hidden : falsetrue

然后我在查阅isHidden这个函数的手册时,发现如下解释:

 

到这里,我就恍然大悟:

如果不调用hide()函数,ConsecutiveCurtain的实例就不会隐藏,这样,m_curtain也就会被设置成隐藏,哪怕你show出父窗口,子窗口也会因为被隐藏这个原因,而不显示。
源码追溯

于是我又试着去源码里找这一部分的实现方法:

这是QWidget类的构造函数

我又溯源到init()函数…

 

这里我发现了一个q->setAttribute(Qt::WA_WState_Hidden);,这里相当于默认就给新建的窗口设置为隐藏,但是也没有找到帮助文档里所说的,于是我又继续往下寻找,我发现了一个setParent()函数

 

我找到这个setParent函数,

然后再setParent里找到了这个setParent_sys 

 

最终,我在这个setParent_sys里找到了这一句代码,也就是说,如果新设置的parent是可见的,就将当前窗口设置成隐藏属性。

 

至此,就找出了所有问题的答案… 

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓


http://chatgpt.dhexx.cn/article/2A6l8o0H.shtml

相关文章

QWidget鼠标操作

1、设置鼠标形状&#xff1a;鼠标放置在不同控件上&#xff08;有不同功能时&#xff09;鼠标的形状是不一样的。 鼠标跟踪&#xff1a;鼠标在某一个控件上移动&#xff0c;则会向对应的控件对象发送一个消息&#xff0c;去调用具体的某一个方法&#xff0c;可以在方法里面监听…

QWidget旋转方法

参考链接&#xff1a;https://stackoverflow.com/questions/43388464/rotate-whole-qwidget-by-angle 说明&#xff1a; 本文实现方法本质是使用QGraphics三件套&#xff0c;即View、Scene、Item&#xff0c;将QWidget控件作为Item显示&#xff0c;从而实现角度控制的目的&…

QWidget设置背景图及圆角

在Qt开发过程中&#xff0c;QWidget是经常作为主窗体的父窗口&#xff0c;有时我们需要对主窗口设置背景&#xff0c;设置圆角以达到美观的效果&#xff0c;通常的有以下三种方法&#xff1a;qss, QPalette设置以及paintEvent绘制。下面介绍这三种方法。 背景设置介绍 方法一&a…

QWidget之adjustSize

from PyQt5.Qt import * import sys# 创建一个应用程序对象 app QApplication(sys.argv)window QWidget()label QLabel(window) label.setText(学无止境) label.move(100, 100) label.setStyleSheet(background-color:gray)def changeCao():tmp label.text()学无止境label.…

初识QWidget

初识QWidget 在Qt中QWidget是一个非常关键和重要的类&#xff0c;推荐初学Qt的同学们第一个学习此类 在Qt的帮助手册中我们搜索QWidget&#xff0c;可以看到下图的描述 通过帮助手册我们了解到如果想使用QWidget这个类&#xff0c;需要包含QWidget这个头文件&#xff0c;Qt特…

QWidget继承

查看QWidget的继承于哪个类 方法一 随便写一个类继承自己QWidget 按住Ctrl鼠标单击QWidget即可 方法二 print(QWidget.__base__)方法三 print(QWidget.mro()) 链条式的继承展示 enjoy

QWidget(长文)

一、描述 1、QWidget 是用户界面的原子&#xff1a;它从窗口系统接收鼠标、键盘和其他事件&#xff0c;并在屏幕上绘制自己的表示。每个小部件都是矩形的&#xff0c;它们按Z顺序排序。小部件由其父部件和它前面的小部件剪裁。 2、未嵌入父窗口小部件的 QWidget 称为窗口。通…

QWidget的使用

一、QWidget介绍 QWidget是用户操作的原子接口&#xff0c;它从窗口系统中接收鼠标&#xff0c;键盘以及其他事件&#xff0c;并绘制图形界面。QT提供的默认窗口基类只有QMainWindow、QWidget、和QDialog这三种&#xff0c;QMainWindow是带有菜单栏和工具栏的主窗口类&#xf…

QWidget

QWidget QWidget是容器组件&#xff0c;继承自QObject类和QPaintDevice类。能够绘制自己和处理用户输入&#xff0c;是QT中所有窗口组件类的父类&#xff0c;是所有窗口组件的抽象&#xff0c;每个窗口组件都是一个QWidget&#xff0c;QWidget类对象常用作父组件或顶级组件使用…

QT学习总结之QWidget详解

1、说明 QWidget类是所有用户界面对象的基类。 QWidget是用户界面的原子类。它接收鼠标、键盘和来自系统的其他事件&#xff0c;并在屏幕上将它们绘制出来。每个Widget都是矩形的&#xff0c;并按照Z-order&#xff08;Z轴&#xff09;进行排序。一个Widget夹在它的Parent和它…

VS2019安装与使用教程

VS2019安装与使用教程 可能有很多小伙伴们&#xff0c;知道VS2019这个软件&#xff0c;但是不知道怎么安装与使用&#xff0c;下面我将具体介绍VS2019的安装方法与创建我们自己的C项目以及如何运行自己编写的代码&#xff01; Visual Studio 2019(VS2019)简介 Microsoft Visual…

vs2017初学c++环境配置及使用教程

作为一个计算机小白, 初学c的时候使用了vs2017, 配置环境如下 如图所示, 可以实现c的基本操作. 在vs2017的版本中, 取消了win32这个选项, 所以直接选择新建空项目. 在解决方案资源管理器中, 于源文件处新建.cpp文件, 即可执行操作. 如果出现闪现的情况, 则右键点击解决方案资…

【转载】VS2019使用技巧

大家好&#xff0c;今天分享几个我知道的实用 VS 技巧&#xff0c;而这些技巧我发现很多人都不知道。因为我经常在工作中遇到&#xff1a;我在同事电脑上解决问题&#xff0c;或在会议上演示代码示例时&#xff0c;使用了一些 VS “骚”操作&#xff0c;他们会好奇地问&#xf…

VS2019安装教程

VS2019安装教程 &#xff08;如果下面的博客没有能解决你的问题或者你还有其他关于计算机方面的问题需要咨询可以加博主QQ&#xff1a;1732501467&#xff09; 在安装完JDK后&#xff0c;现在还不能使用java来进行编程&#xff0c;此时你还需要一个java开发工具&#xff0c;其…

VS2017专业版使用最新版Qt5.9.2教程(最新教材)

VS2017专业版使用最新版Qt5.9.2教程&#xff08;最新教材&#xff09; 目录 VS2017专业版使用最新版Qt5.9.2教程&#xff08;最新教材&#xff09; 运行环境&#xff1a; 1.安装Qt5.9.2 2.安装Qt5.9与VS2017之间的插件: 3.配置Qt VS Tool的环境. 4.设置创建的Qt的项目的…

Visual Studio(VS)2013使用教程

目录 1、初始2、新建项目3、点下一步后&#xff0c;此步后点完成4、解决方案资源管理器5、新建文件6、代码完成后不要点调试7、头文件显示&#xff1a;无法打开源文件路径未被包含若这一步没问题&#xff0c;则可能新建项时路径出错①添加包含目录级如上述②移除文件&#xff0…

Visual Studio 2017安装和使用教程(详细

Visual Studio 2017安装和使用教程&#xff08;详细&#xff09; 2018-10-09 01:02 来源:c语言程序设计官方 </div>原标题&#xff1a;Visual Studio 2017安装和使用教程&#xff08;详细&#xff09; 前言 说在前面&#xff0c;各位读者记得将 C语言程序设计 设置星标…

VS2019初步使用

前言 前段时间把电脑重置了下&#xff0c;导致很多软件都被删除了&#xff0c;所以重新安装了&#xff0c;顺便把一些“陈年落后”的软件更新到了最新版。新版的软件和之前相比的确区别很大&#xff0c;更人性化了、功能也增加了不少&#xff0c;体会最深的就是Adobe Photosho…

VS2017下载地址和安装教程(图解)

VS2017下载地址和安装教程&#xff08;图解&#xff09; 继 VS2015 版本后&#xff0c;微软又推出了功能更加强大的VS 2017。 Visual Studio 2017 不仅支持 C#、C、Python、Visual Basic、Node.js、HTML、JavaScript 等各大编程语言&#xff0c;还能开发 iOS、Android 的移动…

VS2019安装和使用教程

提示&#xff1a;安装过程请保持网络流畅。 安装篇 首先需要去官网下载安装工具&#xff1a;点击此处跳转 跳转到官网后&#xff0c;如下图所示&#xff0c;点击社区模块的免费下载&#xff0c;之后应该会自动下载安装工具&#xff0c;如果没有自动下载&#xff0c;可以根据提…