Explorar o código

fix main window blinking issue caused by OpenGL on Qt6

Le Tan hai 1 ano
pai
achega
889026bece
Modificáronse 2 ficheiros con 23 adicións e 13 borrados
  1. 18 12
      src/widgets/mainwindow.cpp
  2. 5 1
      src/widgets/mainwindow.h

+ 18 - 12
src/widgets/mainwindow.cpp

@@ -20,6 +20,7 @@
 #include <QTimer>
 #include <QProgressDialog>
 #include <QHotkey>
+#include <QWebEngineView>
 
 #include "notebookexplorer.h"
 #include "vnotex.h"
@@ -74,8 +75,6 @@ MainWindow::MainWindow(QWidget *p_parent)
 
     setupShortcuts();
 
-    loadStateAndGeometry();
-
     m_dockWidgetHelper.postSetup();
 
     // The signal is particularly useful if your application has to do some last-second cleanup.
@@ -97,8 +96,12 @@ MainWindow::~MainWindow()
 void MainWindow::kickOffOnStart(const QStringList &p_paths)
 {
     QTimer::singleShot(300, [this, p_paths]() {
-        // Need to load the state of dock widgets again after the main window is shown.
-        loadStateAndGeometry(true);
+        if (m_dummyWebView) {
+            delete m_dummyWebView;
+            m_dummyWebView = nullptr;
+        }
+
+        loadStateAndGeometry();
 
         {
             QProgressDialog proDlg(tr("Initializing core components..."),
@@ -174,6 +177,11 @@ void MainWindow::setupUI()
     setupSystemTray();
 
     m_dockWidgetHelper.activateDock(DockWidgetHelper::NavigationDock);
+
+#if defined(Q_OS_WIN)
+    m_dummyWebView = new QWebEngineView(this);
+    m_dummyWebView->setFixedSize(1, 1);
+#endif
 }
 
 void MainWindow::setupStatusBar()
@@ -452,12 +460,12 @@ void MainWindow::saveStateAndGeometry()
     sessionConfig.setMainWindowStateGeometry(sg);
 }
 
-void MainWindow::loadStateAndGeometry(bool p_stateOnly)
+void MainWindow::loadStateAndGeometry()
 {
     const auto& sessionConfig = ConfigMgr::getInst().getSessionConfig();
     const auto sg = sessionConfig.getMainWindowStateGeometry();
 
-    if (!p_stateOnly && !sg.m_mainGeometry.isEmpty()) {
+    if (!sg.m_mainGeometry.isEmpty()) {
         restoreGeometry(sg.m_mainGeometry);
     }
 
@@ -466,12 +474,10 @@ void MainWindow::loadStateAndGeometry(bool p_stateOnly)
         restoreState(sg.m_mainState);
     }
 
-    if (!p_stateOnly) {
-        m_visibleDocksBeforeExpand = sg.m_visibleDocksBeforeExpand;
-        if (m_visibleDocksBeforeExpand.isEmpty()) {
-            // Init (or init again if there is no visible dock).
-            m_visibleDocksBeforeExpand = m_dockWidgetHelper.getVisibleDocks();
-        }
+    m_visibleDocksBeforeExpand = sg.m_visibleDocksBeforeExpand;
+    if (m_visibleDocksBeforeExpand.isEmpty()) {
+        // Init (or init again if there is no visible dock).
+        m_visibleDocksBeforeExpand = m_dockWidgetHelper.getVisibleDocks();
     }
 
     if (!sg.m_tagExplorerState.isEmpty()) {

+ 5 - 1
src/widgets/mainwindow.h

@@ -14,6 +14,7 @@ class QSystemTrayIcon;
 class QTimer;
 class QLabel;
 class QTextEdit;
+class QWebEngineView;
 
 namespace vnotex
 {
@@ -137,7 +138,7 @@ namespace vnotex
 
         void saveStateAndGeometry();
 
-        void loadStateAndGeometry(bool p_stateOnly = false);
+        void loadStateAndGeometry();
 
         // Used to test widget in development.
         void demoWidget();
@@ -160,6 +161,9 @@ namespace vnotex
 
         void loadWidgetsData();
 
+        // WebView to handle OpenGL blinking on Windows.
+        QWebEngineView *m_dummyWebView = nullptr;
+
         DockWidgetHelper m_dockWidgetHelper;
 
         NotebookExplorer *m_notebookExplorer = nullptr;