이 기사에서는 Qt Widget의 표시, 숨기기, 닫기, setVisible 및 setHidden의 기능과 차이점을 이해하도록 안내합니다.


기존의 생각에 따르면 표시, 숨기기, 삭제의 세 가지 방법을 가진 GUI 창은 표시 및 숨기기의 요구를 충족할 수 있어야 합니다. 실제로 Qt의 창은 여러 가지 방법을 제공합니다. 주의 깊게 연구하지 않으면 좀 헷갈리시죠. 뭐라고 불러야할지 모르실텐데요. 어떤 방법이 맞는지요? 이 기사에서는 Qt의 소스 코드를 결합하여 알아봅니다.
이러한 메소드는 qwidget.h 헤더 파일에 정의되어 있습니다.

public Q_SLOTS:
    // Widget management functions
    virtual void setVisible(bool visible);
    void setHidden(bool hidden);
    void show();
    void hide();
    
    void showMinimized();
    void showMaximized();
    void showFullScreen();
    void showNormal();
    
    bool close();
    void raise();
    void lower();

1. 소스코드 분석

1.쇼

소스 코드 구현:

void QWidget::show()
{
    
    
    Qt::WindowState defaultState = QGuiApplicationPrivate::platformIntegration()->defaultWindowState(data->window_flags);
    if (defaultState == Qt::WindowFullScreen)
        showFullScreen();
    else if (defaultState == Qt::WindowMaximized)
        showMaximized();
    else
        setVisible(true); // Don't call showNormal() as not to clobber Qt::Window(Max/Min)imized
}

역할은 창과 해당 하위 위젯을 표시하는 것입니다.
소스 코드 구현이 시스템 플랫폼의 창 플래그를 기반으로 호출 동작을 결정한다는 것을 알 수 있습니다. 이는
실제로 showFullScreen(), showMaximized() 또는 setVisible(true) 호출과 동일합니다.

2.숨기기

소스 코드 구현:

void QWidget::hide()
{
    
    
    setVisible(false);
}

실제로 setVisible이 호출되고 hide는 setVisible의 조끼와 동일하다는 것을 알 수 있습니다.

3.닫기

소스 코드 구현:

bool QWidgetPrivate::close_helper(CloseMode mode)
{
    
    
	//...省略部分
    bool quitOnClose = q->testAttribute(Qt::WA_QuitOnClose);
    if (mode != CloseNoEvent) {
    
    
        QCloseEvent e;
        if (mode == CloseWithSpontaneousEvent)
            QApplication::sendSpontaneousEvent(q, &e);
        else
            QCoreApplication::sendEvent(q, &e);
        if (!that.isNull() && !e.isAccepted()) {
    
    
            data.is_closing = 0;
            return false;
        }
    }
    if (!that.isNull() && !q->isHidden())
        q->hide();
        
	//...省略部分
    if (!that.isNull()) {
    
    
        data.is_closing = 0;
        if (q->testAttribute(Qt::WA_DeleteOnClose)) {
    
    
            q->setAttribute(Qt::WA_DeleteOnClose, false);
            q->deleteLater();
        }
    }
    return true;
}
bool QWidget::close()
{
    
    
    return d_func()->close_helper(QWidgetPrivate::CloseWithEvent);
}


여기의 소스 코드는 상대적으로 길고 키 코드의 일부만 추출되었습니다. 분석을 바탕으로 창을 닫는 닫기 기능을 얻을 수 있습니다 . 닫혀 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
먼저 QCloseEvent를 창에 보냅니다. QWidget::closeEvent()의 구현은 닫기 이벤트를 허용합니다.
그러면 hide() 함수도 close에서 호출됩니다.
창에 Qt::WA_DeleteClose 플래그가 설정되어 있으면 닫기 호출 후 창이 삭제된다는 점에 유의해야 합니다.

4.설정표시

소스코드 구현이 상대적으로 길기 때문에 소스코드는 여기에 올리지 않겠습니다. 많은 연산과 판단이 이루어졌습니다. 핵심 기능은
@1입니다. 속성을 표시하거나 숨길 속성을 설정합니다.
setAttribute(Qt:: WA_WState_Visible, bool 표시);

@2. QShowEvent 또는 QHideEvent 이벤트 보내기
QShowEvent showEvent 또는 QHideEvent hideEvent;
QCoreApplication::sendEvent(q, &showEvent);

@3. QWidgetWindow 함수는 기본 창 window-
>setNativeWindowVisibility(bool)을 표시하거나 숨기기 위해 호출됩니다.

물론 이 기능은 하위 컨트롤의 포커스 관련 표시 및 숨기기 작업도 처리합니다.

5.숨겨진 설정

void QWidget::setHidden(bool hidden)
{
    
    
    setVisible(!hidden);
}

이 함수는 setVisible을 직접 호출하는 setVisible의 조끼입니다.

2. 역할과 차이점을 요약해 보세요.

표시 : show, setVisible(true), setHidden(false)

Hide : hide, close, setHidden(true), setVisible(true)
setAttribute(Qt::WA_DeleteClose); 속성이 설정되면 close를 호출하면 창이 삭제됩니다.

차이점 : setVisible은 하위 수준 인터페이스이며 기본적으로 여러 다른 메서드가 이 인터페이스를 호출합니다.
그 중 hide와 setHidden은 이 함수를 직접 호출하여 구현한 setVisible의 완전한 조끼라 할 수 있다.

창이 파기될 때, setAttribute(Qt::WA_DeleteClose) 및 닫기 외에도 위젯 삭제 또는 widget->deleteLater()를 호출하여 파기할 수도 있습니다.

작성자: Feima Programmer
기술교류에 오신 것을 환영합니다: QQ: 255895056.
재인쇄할 경우 출처를 명시해 주시고, 부적절한 내용이 있으면 정정해 주시기 바랍니다.

Guess you like

Origin blog.csdn.net/haohaohaihuai/article/details/131717692