Qt close hide reject 등

4905 단어
제목을 어떻게 지어야 할지 모르겠으니 아래의 몇 가지 함수를 간단하게 정리해 봅시다.끊임없이 네티즌들이 이런 질문(관련 문제 포함)을 하기 때문에 스스로 정리하는 것도 학습 소결이라고 할 수 있다.
이 함수들은 두 종류로 나뉘는데, 하나는 대상을 삭제하는 데 쓰이고, 하나는 창을 숨기는 데 쓰인다.
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() 등 네 가지 함수는 눈이 어지럽게 보인다.어떡하죠?
    코드를 보십시오:
        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를 직접 호출할 때 (또는 닫기 단추를 누르면) QClose 이벤트를 생성합니다. (우리는 그것을 받아들이거나 막을 수 있습니다. 만약 우리가 이벤트를 막으면,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 () 를 사용합니다.

    참고 자료

  • http://doc.qt.nokia.com/4.7/qobject.html
  • http://doc.qt.nokia.com/4.7/qwidget.html
  • http://doc.qt.nokia.com/4.7/qdialog.html

  • 출처:http://blog.csdn.net/dbzhang800/article/details/6300021

    좋은 웹페이지 즐겨찾기