如何使用 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 提交?