超時方法是一個體面的想法,但如果用戶調整大小,然後暫停超過定時器的時間間隔,那麼最終不會得到真正的「用戶完成調整窗口大小」事件。設置較長的時間間隔使得這種情況變得不太可能,但是通過這樣做,最終在用戶完成調整大小和調用函數的時間之間有很長的延遲。在我尋找解決方案時,我發現不少人使用定時器方法解決問題,所以顯然它對於某些用例足夠可靠,但我認爲這有點不方便。
我喜歡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; }
它比計時器稍微複雜一點,但更健壯。