Sine Striker
2024-02-20 2d2fc799bc698ebf7e7c8bcc394366d0d7bf071b
Partially finish the bug after window close and reshow
5个文件已修改
44 ■■■■ 已修改文件
.gitignore 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/mainwindow/main.cpp 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/mainwindow/mainwindow.cpp 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/mainwindow/mainwindow.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/core/contexts/abstractwindowcontext.cpp 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -76,7 +76,7 @@
.DS_Store
*/.DS_Store
build-src*
build-*
build/
cmake-build*
*.user
examples/mainwindow/main.cpp
@@ -32,5 +32,8 @@
    MainWindow w;
    w.show();
    QMainWindow w2;
    w2.show();
    return a.exec();
}
examples/mainwindow/mainwindow.cpp
@@ -115,6 +115,14 @@
    return QMainWindow::event(event);
}
void MainWindow::closeEvent(QCloseEvent *event) {
    if (!(qApp->keyboardModifiers() & Qt::ControlModifier)) {
        QTimer::singleShot(1000, this, &QWidget::show);
    }
    event->accept();
}
void MainWindow::installWindowAgent() {
    // 1. Setup window agent
    windowAgent = new QWK::WidgetWindowAgent(this);
examples/mainwindow/mainwindow.h
@@ -30,6 +30,8 @@
protected:
    bool event(QEvent *event) override;
    void closeEvent(QCloseEvent *event) override;
private:
    void installWindowAgent();
    void loadStyleSheet(Theme theme);
src/core/contexts/abstractwindowcontext.cpp
@@ -41,7 +41,18 @@
            explicit WindowEventFilter(QWindow *window, AbstractWindowContext *ctx,
                                       QObject *parent = nullptr)
                : QObject(parent), ctx(ctx), window(window) {
                if (window)
                window->installEventFilter(this);
            }
            inline void setWindow(QWindow *win) {
                if (auto oldWin = window.data(); oldWin) {
                    oldWin->removeEventFilter(this);
                }
                window = win;
                if (win) {
                    win->installEventFilter(this);
                }
            }
        protected:
@@ -51,7 +62,7 @@
        protected:
            AbstractWindowContext *ctx;
            QWindow *window;
            QPointer<QWindow> window;
        };
    }
@@ -67,11 +78,11 @@
        m_host = host;
        m_delegate.reset(delegate);
        m_winIdChangeEventFilter = std::make_unique<WinIdChangeEventFilter>(host, this);
        m_windowEventFilter = std::make_unique<WindowEventFilter>(m_windowHandle, this);
        m_windowHandle = m_delegate->hostWindow(m_host);
        if (m_windowHandle) {
            winIdChanged();
            m_windowEventFilter = std::make_unique<WindowEventFilter>(m_windowHandle, this);
        }
    }
@@ -248,14 +259,18 @@
    }
    void AbstractWindowContext::notifyWinIdChange() {
        auto oldWindow = m_windowHandle;
        auto windowEventFilter = static_cast<WindowEventFilter *>(m_windowEventFilter.get());
        windowEventFilter->setWindow(nullptr);
        // In Qt6, after QWidget::close() is called, the related QWindow's all surfaces and the
        // platform window will be removed, and the WinId will be set to 0. After that, when the
        // QWidget is shown again, the whole things will be recreated again.
        // As a result, we must update our WindowContext each time the WinId changes.
        m_windowHandle = m_delegate->hostWindow(m_host);
        if (oldWindow == m_windowHandle)
            return;
        m_windowEventFilter.reset();
        winIdChanged();
        if (m_windowHandle) {
            m_windowEventFilter = std::make_unique<WindowEventFilter>(m_windowHandle, this);
            windowEventFilter->setWindow(m_windowHandle);
            // Refresh window attributes
            auto attributes = m_windowAttributes;