以下代码尝试使用create方法将自定义创建的OpenGL窗口的本机Win32 HWND嵌入到QWidget中:
viewer_widget::viewer_widget(
QWidget* parent,
const viewer::viewer_attributes& view_attrib,
const wm::context::attribute_desc& ctx_attrib,
const wm::surface::format_desc& win_fmt)
: QWidget(parent)
{
setMouseTracking(true);
setFocusPolicy(Qt::StrongFocus);
setAttribute(Qt::WA_NativeWindow, true);
setAttribute(Qt::WA_PaintOnScreen, true); // disables qt double buffering (seems X11 only since qt4.5, ...)
setAttribute(Qt::WA_NoSystemBackground, true);
setAutoFillBackground(false);
_viewer = make_shared<viewer>(math::vec2ui(100, 100), parent->winId(), view_attrib, ctx_attrib, win_fmt);
// ok set the native window as this widgets window...and hold thumbs
QWidget::create(_viewer->window()->window_handle(), true, true);
}
Run Code Online (Sandbox Code Playgroud)
查看器创建一个本机Win32(或X11)窗口,其中QWidget的父级作为父级.它还创建并初始化OpenGL上下文.这样做是为了更好地控制上下文创建和实时时间(我知道Qt5在这方面有很大改进).QWidget :: create()方法现在获取本机窗口的HWND并将其嵌入到当前的QWidget中,因此事件处理完全通过Qt完成.
这在Qt4上完美运行(在Visual Studio 2013上最新使用的是Windows 7/8.1 x64上的Qt 4.8.6 x64).
现在当移植到Qt5时,相同的代码应该仍然可以根据Qt5文档工作.它需要进行微小的更改以考虑WId类型的变化.QWidget :: winId()方法仍然返回小部件的本机HWND句柄,我使用spyxx.exe(Visual Studio工具)验证了这些句柄.
但是,代码不再起作用(在Visual Studio 2013上使用Windows 7/8.1 x64上的Qt …