qt c++ 设置窗口不可拖动
时间: 2023-07-22 18:30:49 浏览: 203
要设置窗口不可拖动,可以通过设置窗口的 Qt::WindowFlags 属性来实现。具体操作如下:
```
// 获取当前窗口的 Qt::WindowFlags 属性
Qt::WindowFlags flags = windowFlags();
// 设置窗口属性为不可拖动
setWindowFlags(flags & ~Qt::WindowMaximizeButtonHint & ~Qt::WindowMinimizeButtonHint & ~Qt::WindowCloseButtonHint & ~Qt::WindowStaysOnTopHint & ~Qt::Window);
// 重新显示窗口
show();
```
在上面的代码中,我们首先获取当前窗口的 Qt::WindowFlags 属性,然后通过位运算的方式将窗口的最大化、最小化、关闭、置顶以及可移动属性都取消掉,最后重新显示窗口即可。
需要注意的是,如果你想在运行时将窗口属性设置为不可拖动,建议在窗口显示前设置,否则可能会出现窗口闪烁的情况。
相关问题
qt c++ 设置窗口不可以拉顶部拖动
要设置窗口不可拉拽顶部进行拖动,可以重载 QWidget 的 `mousePressEvent` 和 `mouseMoveEvent` 方法,然后在 `mousePressEvent` 中记录下鼠标点击时的坐标,然后在 `mouseMoveEvent` 中计算鼠标移动的距离,如果鼠标移动的距离在一定范围内,则不移动窗口,否则移动窗口。
具体实现如下:
```
void MyWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton && event->pos().y() < 30) {
m_drag = true;
m_startPos = event->globalPos() - frameGeometry().topLeft();
}
QWidget::mousePressEvent(event);
}
void MyWidget::mouseMoveEvent(QMouseEvent *event)
{
if (m_drag) {
QPoint pos = event->globalPos() - m_startPos;
if (pos.y() < 0) {
pos.setY(0);
}
move(pos);
}
QWidget::mouseMoveEvent(event);
}
void MyWidget::mouseReleaseEvent(QMouseEvent *event)
{
m_drag = false;
QWidget::mouseReleaseEvent(event);
}
```
在上面的代码中,我们重载了 QWidget 的 `mousePressEvent`、`mouseMoveEvent` 和 `mouseReleaseEvent` 三个方法,其中 `m_drag` 表示当前是否在拖动窗口,`m_startPos` 表示鼠标点击时的坐标。
在 `mousePressEvent` 中,如果鼠标左键点击并且点击的位置在窗口的顶部,则设置 `m_drag` 为真,并记录下鼠标点击时的坐标。
在 `mouseMoveEvent` 中,如果 `m_drag` 为真,则计算鼠标移动的距离,并根据移动的距离来移动窗口。需要注意的是,我们在移动窗口时,需要判断窗口移动后的位置是否超出了屏幕范围,如果超出了,则需要将窗口移动到屏幕边缘。
在 `mouseReleaseEvent` 中,将 `m_drag` 设置为假。
这样,就可以实现设置窗口不可拉拽顶部进行拖动的效果了。
c++ 拖动窗口客户区可移动 详细代码 不使用mfc 不使用qt
如果不使用MFC或Qt等框架,可使用Windows API来实现拖动窗口客户区可移动的效果。以下是一个简单的实现示例:
1. 在窗口类中添加以下代码:
```
// 定义一个变量来记录鼠标是否按下
bool isDragging = false;
// 定义一个变量来记录鼠标按下位置
POINT lastMousePos;
// 处理鼠标按下事件
case WM_LBUTTONDOWN:
// 如果鼠标按下位置在窗口客户区内,则开始拖动
if (PtInRect(&rcClient, pt))
{
isDragging = true;
lastMousePos = pt;
SetCapture(hWnd);
}
break;
// 处理鼠标移动事件
case WM_MOUSEMOVE:
if (isDragging)
{
// 计算鼠标移动的距离
int dx = pt.x - lastMousePos.x;
int dy = pt.y - lastMousePos.y;
// 移动窗口
RECT rcWindow;
GetWindowRect(hWnd, &rcWindow);
rcWindow.left += dx;
rcWindow.top += dy;
MoveWindow(hWnd, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
// 记录当前鼠标位置
lastMousePos = pt;
}
break;
// 处理鼠标释放事件
case WM_LBUTTONUP:
if (isDragging)
{
isDragging = false;
ReleaseCapture();
}
break;
```
2. 在窗口消息处理函数中添加以下代码:
```
case WM_LBUTTONDOWN:
case WM_MOUSEMOVE:
case WM_LBUTTONUP:
OnMouseEvent(hWnd, message, wParam, lParam);
break;
```
3. 实现 `OnMouseEvent` 函数:
```
void OnMouseEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_LBUTTONDOWN:
OnLButtonDown(hWnd, wParam, lParam);
break;
case WM_MOUSEMOVE:
OnMouseMove(hWnd, wParam, lParam);
break;
case WM_LBUTTONUP:
OnLButtonUp(hWnd, wParam, lParam);
break;
}
}
void OnLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
// 如果鼠标按下位置在窗口客户区内,则开始拖动
if (PtInRect(&rcClient, pt))
{
isDragging = true;
lastMousePos = pt;
SetCapture(hWnd);
}
}
void OnMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
if (isDragging)
{
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
// 计算鼠标移动的距离
int dx = pt.x - lastMousePos.x;
int dy = pt.y - lastMousePos.y;
// 移动窗口
RECT rcWindow;
GetWindowRect(hWnd, &rcWindow);
rcWindow.left += dx;
rcWindow.top += dy;
MoveWindow(hWnd, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
// 记录当前鼠标位置
lastMousePos = pt;
}
}
void OnLButtonUp(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
if (isDragging)
{
isDragging = false;
ReleaseCapture();
}
}
```
这样,当用户在窗口客户区内按下鼠标左键并移动时,窗口就会跟随鼠标移动。注意,上述代码中的 `rcClient` 需要在窗口类中定义为成员变量或全局变量。
阅读全文