您现在的位置是:首页 > 技术文章网站首页技术文章

[Qt]自定义可拉伸窗口

  • WangYe
  • 2021-03-24 21:03:22
  • 240 次阅读
Qt简单自定义可拉伸窗口

效果:

代码区:

    WidgetBase.h

#ifndef WIDGETBASE_H
#define WIDGETBASE_H

#include <QWidget>
#include <QMouseEvent>

#include "stdafx.h"

class WidgetBase : public QWidget
{
	Q_OBJECT
public:
	explicit WidgetBase(QWidget* parent = 0);
	void EnableMove(bool bMove = true) { m_bMove = bMove; }
	void EnableSize(bool bSize = true) { m_bSize = bSize; }
	void EnableWheel(bool bWheel = true) { m_bWheel = bWheel; }

protected:
	virtual void mousePressEvent(QMouseEvent* event);
	virtual void mouseMoveEvent(QMouseEvent* event);
	virtual void mouseReleaseEvent(QMouseEvent* event);
	virtual void wheelEvent(QWheelEvent* event);

signals:

public slots:

private:
	bool                    m_bSize;
	bool                    m_bMove;
	bool                    m_bWheel;
	bool					m_bSizeOrMove;
	QPoint					m_PointWindow;
	QPoint					m_PointMouse;
};

#endif // WIDGETBASE_H

    WidgetBase.cpp

#include "WidgetBase.h"

WidgetBase::WidgetBase(QWidget* parent) : QWidget(parent)
{
	m_bSize = true;
	m_bMove = true;
	m_bWheel = true;
	m_bSizeOrMove = true;
	setWindowFlags(Qt::FramelessWindowHint);
}

void WidgetBase::mousePressEvent(QMouseEvent* event)
{
	if (event->button() == Qt::LeftButton)
	{
		//缩放(此处只能在右下角坐标点20个像素以内的区域拉伸,可以根据实际情况修改)
		if (this->width() - 20 < event->pos().x() && event->pos().x() < this->width() &&
			this->height() - 20 < event->pos().y() && event->pos().y() < this->height())
		{
			m_bSizeOrMove = true;
		}
		//移动
		else
		{
			m_bSizeOrMove = false;
			m_PointWindow = event->globalPos() - pos();
		}
		event->accept();
	}
}

void WidgetBase::mouseMoveEvent(QMouseEvent* event)
{
	//缩放:窗口size会缩放为(0,0),甚至负数,此处限制为(1257,792)
	if (m_bSizeOrMove)
	{
		if (m_bSize)
		{
			QPoint pt = event->pos();
			if (pt.x() > 1257)
				setFixedWidth(pt.x());
			if (pt.y() > 792)
				setFixedHeight(pt.y());
		}
	}
	//移动
	else
	{
		if (m_bMove)
		{
			move(event->globalPos() - m_PointWindow);
		}
	}
	event->accept();
}

void WidgetBase::mouseReleaseEvent(QMouseEvent* event)
{
}

void WidgetBase::wheelEvent(QWheelEvent* event)
{
	if (!m_bWheel) return;
	//鼠标当前位置相对于窗口位置的坐标系数
	float fX = 1.0 * event->pos().x() / this->width();
	float fY = 1.0 * event->pos().y() / this->height();

	int nW = 0;
	int nH = 0;
	if (event->delta() > 0)
	{
		nW = this->width() * 1.05;
		nH = this->height() * 1.05;
	}
	else
	{
		nW = this->width() * 0.95;
		nH = this->height() * 0.95;
	}

	int x = event->globalPos().x() - (fX * nW);
	int y = event->globalPos().y() - (fY * nH);

	//窗口size会缩放为(0,0),甚至负数,此处限制为(200,150)
	if (nW > 200 || nH > 150)
	{
		setFixedSize(QSize(nW, nH));
		move(x, y);
	}
	event->accept();
}

使用方法:

    Demo.h

#pragma once

#include <QtWidgets/QWidget>

/*自定义窗口*/
#include "WidgetBase.h"
/*自定义窗口 END*/

class Demo : public WidgetBase
{
    Q_OBJECT

public:
    Demo(QWidget *parent = Q_NULLPTR);
protected:

private:

};

    Demo.cpp

#include "Demo.h"

YunJiWan_Demo::YunJiWan_Demo(QWidget *parent)
    : WidgetBase(parent)
{
}


文章评论 (0)



Top