(C #)WinForm无边框窗体实现双击缩放及拖动
在设计中经常需要移除默认边框,并自定义软件边框,但是移除原始边框后拖动又是一个问题。以下以代码形式介绍如何实现QT窗口无边框拖动。
先上个图
上图移除了默认的边框,添加了border并设置了颜色,同时实现了全窗口的点击拖动。
下面开始介绍如何实现:
一. 移除默认边框/标题栏 在QWidget的构造函数中调用setWindowFlags隐藏标题栏
setWindowFlags(Qt::FramelessWindowHint | windowFlags());
二. 设置窗口拖动
通过重写mouseReleaseEvent、mousePressEvent、mouseMoveEvent三个函数来实现拖动,具体代码如下:
//testWidget.h头文件声明三个函数,并声明两个属性
//声明三个鼠标事件函数
void mouseReleaseEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
//鼠标是否按下属性
bool m_bPressed=false;
//按下后当前鼠标位置属性
QPoint m_point;
//testWidget.cpp中重写三个函数实现拖动
void testWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)//判断左键是否按下
{
m_bPressed = true;
m_point = event->pos();
}
}
void testWidget::mouseReleaseEvent(QMouseEvent *event)
{
Q_UNUSED(event);
m_bPressed = false;
}
void testWidget::mouseMoveEvent(QMouseEvent *event)
{
if (m_bPressed)
move(event->pos() - m_point + pos());//移动当前窗口
}
全部代码:
//testWidget.h
#pragma once
#include <QWidget>
#include <QMouseEvent>
class testWidget: public QWidget
{
Q_OBJECT
public:
testWidget(QWidget *parent = 0);
bool m_bPressed = true;
QPoint m_point;
void mouseReleaseEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
};
//testWidget.cpp
#include "testWidget.h"
testWidget::testWidget(QWidget *parent) : QWidget(parent)
{
setWindowFlags(Qt::FramelessWindowHint | windowFlags());
setFixedSize(100, 100); //设置窗口大小
}
void testWidget::mouseMoveEvent(QMouseEvent *event)
{
if (m_bPressed)
move(event->pos() - m_point + pos());
}
void testWidget::mouseReleaseEvent(QMouseEvent *event)
{
Q_UNUSED(event);
m_bPressed = false;
}
void testWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
m_bPressed = true;
m_point = event->pos();
}
}