Qt:自定义窗口之窗口缩放
来源:互联网 发布:量子统计 淘宝 编辑:程序博客网 时间:2024/05/18 02:15
当我们隐藏了系统窗口后,无法完成对窗口的缩放,这里缩放方法通过重写一些鼠标事件来实现。具体代码如下:
头文件:
#define PADDING 2class MainFrame : public QWidget{ Q_OBJECTpublic: MainFrame(QWidget *parent = 0); ~MainFrame();protected: void mouseReleaseEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event);private: void region(const QPoint &cursorPoint); private: MainWindow *mainwindow = nullptr; bool isLeftPressDown; QPoint dragPosition; enum Direction{ UP = 0, DOWN=1, LEFT, RIGHT, LEFTTOP, LEFTBOTTOM, RIGHTBOTTOM, RIGHTTOP, NONE }; Direction dir;};cpp:
void MainFrame::mouseReleaseEvent(QMouseEvent *event){ if(event->button() == Qt::LeftButton) { isLeftPressDown = false; this->releaseMouse(); this->setCursor(QCursor(Qt::ArrowCursor)); } QWidget::mouseReleaseEvent(event);}void MainFrame::mousePressEvent(QMouseEvent *event){ if(event->button() == Qt::LeftButton){ isLeftPressDown = true; if(dir != NONE) { this->mouseGrabber(); } } QWidget::mousePressEvent(event);}void MainFrame::mouseMoveEvent(QMouseEvent *event){ QPoint gloPoint = event->globalPos(); QRect rect = this->rect(); QPoint tl = mapToGlobal(rect.topLeft()); QPoint rb = mapToGlobal(rect.bottomRight()); if(!isLeftPressDown) { this->region(gloPoint); } else { if(dir != NONE) { QRect rMove(tl, rb); switch(dir) { case LEFT: if(rb.x() - gloPoint.x() <= this->minimumWidth()) rMove.setX(tl.x()); else rMove.setX(gloPoint.x()); break; case RIGHT: rMove.setWidth(gloPoint.x() - tl.x()); break; case UP: if(rb.y() - gloPoint.y() <= this->minimumHeight()) rMove.setY(tl.y()); else rMove.setY(gloPoint.y()); break; case DOWN: rMove.setHeight(gloPoint.y() - tl.y()); break; case LEFTTOP: if(rb.x() - gloPoint.x() <= this->minimumWidth()) rMove.setX(tl.x()); else rMove.setX(gloPoint.x()); if(rb.y() - gloPoint.y() <= this->minimumHeight()) rMove.setY(tl.y()); else rMove.setY(gloPoint.y()); break; case RIGHTTOP: rMove.setWidth(gloPoint.x() - tl.x()); if(rb.y() - gloPoint.y() <= this->minimumHeight()) rMove.setY(tl.y()); else rMove.setY(gloPoint.y()); break; case LEFTBOTTOM: rMove.setHeight(gloPoint.y() - tl.y()); if(rb.x() - gloPoint.x() <= this->minimumWidth()) rMove.setX(tl.x()); else rMove.setX(gloPoint.x()); break; case RIGHTBOTTOM: rMove.setWidth(gloPoint.x() - tl.x()); rMove.setHeight(gloPoint.y() - tl.y()); break; default: break; } this->setGeometry(rMove); } } QWidget::mouseMoveEvent(event);}void MainFrame::region(const QPoint &cursorGlobalPoint){ QRect rect = this->rect(); QPoint tl = mapToGlobal(rect.topLeft()); QPoint rb = mapToGlobal(rect.bottomRight()); int x = cursorGlobalPoint.x(); int y = cursorGlobalPoint.y(); if(tl.x() + PADDING >= x && tl.x() <= x && tl.y() + PADDING >= y && tl.y() <= y) { // 左上角 dir = LEFTTOP; this->setCursor(QCursor(Qt::SizeFDiagCursor)); } else if(x >= rb.x() - PADDING && x <= rb.x() && y >= rb.y() - PADDING && y <= rb.y()) { // 右下角 dir = RIGHTBOTTOM; this->setCursor(QCursor(Qt::SizeFDiagCursor)); } else if(x <= tl.x() + PADDING && x >= tl.x() && y >= rb.y() - PADDING && y <= rb.y()) { //左下角 dir = LEFTBOTTOM; this->setCursor(QCursor(Qt::SizeBDiagCursor)); } else if(x <= rb.x() && x >= rb.x() - PADDING && y >= tl.y() && y <= tl.y() + PADDING) { // 右上角 dir = RIGHTTOP; this->setCursor(QCursor(Qt::SizeBDiagCursor)); } else if(x <= tl.x() + PADDING && x >= tl.x()) { // 左边 dir = LEFT; this->setCursor(QCursor(Qt::SizeHorCursor)); } else if( x <= rb.x() && x >= rb.x() - PADDING) { // 右边 dir = RIGHT; this->setCursor(QCursor(Qt::SizeHorCursor)); }else if(y >= tl.y() && y <= tl.y() + PADDING){ // 上边 dir = UP; this->setCursor(QCursor(Qt::SizeVerCursor)); } else if(y <= rb.y() && y >= rb.y() - PADDING) { // 下边 dir = DOWN; this->setCursor(QCursor(Qt::SizeVerCursor)); }else { // 默认 dir = NONE; this->setCursor(QCursor(Qt::ArrowCursor)); }}
效果
阅读全文
1 0
- Qt:自定义窗口之窗口缩放
- Qt 之 自定义窗口标题栏
- Qt之定时器、重绘窗口、窗口缩放、截屏、截图
- Qt 之 自定义窗口标题栏 之 窗口拉伸
- 自定义QT窗口部件外观之QStyle
- Qt学习之自定义窗口部件
- C# 窗口缩放 自定义控件缩放
- QT自定义窗口:
- 自定义Qt窗口部件
- 自定义 Qt 窗口标题栏
- Qt自定义窗口部件
- Qt自定义窗口事件
- Qt自定义窗口部件
- QT自定义窗口
- Qt自定义窗口部件
- QT实现窗口缩放打开与关闭
- Qt去掉窗口标题栏实现移动缩放
- Qt无边框窗口,自由缩放窗口大小
- 【python 图像识别】图像识别从菜鸟走向大神系列1
- Vue2生命周期
- Java实现的链表,提供增,删,改,查方法。
- canvas实现放大镜查看图片
- Pixhawk原生PX4固件中的坑(2017.6.8TREE上的版本)
- Qt:自定义窗口之窗口缩放
- OkHttp使用详解
- 关于Js中函数传参是引用还是传值
- CSS-!important提升权重用法
- Linux下创建DNS服务器
- An internal error occurred during
- js常用方法
- 形参加不加&
- 视频压制相关工具下载