qt 拖拽 修改大小(二)
2016-06-27 21:02
351 查看
最近项目需要实现windows下橡皮筋的效果,所以对此做了一些了解,特此记录。
首先windows系统是支持橡皮筋效果的,需要使用win32方 法:SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, showFullWindow, NULL, 0);showFullWindow是一个变量,如果需要windows默认支持橡皮筋则需要传递参数false,否则传递参数true,如果使用 windows默认的橡皮筋缩放,效果如图1所示,会产生一个矩形框,不管是窗口移动还是放大缩小,都会对该矩形框作用,然后当鼠标弹起时,真实窗口才会 移动或者放大缩小。如果不使用橡皮筋拖拽的方式,那么窗口就是实时的拖拽。
View Code
首先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
相关文章推荐
- qt 标签 QTextBrowser QLabel
- qt 拖拽 修改大小
- qt 布局
- qt集成dsoframer.ocx打开office办公软件
- qt 窗口鼠标穿透
- Qt窗口定制
- qt4升级到qt5的一些问题
- qt 窗口动画
- qt系统托盘显示、无主窗体
- qt程序启动播放动画
- Qt之QToolButton
- Qt之QToolButton
- 如何在 静态编译的QT 5.5.1 中 使用数据库插件连接 ODBC(调用静态插件)
- Qt之QPushButton
- Qt之QPushButton
- Qt MVC
- Qt软件开发具有 管理员权限
- QT 实现固定大小圆形进度条
- QTableWidget中添加checkbox,并相应触发函数
- ECMAScript(一)