시간 초과 인 방법은 괜찮은 생각이지만 사용자가 크기를 조정하고 타이머 간격보다 오래 동안 일시 중지하면 실제 "사용자가 창 크기 조정 완료"이벤트를받지 못하게됩니다. 간격을 길게 설정하면 상황이 어려워 지지만 그렇게하면 사용자가 크기 조정을 마친 시간과 함수가 호출 된 시간 사이에 긴 지연이 발생하게됩니다. 솔루션을 찾는 데있어 타이머 메소드를 사용하여 해결하는 사람들이 꽤 많았으므로 일부 유스 케이스에서는 충분히 신뢰할 만하지만 분명히 조금 이상하다고 생각합니다.
나는 mhstnsc의 아이디어가 마음에 든다. 그래서 그것을 구현 한 후에 비슷한 것을하려고하는 누군가에게 쓸모있는 코드를 추가하기로 결정했다. m_bUserIsMoving 플래그를 만들고 "void MainWindow :: moveEvent (QMoveEvent * pEvent)"를 재정 의하여 "사용자가 창 이동 중"이벤트를 쉽게 잡을 수 있습니다.사용자가 크기 조정이나 창 이동을 마칠 때마다 구성 파일을 저장하기 위해이 파일을 사용하므로 앱이 부정한 방법으로 강제 종료 되더라도 마지막 위치가 항상 저장됩니다.
// constructor
MainWindow::MainWindow(QWidget* pParent, Qt::WindowFlags flags) : QMainWindow(pParent, flags)
{
m_bUserIsResizing = false;
qApp->installEventFilter(this);
}
// this will be called when any event in the application occurs
bool MainWindow::eventFilter(QObject* pObj, QEvent* pEvent)
{
// We need to check for both types of mouse release, because it can vary on which type happens when resizing.
if ((pEvent->type() == QEvent::MouseButtonRelease) || (pEvent->type() == QEvent::NonClientAreaMouseButtonRelease)) {
QMouseEvent* pMouseEvent = dynamic_cast<QMouseEvent*>(pEvent);
if ((pMouseEvent->button() == Qt::MouseButton::LeftButton) && m_bUserIsResizing) {
printf("Gotcha!\n");
m_bUserIsResizing = false; // reset user resizing flag
}
}
return QObject::eventFilter(pObj, pEvent); // pass it on without eating it
}
// override from QWidget that triggers whenever the user resizes the window
void MainWindow::resizeEvent(QResizeEvent* pEvent) { m_bUserIsResizing = true; }
타이머보다 약간 복잡하지만 강력합니다.