如何使用 Qt::CustomizeWindowHint 禁用 QWidget 的拖动?

Posted

技术标签:

【中文标题】如何使用 Qt::CustomizeWindowHint 禁用 QWidget 的拖动?【英文标题】:How to disable drag of QWidget with Qt::CustomizeWindowHint? 【发布时间】:2013-05-13 14:58:49 【问题描述】:

我用 Qt::Window 创建了简单的 QWidget | Qt::CustomizeWindowHint 标志 + 固定大小(操作系统:Windows 7)。如何禁用通过顶部边框拖动此窗口?

创建的窗口没有标题栏 - 所以它不应该被鼠标拖动。它是 Qt (4.8.4) 中的错误吗?

代码:

#include <QtGui/QApplication>
#include <QWidget>

int main( int argc, char *argv[] )

    QApplication a(argc, argv);
    QWidget w;
    w.setWindowFlags( Qt::Window | Qt::CustomizeWindowHint );
    w.setFixedSize( 300, 200 );
    w.show();
    return a.exec();

截图:

UPD:请不要提出 Qt::FramelessWindowHint,因为它完全删除了边框。

唯一的问题是:为什么只有上边框可以拖动?

报告为错误:QT-BUG-31144

【问题讨论】:

【参考方案1】:

您可以将整个小部件设置为禁用。

http://qt-project.org/doc/qt-4.8/qwidget.html#setDisabled

http://qt-project.org/doc/qt-4.8/qwidget.html#enabled-prop

或者你可以尝试制作一个无框窗口。

http://qt-project.org/doc/qt-4.8/widgets-windowflags.html

或者子类化你自己的QFrame,并让它消耗它上面的任何鼠标事件。

http://qt-project.org/doc/qt-4.8/qframe.html

http://qt-project.org/doc/qt-4.8/qmouseevent.html

希望对您有所帮助。

为了防止在窗口中移动,您可以查看处理:

WM_NCHITTEST

http://msdn.microsoft.com/en-us/magazine/cc301402.aspx

【讨论】:

谢谢,但这是解决方法。我想在 QWidget 周围保留原生框架。我可以实现仅限 Windows 的解决方案,但我不想包含特定于平台的代码。 我不一定会说变通方法。如果您认为让顶部边缘调整位置而不是大小是一个错误,您可以在bugreports.qt-project.org 报告它。大多数情况下,如果小部件的行为与您想要的不匹配,您只需将要更改的内容子类化即可。 只有固定大小的小部件才能重现。【参考方案2】:

w.setWindowFlags( Qt::Window | Qt::CustomizeWindowHint | Qt::FramelessWindowHint ); 可以解决问题。

【讨论】:

不,它没有。它完全消除了边框。

以上是关于如何使用 Qt::CustomizeWindowHint 禁用 QWidget 的拖动?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?