Sine Striker
2024-02-23 6c0043c1e3d97398828fbd56448f1cd8ee201e66
Fix bug of window closing and reshowing
5个文件已修改
78 ■■■■■ 已修改文件
examples/mainwindow/CMakeLists.txt 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/mainwindow/main.cpp 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/mainwindow/mainwindow.cpp 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qmsetup @ d767a8 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/core/contexts/win32windowcontext.cpp 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/mainwindow/CMakeLists.txt
@@ -4,7 +4,7 @@
qwk_add_example(${PROJECT_NAME}
    SOURCES ${_src} mainwindow.qrc ../shared/resources/shared.qrc
    QT_LINKS Core Gui Widgets
    QT_LINKS Core Gui Widgets # WebEngineWidgets
    LINKS QWKWidgets WidgetFrame
)
examples/mainwindow/main.cpp
@@ -33,7 +33,9 @@
    MainWindow w;
    w.show();
#if 0
    QMainWindow w2;
    w2.show();
#endif
    return a.exec();
}
examples/mainwindow/mainwindow.cpp
@@ -19,6 +19,8 @@
#  include <QtWidgets/QActionGroup>
#endif
// #include <QtWebEngineWidgets/QWebEngineView>
#include <QWKWidgets/widgetwindowagent.h>
#include <widgetframe/windowbar.h>
@@ -40,19 +42,25 @@
};
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
    installWindowAgent();
     installWindowAgent();
#if 1
    auto clockWidget = new ClockWidget();
    clockWidget->setObjectName(QStringLiteral("clock-widget"));
    clockWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    setCentralWidget(clockWidget);
#else
    auto webView = new QWebEngineView();
    webView->load(QUrl("https://www.baidu.com"));
    setCentralWidget(webView);
