您的位置:首页 > 编程语言 > Qt开发

qt 拖拽 修改大小(二)

2016-06-27 21:02 351 查看
最近项目需要实现windows下橡皮筋的效果,所以对此做了一些了解,特此记录。

首先windows系统是支持橡皮筋效果的,需要使用win32方 法:SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, showFullWindow, NULL, 0);showFullWindow是一个变量,如果需要windows默认支持橡皮筋则需要传递参数false,否则传递参数true,如果使用 windows默认的橡皮筋缩放,效果如图1所示,会产生一个矩形框,不管是窗口移动还是放大缩小,都会对该矩形框作用,然后当鼠标弹起时,真实窗口才会 移动或者放大缩小。如果不使用橡皮筋拖拽的方式,那么窗口就是实时的拖拽。

void WidgetData::resizeWidget(const QPoint& globalMousePos)

{

QRect origRect;

if (d_ptr->mUseRubberBandOnResize)

{

origRect = mRubberBand->frameGeometry();

}

else

{

origRect = mWidget->frameGeometry();

}

int left = origRect.left();

int top = origRect.top();

int right = origRect.right();

int bottom = origRect.bottom();

origRect.getCoords(&left, &top, &right, &bottom);

int minWidth = mWidget->minimumWidth();

int minHeight = mWidget->minimumHeight();

if (mPressedMousePos.onTopLeftEdge)

{

left = globalMousePos.x();

top = globalMousePos.y();

}

else if (mPressedMousePos.onBottomLeftEdge)

{

left = globalMousePos.x();

bottom = globalMousePos.y();

}

else if (mPressedMousePos.onTopRightEdge)

{

right = globalMousePos.x();

top = globalMousePos.y();

}

else if (mPressedMousePos.onBottomRightEdge)

{

right = globalMousePos.x();

bottom = globalMousePos.y();

}

else if (mPressedMousePos.onLeftEdge)

{

left = globalMousePos.x();

int max_width = mWidget->maximumWidth();

if (right - left > max_width)

{

return;

}

}

else if (mPressedMousePos.onRightEdge)

{

right = globalMousePos.x();

}

else if (mPressedMousePos.onTopEdge)

{

top = globalMousePos.y();

}

else if (mPressedMousePos.onBottomEdge)

{

bottom = globalMousePos.y();

}

QRect newRect(QPoint(left, top), QPoint(right, bottom));

if (newRect.isValid())

{

if (minWidth > newRect.width())

{

//determine what has caused the width change.

if (left != origRect.left())

newRect.setLeft(origRect.left());

else

newRect.setRight(origRect.right());

}

if (minHeight > newRect.height())

{

//determine what has caused the height change.

if (top != origRect.top())

newRect.setTop(origRect.top());

else

newRect.setBottom(origRect.bottom());

}

if (d_ptr->mUseRubberBandOnResize)

{

if (mRubberBand->isVisible() == false)

{

mRubberBand->show();

}

mRubberBand->setGeometry(newRect);

}

else

{

//mWidget->setGeometry(newRect);

mWidget->move(newRect.topLeft());

mWidget->resize(newRect.size());

}

}

else

{

//qDebug() << "Calculated Rect is not valid" << newRect;

}

}

void WidgetData::moveWidget(const QPoint & globalMousePos)

{

bool canMove = false;

if (d_ptr->mLocalOnMove == true && d_ptr->mCanMoveFlag != true)

{

for (int i = 0; i < d_ptr->mLocalWidget.size(); ++i)

{

if (d_ptr->mLocalWidget[i]->rect().contains(d_ptr->mLocalWidget[i]->mapFromGlobal(globalMousePos)))

{

canMove = true;

d_ptr->mCanMoveFlag = true;

break;

}

}

}

else

{

canMove = true;

}

if (canMove)

{

if (d_ptr->mUseRubberBandOnMove)

{

if (mRubberBand->isVisible() == false)

{

mRubberBand->show();

}

mRubberBand->move(globalMousePos - mDragPos);

}

else

{

mWidget->move(globalMousePos - mDragPos);

}

}

}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: