下面是基类的源代码,把所需求移动的窗口类继承这个基类即可
头文件:
/************************************************************************/ /*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; }
时间: 2024-10-11 01:42:01