Qt 中如何判断控件是否可见?比如切换 tab 页导致的另一个tab页不可见

王桑的一天 2020-09-14 04:42:27
这里说的是否可见,不是指隐藏了(hide()),而是界面切换、或切换 tab 页导致的某些控件当前不可见了。

我想当这个控件不可见了,如果能判断,就不在刷新它上面的状态,可以节约系统资源。因为它上面有数据要刷新
...全文
2798 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
只在Qt内部的话,只需要包装控件背景色被绘制出,就有遮挡。
  • 打赏
  • 举报
回复
visibleRegion() 可以解决部分需求。 当同是控件的时候,可以用这个判断是不是遮挡。 但是不能用来判断是否是另一个窗口挡在了这个窗口前面。这个也测试过了,不上结果了。 如果是窗口遮挡的情况,那就需要自己弄一下了,基本就是activeChange的时候判断操作系统打开的窗口的rect有没有遮挡住自己的。 看测试结果:
#include "test7.h"
#include <QDebug>

test7::test7(QWidget *parent) : QWidget(parent)
{
    this->resize(500, 300);
    this->setAutoFillBackground(true);

    t1 = new QWidget(this);
    t1->show();
    t1->setAutoFillBackground(true);
    t1->setStyleSheet("QWidget{background:red;}");
    t2 = new QWidget(this);
    t2->show();
    t2->setAutoFillBackground(true);
    t2->setStyleSheet("QWidget{background:green;}");
    t3 = new QWidget(this);
    t3->show();
    t3->setAutoFillBackground(true);
    t3->setStyleSheet("QWidget{background:blue;}");
    t4 = new QWidget(this);
    t4->show();
    t4->setAutoFillBackground(true);
    //t4->setStyleSheet("QWidget{background:black;}");

    t1->setGeometry(0, 0, 200, 100);
    t2->setGeometry(0, 0, 100, 200);
    t3->setGeometry(100, 100, 100, 100);
    t4->setGeometry(100, 100, 100, 100);
}

void test7::moveEvent(QMoveEvent *)
{
    qDebug()<<t1->visibleRegion()<<t2->visibleRegion()<<t3->visibleRegion()<<t4->visibleRegion();
    qDebug()<<this->visibleRegion();
}
QRegion(null) QRegion(null) QRegion(null) QRegion(null)
QRegion(null)
QRegion(0,0 200x100) QRegion(0,0 100x200) QRegion(null) QRegion(0,0 100x100)
QRegion(size=4, bounds=(0,0 500x300) - [(0,0 500x100), (0,100 100x100), (200,100 300x100), (0,200 500x100)])
能不能获得有效遮挡,主要看背景色是不是空的。显然这个背景色并不是用QSS设置的,那么还有个QPaintEvent。 改造t4:
class tt : public QWidget
{
    Q_OBJECT
public:
    tt(QWidget *parent = 0):QWidget(parent){}
protected:
    void paintEvent(QPaintEvent *)
    {
        QPainter p(this);
        p.fillRect(this->rect(), Qt::yellow);
    }
};
t4 = new tt(this);
QRegion(null) QRegion(null) QRegion(null) QRegion(null)
QRegion(null)
QRegion(0,0 200x100) QRegion(0,0 100x200) QRegion(null) QRegion(0,0 100x100)
QRegion(size=4, bounds=(0,0 500x300) - [(0,0 500x100), (0,100 100x100), (200,100 300x100), (0,200 500x100)])
mideum 2020-09-15
  • 打赏
  • 举报
回复
引用 2 楼 管理員 的回复:
不行的,isVisible() 是判断是否 hide() 了

并不是哦,isHidden()才是判断是否hide的,setVisible(true)以后实际上isVisible()并不一定返回true的
一个widget是有可能isHidden()和isVisible()同时都返回false的
王桑的一天 2020-09-15
  • 打赏
  • 举报
回复
引用 1 楼 mideum 的回复:
就用isVisible()不行吗
不行的,isVisible() 是判断是否 hide() 了
mideum 2020-09-14
  • 打赏
  • 举报
回复
就用isVisible()不行吗

16,815

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