qt 窗口无标题在桌面移动,不可移出可视范围之外

下面是基类的源代码,把所需求移动的窗口类继承这个基类即可

头文件:

/************************************************************************/
/*BaseWidget.h                                                          */
/************************************************************************/

#ifndef BASEWIDGET_H
#define BASEWIDGET_H

#include <QWidget>

class BaseWidget : public QWidget
{
	Q_OBJECT

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

	bool m_moving;//用来标记是否鼠标移动
	QPoint m_offset;
private:
};

#endif // BASEWIDGET_H

CPP文件:

/************************************************************************/
/* BaseWidget.cpp                                                       */
/************************************************************************/

#include "BaseWidget.h"
#include <QMouseEvent>
#include <QDesktopWidget>
#include <QApplication>

BaseWidget::BaseWidget(QWidget *parent)
	: QWidget(parent,Qt::FramelessWindowHint),m_moving(false)
{

}

BaseWidget::~BaseWidget()
{
	
}

void BaseWidget::mousePressEvent( QMouseEvent *event )
{
	if((event->button() == Qt::LeftButton))
	{
		m_moving = true;
		m_offset = event->pos();
	}
}

void BaseWidget::mouseMoveEvent( QMouseEvent *event )
{
	if(m_moving)
	{
		//方法1:
		QDesktopWidget* desktop = QApplication::desktop();
		QRect windowRect(desktop->availableGeometry());
		QRect widgetRect(this->geometry());
		QPoint point(event->globalPos() - m_offset);

		//以下是防止窗口拖出可见范围外
		//左边
		if (point.x() <= 0)
		{
			point = QPoint(0,point.y());
		}
		//右边
		int y = windowRect.bottomRight().y() - this->size().height();
		if (point.y() >= y && widgetRect.topLeft().y() >= y)
		{
			point = QPoint(point.x(),y);
		}
		//上边
		if (point.y() <= 0)
		{
			point = QPoint(point.x(),0);
		}
		//下边
		int x = windowRect.bottomRight().x() - this->size().width();
		if (point.x() >= x && widgetRect.topLeft().x() >= x)
		{
			point = QPoint(x,point.y());
		}
		move(point);
		//方法2:
		//可以通过判断QRect windowRect是否包含(contains) QRect widgetRect 再移动
		//这里没有给出代码
	}
	//如果只是要求移动窗口,用以下代码即可实现
	//move(event->globalPos() - m_offset);
}

void BaseWidget::mouseReleaseEvent( QMouseEvent*event )
{
	if(event->button() == Qt::LeftButton)
		m_moving = false;
}



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。