Qt嵌入无边框三方程序如何防止其拖动

Qt嵌入无边框三方程序如何防止其还能拖动?通过createWindowContainer将windows的程序界面嵌入到qt的widget里,但是对于无边框窗体,嵌入后还能在widget里拖动,我不想让它还能拖动,老老实实固定在widget里不好吗。试了很多方法都没成功,鼠标在三方窗体部分属于非工作区域,没法检测到鼠标移动,无法阻止,没有成功。使用遮罩覆盖也没有成功,有没有其他办法呢,让它固定在图一的样子,不让他拖动,不能出现图二的样子。

    WId wid = (WId)hwnd;
    QWindow* window = QWindow::fromWinId(wid);
    window->setFlags(window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint);
    window->setSurfaceType(QWindow::OpenGLSurface);    
    QWidget* widget = QWidget::createWindowContainer(window);
    widget->setAttribute(Qt::WA_NativeWindow);
    widget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
    widget->setFixedSize(width, height);
    widget->setWindowTitle(title);
    widget->setWindowIcon(getWindowIcon(hwnd));
    widget->show;

img

img

让第三方的widget成为你主窗口的子类,然后在主窗口事件中处理。

【以下回答由 GPT 生成】

要防止嵌入的无边框窗体拖动,可以通过以下步骤来实现:

  1. 在嵌入窗体之前,首先禁用窗体的移动功能。可以使用SetWindowLongPtr函数将窗体的样式设置为不可移动。
SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE) & ~WS_POPUP);
  1. 然后,将窗体嵌入到Qt的widget中。你已经使用了createWindowContainer方法来实现这一点。确保在设置窗体的属性之前调用此方法。

  2. 设置窗体的属性为WS_CHILD,这将使窗体成为widget的子窗口,并且不能单独拖动。

SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE) | WS_CHILD);
  1. 最后,将窗体的父窗口设置为widget的句柄,这将使窗体成为widget的子组件,并保持固定位置。
SetParent(hwnd, (HWND)widget->winId());

更新后的示例代码如下所示:

WId wid = (WId)hwnd;
QWidget* widget = new QWidget();
widget->setWindowFlags(Qt::FramelessWindowHint);
widget->setFixedSize(width, height);

SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE) & ~WS_POPUP);
SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE) | WS_CHILD);
SetParent(hwnd, (HWND)widget->winId());

QWindow* window = QWindow::fromWinId(wid);
window->setSurfaceType(QWindow::OpenGLSurface);    
QWidget* container = QWidget::createWindowContainer(window, widget);
container->setAttribute(Qt::WA_NativeWindow);
container->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
container->setWindowTitle(title);
container->setWindowIcon(getWindowIcon(hwnd));
container->show();

这样就能够防止嵌入的无边框窗体在widget中拖动。如果窗体仍然可以拖动,请确保在修改窗体样式之前,窗体已经正确嵌入到widget中,并且widget的windowFlags已经设置为Qt::FramelessWindowHint。 如果以上解决方案无效,请确保嵌入的无边框窗体没有实现自己的拖动逻辑,并且尝试在窗体嵌入之前禁用窗体的任何拖动功能。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^