public:
int countFlag(QPoint p, int row);
void setCursorType(int flag);
int countRow(QPoint p);
protected:
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseDoubleClickEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
private:
bool _isleftpressed;
int _curpos;
QPoint _plast;
//构造
this->setMouseTracking(true);
_isleftpressed = false;
_curpos = 0;//标记鼠标左击时的位置
this->setMinimumSize(600, 400);//设置最小尺寸
void my_window::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
this->_isleftpressed = true;
QPoint temp = event->globalPos();
_plast = temp;
_curpos = countFlag(event->pos(), countRow(event->pos()));
event->ignore();
}
}
void my_window::mouseReleaseEvent(QMouseEvent *event)
{
if (_isleftpressed)
_isleftpressed = false;
setCursor(Qt::ArrowCursor);
event->ignore();
}
void my_window::mouseDoubleClickEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
if (windowState() != Qt::WindowFullScreen)
setWindowState(Qt::WindowFullScreen);
else setWindowState(Qt::WindowNoState);//恢复正常模式
}
event->ignore();
}
void my_window::mouseMoveEvent(QMouseEvent *event)//鼠标移动事件
{
int poss = countFlag(event->pos(), countRow(event->pos()));
setCursorType(poss);
if (_isleftpressed)//是否左击
{
QPoint ptemp = event->globalPos();
ptemp = ptemp - _plast;
if (_curpos == 22)//移动窗口
{
ptemp = ptemp + pos();
move(ptemp);
}
else
{
QRect wid = geometry();
switch (_curpos)//改变窗口的大小
{
case 11:wid.setTopLeft(wid.topLeft() + ptemp); break;//左上角
case 13:wid.setTopRight(wid.topRight() + ptemp); break;//右上角
case 31:wid.setBottomLeft(wid.bottomLeft() + ptemp); break;//左下角
case 33:wid.setBottomRight(wid.bottomRight() + ptemp); break;//右下角
case 12:wid.setTop(wid.top() + ptemp.y()); break;//中上角
case 21:wid.setLeft(wid.left() + ptemp.x()); break;//中左角
case 23:wid.setRight(wid.right() + ptemp.x()); break;//中右角
case 32:wid.setBottom(wid.bottom() + ptemp.y()); break;//中下角
}
setGeometry(wid);
}
_plast = event->globalPos();//更新位置
}
event->ignore();
}
int my_window::countFlag(QPoint p, int row)//计算鼠标在哪一列和哪一行
{
if (p.y()<MARGIN)
return 10 + row;
else if (p.y()>this->height() - MARGIN)
return 30 + row;
else
return 20 + row;
}
void my_window::setCursorType(int flag)//根据鼠标所在位置改变鼠标指针形状
{
Qt::CursorShape cursor;
switch (flag)
{
case 11:
case 33:
cursor = Qt::SizeFDiagCursor; break;
case 13:
case 31:
cursor = Qt::SizeBDiagCursor; break;
case 21:
case 23:
cursor = Qt::SizeHorCursor; break;
case 12:
case 32:
cursor = Qt::SizeVerCursor; break;
case 22:
//cursor = Qt::OpenHandCursor; break;
cursor = Qt::ArrowCursor; break;
default:
cursor = Qt::ArrowCursor; break;
break;
}
setCursor(cursor);
}
int my_window::countRow(QPoint p)//计算在哪一列
{
return (p.x()<MARGIN) ? 1 : (p.x()>(this->width() - MARGIN) ? 3 : 2);
}
![](http://img0.tuicool.com/URBrair.jpg%21web)