QWidget 표시, 숨기기, 닫기, 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.
재인쇄할 경우 출처를 명시해 주시고, 부적절한 내용이 있으면 정정해 주시기 바랍니다.