QT 鼠标拖动无标题窗口

转自:http://www.voidcn.com/blog/hiwubihe/article/p-6063271.html

非常感谢作者,亲测有效。

#ifndef CUSTOMWINDOW_H
#define CUSTOMWINDOW_H

#include <QtGui/QDialog>


class CustomWindow : public QDialog
{
	Q_OBJECT

public:
	CustomWindow(QWidget *parent = 0);
	~CustomWindow();
protected:
	virtual void mousePressEvent(QMouseEvent *event);
	virtual void mouseMoveEvent(QMouseEvent *event);
	virtual void mouseReleaseEvent(QMouseEvent *event);

private:
	bool		mMoveing;
	QPoint	    mMovePosition;
};

#endif // CUSTOMWINDOW_H

#include "customwindow.h"
#include <QtGui/QMouseEvent>
#include <QtGui/QApplication>

CustomWindow::CustomWindow(QWidget *parent)
{
	mMoveing=false;
	//Qt::FramelessWindowHint 无边框
    //Qt::WindowStaysOnTopHint 窗口在最顶端,不会拖到任务栏下面
	setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint |Qt::WindowStaysOnTopHint);
	this->setStyleSheet("QDialog{border:2px solid green;}");
}
CustomWindow::~CustomWindow()
{}

//重写鼠标按下事件
void CustomWindow::mousePressEvent(QMouseEvent *event)
{
	mMoveing = true;
	//记录下鼠标相对于窗口的位置
	//event->globalPos()鼠标按下时,鼠标相对于整个屏幕位置
	//pos() this->pos()鼠标按下时,窗口相对于整个屏幕位置
	mMovePosition = event->globalPos() - pos();
	return QDialog::mousePressEvent(event);
}

//重写鼠标移动事件
void CustomWindow::mouseMoveEvent(QMouseEvent *event)
{
	//(event->buttons() && Qt::LeftButton)按下是左键
	//鼠标移动事件需要移动窗口,窗口移动到哪里呢?就是要获取鼠标移动中,窗口在整个屏幕的坐标,然后move到这个坐标,怎么获取坐标?
	//通过事件event->globalPos()知道鼠标坐标,鼠标坐标减去鼠标相对于窗口位置,就是窗口在整个屏幕的坐标
	if (mMoveing && (event->buttons() && Qt::LeftButton)
		&& (event->globalPos()-mMovePosition).manhattanLength() > QApplication::startDragDistance()) 
	{  
		move(event->globalPos()-mMovePosition);
		mMovePosition = event->globalPos() - pos();
	}
	return QDialog::mouseMoveEvent(event);
}
void CustomWindow::mouseReleaseEvent(QMouseEvent *event)
{
	mMoveing = false;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值