Qt 之 show,hide,setVisible,setHidden,close 等小结

本文详细解析了Qt中用于对象管理和界面控制的关键函数,包括deleteLater(), setVisible(), setHidden(), show(), hide(), close(), done(), accept(), reject()等。通过源码分析帮助理解这些函数的工作原理及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不知道标题该怎么取了,文中就简单整理一下下面几个函数吧。因为不断有网友问到此类问题(包括相关问题),所以,自己整理一下,也算学习小结了。

 

这些函数分两类,一类是用来删除对象的(从内存中干掉),一类是用来隐藏窗口的(从界面上干掉)

 

0

QObject::deleteLater()

delete obj;析构对象

1

QWidget::setVisible(bool)

使得Widget可见或不可见

2

QWidget::setHidden(bool)

1号的马甲

3

QWidget::show()

1号的马甲

4

QWidget::hide()

1号的马甲

5

QWidget::close()

视情况确定是否调用4号0号

6

QDialog::done(int)

始终会调用4号,视情况调用0号

7

QDialog::accept()

6号的马甲

8

QDialog::reject()

6号的马甲

写在前面

我们知道,

  • 分配到heap中的对象(通过 new),当对其delete,才会被析构。
  • 分配在stack中的对象,当其离开作用域是被析构

在 Qt 中,一般建议你使用 new 的方式创建对象。或者,你可以看看  从 Qt 的 delete 说开来

注意:

本文接下来的讨论,都是假定你用的 new 创建的对象。

QObject

从Qt类的祖宗开始吧。因为QObject不涉及界面啊,成员中只涉及析构问题。在从 Qt 的 delete 说开来 一文中,我们知道,

obj->deleteLater();

最后调用的就是:

delete obj;

很简单哈。所以,这个函数的谈论(略)

另外:对象析构时会发射 destroyed 信号。注意,是对象析构时,这是句废话,但要记住。

QWidget

setVisible

呵呵,show()、hide()、setVisible()、setHidden() 这4个函数让人看得眼花缭乱。怎么办?

看看代码吧:

    virtual void setVisible(bool visible);
    inline void setHidden(bool hidden) { setVisible(!hidden); }
    inline void show() { setVisible(true); }
    inline void hide() { setVisible(false); }

代码很清楚:这四个东西之中,只有 setVisible 是独立的,其他三个都是它的马甲!

setVisible 的作用是什么呢?顾名思义,使得一个Widget可见或不可见。

 

要点:不可见,是Widget不在界面上显示,但不代表对象被析构!

close

这个函数,Manual中给的其实很详细的,很透彻。但一开始想弄明白还真是不容易。

首先,我们直接调用close时(或者点击关闭按钮调用),它会生成 QCloseEvent 事件:(我们可以选择接受或阻止它,如果我们阻止事件,close将直接返回,什么都不做)

看点源码:

bool QWidgetPrivate::close_helper(CloseMode mode)
{
...
        QCloseEvent e;
        if (mode == CloseWithSpontaneousEvent)
            QApplication::sendSpontaneousEvent(q, &e);
        else
            QApplication::sendEvent(q, &e);
        if (!that.isNull() && !e.isAccepted()) {
            data.is_closing = 0;
            return false;
        }
...
}

其次:如果我们接受了事件(默认),她就直接调用我们前面提到的朋友。(从界面上干掉)

q->hide();

再次:如果我们为它设置过标记位(关闭时删除它):又看到老朋友不是?(从内存中干掉)

        if (q->testAttribute(Qt::WA_DeleteOnClose)) {
            q->setAttribute(Qt::WA_DeleteOnClose, false);
            q->deleteLater();
        }

题外:close 还是其他代码,但与本主题无关,不再涉及。

QDialog

QDialog 和 QWidget 相比,多了 done、reject 和 accept 3个相关函数:

先看看两个马甲:

void QDialog::accept()
{
    done(Accepted);
}

void QDialog::reject()
{
    done(Rejected);
}

done

done 做的事情和close比较类似:因为它调用了close所调用的 close_helper 函数。只不过不同于close函数,它始终会先让Widget不可见。然后close操作,最后根据参数发射信号

void QDialog::done(int r)
{
    Q_D(QDialog);
    hide();
    setResult(r);

    d->close_helper(QWidgetPrivate::CloseNoEvent);

    emit finished(r);
    if (r == Accepted)
        emit accepted();
    else if (r == Rejected)
        emit rejected();
}

注意:QDilaog可能包含事件循环,事件循环由QDialog::exec() 开始,QDialog::setVisible(false)将负责退出事件循环,这儿用的是其马甲hide()。

参考

 

### 关于Qt ChartView 组件的隐藏和显示 对于 `ChartView` 的隐藏与显示操作,主要依赖于继承自 `QWidget` 或者其他基类所提供的基本可见性控制函数。具体来说: - 使用 `setVisible(bool visible)` 方法来设置图表视图是否可见。当参数设为 `true` 时,组件变得可见;反之则不可见。 - 可以调用 `hide()` 函数快速将 `ChartView` 设置为不可见状态。 - 同样地,通过调用 `show()` 来使之前被隐藏的对象重新显现。 下面给出一段简单的 Python 代码示例展示如何实现这些功能: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QPushButton, QWidget from PyQt5.QtCharts import QChart, QChartView, QSplineSeries class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle('Chart Visibility Example') layout = QVBoxLayout() chart = QChart() series = QSplineSeries(chart) series.append(0, 6) series.append(2, 4) series.append(3, 8) series.append(7, 4) series.append(10, 5) chart.addSeries(series) chart.createDefaultAxes() self.chart_view = QChartView(chart) layout.addWidget(self.chart_view) toggle_button = QPushButton("Toggle Visibility") toggle_button.clicked.connect(lambda: self.toggle_chart_visibility()) layout.addWidget(toggle_button) container = QWidget() container.setLayout(layout) self.setCentralWidget(container) def toggle_chart_visibility(self): current_state = self.chart_view.isVisible() new_state = not current_state if new_state: self.chart_view.show() else: self.chart_view.hide() if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.resize(400, 300) window.show() exit(app.exec_()) ``` 这段程序创建了一个窗口,在其中包含了按钮用于切换 `ChartView` 的可见性[^1]。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值