作者你好,如题。 我使用代理框架(QWKExample_MainWindow)为前提。 1,直接使用一个派生自QDockWidget的dock,程序一切正常。 2,使用一个派生自QDockWidget的dock,但在这个dock的构造函数中使用了WidgetWindowAgent(new setup),发现如下两个问题(都是针对派生自QDockWidget的dock)。 2.1假如我没有自定义标题栏widget,程序运行后,可以将dock拖出来(因为没有自定义标题栏,所以拖出来就托不回去了),这个时候,主框架还是可以拖动的。但如果拖出来不松手再拖回去,程序直接崩溃。 2.2假如我使用了自定义的标题栏(WindowBar),程序运行后,将dock拖出来,这个时候,主框架已经没有相应了(如何点,拖,都不带动的),鼠标也变成了一个不正常的样子。同时拖动感觉不顺滑,迟滞感比较强。然后再将dock拖回去,这个时候就崩溃了。 崩溃点如下:C:\Qt\6.10.1\msvc2022_64\include\QtCore\qscopedpointer.h,文件112行 T *get() const noexcept { return d; } 2.1的崩溃地也是这里,调用堆栈如下: > Qt6Guid.dll!QScopedPointer<QObjectData,QScopedPointerDeleter<QObjectData>>::get() 行 112 C++ Qt6Guid.dll!qGetPtrHelper<QScopedPointer<QObjectData,QScopedPointerDeleter<QObjectData>> const>(const QScopedPointer<QObjectData,QScopedPointerDeleter<QObjectData>> & ptr) 行 137 C++ Qt6Guid.dll!QWindow::d_func() 行 65 C++ Qt6Guid.dll!QWindow::handle() 行 2201 C++ QtTest.exe!QWK::forwardFilteredEvent(QWindow * window, HWND__ * hWnd, unsigned int message, unsigned __int64 wParam, __int64 lParam, __int64 * result) 行 464 C++ QtTest.exe!QWKHookedWndProc(HWND__ * hWnd, unsigned int message, unsigned __int64 wParam, __int64 lParam) 行 627 C++ [外部代码] Qt6Cored.dll!QEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) 行 502 C++ Qt6Guid.dll!QWindowsGuiEventDispatcher::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) 行 36 C++ Qt6Cored.dll!QEventLoop::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) 行 105 C++ Qt6Cored.dll!QEventLoop::exec(QFlags<enum QEventLoop::ProcessEventsFlag> flags) 行 186 C++ Qt6Cored.dll!QCoreApplication::exec() 行 1452 C++ Qt6Guid.dll!QGuiApplication::exec() 行 1974 C++ Qt6Widgetsd.dll!QApplication::exec() 行 2576 C++ QtTest.exe!main(int argc, char * * argv) 行 35 C++ QtTest.exe!qtEntryPoint() 行 45 C++ QtTest.exe!WinMain(HINSTANCE__ * __formal, HINSTANCE__ * __formal, char * __formal, int __formal) 行 64 C++ 谢谢。
Activity
wangwenx190 commentedon Feb 4, 2026
你好,经我们研究,QDockWidget自身的逻辑与QWK不能很好的兼容,因此QWK短时间内不会支持QDockWidget。而且QDockWidget本身不需要使用QWK吧?Qt官方有提供给它定制标题栏的接口,你可以直接用Qt提供的接口去做,没必要用QWK的。