#endif
    loadStyleSheet(Dark);
    setWindowTitle(tr("Example MainWindow"));
    resize(800, 600);
    windowAgent->centralize();
    // windowAgent->centralize();
}
static inline void emulateLeaveEvent(QWidget *widget) {
@@ -117,9 +125,9 @@
void MainWindow::closeEvent(QCloseEvent *event) {
    if (!(qApp->keyboardModifiers() & Qt::ControlModifier)) {
        QTimer::singleShot(1000, this, &QWidget::show);
    }
    // if (!(qApp->keyboardModifiers() & Qt::ControlModifier)) {
    //     QTimer::singleShot(1000, this, &QWidget::show);
    // }
    event->accept();
}
@@ -295,14 +303,14 @@
    windowBar->setTitleLabel(titleLabel);
    windowBar->setHostWidget(this);
    windowAgent->setTitleBar(windowBar);
   windowAgent->setTitleBar(windowBar);
#ifndef Q_OS_MAC
    windowAgent->setSystemButton(QWK::WindowAgentBase::WindowIcon, iconButton);
    windowAgent->setSystemButton(QWK::WindowAgentBase::Minimize, minButton);
    windowAgent->setSystemButton(QWK::WindowAgentBase::Maximize, maxButton);
    windowAgent->setSystemButton(QWK::WindowAgentBase::Close, closeButton);
   windowAgent->setSystemButton(QWK::WindowAgentBase::WindowIcon, iconButton);
   windowAgent->setSystemButton(QWK::WindowAgentBase::Minimize, minButton);
   windowAgent->setSystemButton(QWK::WindowAgentBase::Maximize, maxButton);
   windowAgent->setSystemButton(QWK::WindowAgentBase::Close, closeButton);
#endif
    windowAgent->setHitTestVisible(menuBar, true);
   windowAgent->setHitTestVisible(menuBar, true);
#ifdef Q_OS_MAC
    windowAgent->setSystemButtonAreaCallback([](const QSize &size) {
qmsetup
@@ -1 +1 @@
Subproject commit 10bbb20ddf57899138dc4e1ab6c0a012cd052eb1
Subproject commit d767a85676092f6b04d2485143b534141d53aef7
src/core/contexts/win32windowcontext.cpp
@@ -695,12 +695,16 @@
    }
    void Win32WindowContext::winIdChanged(WId winId, WId oldWinId) {
        // Reset the context data
        mouseLeaveBlocked = false;
        lastHitTestResult = WindowPart::Outside;
        // If the original window id is valid, remove all resources related
        if (oldWinId) {
            removeManagedWindow(reinterpret_cast<HWND>(oldWinId));
        }
        if (!m_windowHandle || ! winId) {
        if (!m_windowHandle || !winId) {
            return;
        }
@@ -735,15 +739,11 @@
                                        LRESULT *result) {
        *result = FALSE;
        if (message == WM_DESTROY) {
            qDebug() << "WM_DESTROY";
        }
        // We should skip these messages otherwise we will get crashes.
        // NOTE: WM_QUIT won't be posted to the WindowProc function.
        switch (message) {
            case WM_CLOSE:
            case WM_DESTROY:
            case WM_CLOSE:
            case WM_NCDESTROY:
            // Undocumented messages:
            case WM_UAHDESTROYWINDOW:
@@ -755,20 +755,6 @@
        if (!isValidWindow(hWnd, false, true)) {
            return false;
        }
        switch (message) {
            case WM_NCMOUSELEAVE:
                qDebug() << "WM_NCMOUSELEAVE" << mouseLeaveBlocked;
                break;
            case WM_MOUSEHOVER:
                qDebug() << "WM_MOUSEHOVER" << mouseLeaveBlocked;
                break;
            case WM_NCMOUSEHOVER:
                qDebug() << "WM_NCMOUSEHOVER" << mouseLeaveBlocked;
                break;
            default:
                break;
        }
        // Test snap layout
@@ -1156,8 +1142,6 @@
                    }
                }
                mouseLeaveBlocked = false;
                qDebug() << "WM_MOUSELEAVE";
                break;
            }
@@ -1166,7 +1150,6 @@
                // we unset `mouseLeaveBlocked` mark and pretend as if Qt has received
                // WM_MOUSELEAVE.
                if (lastHitTestResult != WindowPart::ChromeButton && mouseLeaveBlocked) {
                    qDebug() << lastHitTestResult << "Track";
                    mouseLeaveBlocked = false;
                    requestForMouseLeaveMessage(hWnd, false);
                }
@@ -1243,19 +1226,14 @@
                        // the above problems would not arise.
                        m_delegate->resetQtGrabbedControl(m_host);
                        // If the mouse moves from chrome buttons to other non-client areas, a
                        // WM_MOUSELEAVE message should be sent.
                        if (mouseLeaveBlocked) {
                            emulateClientAreaMessage(hWnd, message, wParam, lParam,
                                                     WM_NCMOUSELEAVE);
                        }
                    }
                    // We need to make sure we get the right hit-test result when a WM_NCMOUSELEAVE
                    // comes, so we reset it when we receive a WM_NCMOUSEMOVE.
                    // If the mouse is entering the client area, there must be a WM_NCHITTEST
                    // setting it to `Client` before the WM_NCMOUSELEAVE comes; if the mouse is
                    // leaving the window, current window part remains as `Outside`.
                    // lastHitTestResult = WindowPart::Outside;
                }
                if (currentWindowPart == WindowPart::ChromeButton) {
@@ -1287,7 +1265,7 @@
                    // pressing area as HTCLIENT which maybe because of our former retransmission of
                    // WM_NCLBUTTONDOWN, as a result, a WM_NCMOUSELEAVE will come immediately and a
                    // lot of WM_MOUSEMOVE will come if we move the mouse, we should track the mouse
                    // in advance.
                    // in advance. (May be redundant?)
                    if (mouseLeaveBlocked) {
                        mouseLeaveBlocked = false;
                        requestForMouseLeaveMessage(hWnd, false);