examples/mainwindow/CMakeLists.txt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
examples/mainwindow/main.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
examples/mainwindow/mainwindow.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
qmsetup @ d767a8 | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/core/contexts/win32windowcontext.cpp | ●●●●● 补丁 | 查看 | 原始文档 | 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);