当前位置:   article > 正文

实现在一个QWidget上显示另一个QWidget,并通过鼠标拖拽子窗口的四条边和四个角来改变子窗口的大小_qtwidget拖动边缘改变大小

qtwidget拖动边缘改变大小
  1. #include <QtWidgets>
  2. class ChildWidget : public QWidget {
  3. public:
  4. ChildWidget(QWidget *parent = nullptr) : QWidget(parent) {
  5. setAutoFillBackground(true);
  6. setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
  7. }
  8. protected:
  9. void paintEvent(QPaintEvent *event) override {
  10. Q_UNUSED(event);
  11. // 绘制子窗口的颜色
  12. QPainter painter(this);
  13. painter.fillRect(rect(), Qt::blue);
  14. }
  15. };
  16. class ParentWidget : public QWidget {
  17. public:
  18. ParentWidget(QWidget *parent = nullptr) : QWidget(parent) {
  19. setWindowTitle("Parent Widget");
  20. // 创建子窗口对象
  21. childWidget = new ChildWidget(this);
  22. // 设置子窗口对象为透明,以显示父窗口的背景颜色
  23. childWidget->setAttribute(Qt::WA_TransparentForMouseEvents);
  24. // 创建布局管理器
  25. layout = new QVBoxLayout(this);
  26. // 将子窗口添加到布局中
  27. layout->addWidget(childWidget);
  28. // 设置布局管理器为父窗口的布局
  29. setLayout(layout);
  30. }
  31. void mousePressEvent(QMouseEvent *event) override {
  32. if (event->button() == Qt::LeftButton) {
  33. // 记录鼠标点击时父窗口的位置和子窗口的大小
  34. startPos = event->pos();
  35. startSize = childWidget->size();
  36. }
  37. }
  38. void mouseMoveEvent(QMouseEvent *event) override {
  39. if (event->buttons() & Qt::LeftButton) {
  40. // 计算鼠标拖拽的偏移量
  41. int dx = event->pos().x() - startPos.x();
  42. int dy = event->pos().y() - startPos.y();
  43. // 改变子窗口的大小
  44. childWidget->resize(startSize.width() + dx, startSize.height() + dy);
  45. }
  46. }
  47. private:
  48. QVBoxLayout *layout;
  49. ChildWidget *childWidget;
  50. QPoint startPos;
  51. QSize startSize;
  52. };
  53. int main(int argc, char *argv[]) {
  54. QApplication app(argc, argv);
  55. ParentWidget parentWidget;
  56. parentWidget.show();
  57. return app.exec();
  58. }
  1. #include <QtWidgets>
  2. class ResizableWidget : public QWidget
  3. {
  4. public:
  5. ResizableWidget(QWidget *parent = nullptr) : QWidget(parent)
  6. {
  7. setWindowFlags(Qt::FramelessWindowHint); // 设置无边框窗口
  8. setMouseTracking(true); // 开启鼠标跟踪
  9. }
  10. protected:
  11. void mousePressEvent(QMouseEvent *event) override
  12. {
  13. if (event->buttons() & Qt::LeftButton) {
  14. // 记录当前鼠标位置和窗口位置
  15. m_startPos = event->globalPos();
  16. m_startGeometry = geometry();
  17. event->accept();
  18. }
  19. }
  20. void mouseMoveEvent(QMouseEvent *event) override
  21. {
  22. if (event->buttons() & Qt::LeftButton) {
  23. // 计算鼠标移动的偏移量
  24. QPoint offset = event->globalPos() - m_startPos;
  25. // 判断鼠标位置,调整窗口大小
  26. if (m_resizeLeft) {
  27. QRect newGeometry = m_startGeometry.adjusted(offset.x(), 0, 0, 0);
  28. setGeometry(newGeometry);
  29. } else if (m_resizeRight) {
  30. QRect newGeometry = m_startGeometry.adjusted(0, 0, offset.x(), 0);
  31. setGeometry(newGeometry);
  32. } else if (m_resizeTop) {
  33. QRect newGeometry = m_startGeometry.adjusted(0, offset.y(), 0, 0);
  34. setGeometry(newGeometry);
  35. } else if (m_resizeBottom) {
  36. QRect newGeometry = m_startGeometry.adjusted(0, 0, 0, offset.y());
  37. setGeometry(newGeometry);
  38. } else if (m_resizeTopLeft) {
  39. QRect newGeometry = m_startGeometry.adjusted(offset.x(), offset.y(), 0, 0);
  40. setGeometry(newGeometry);
  41. } else if (m_resizeTopRight) {
  42. QRect newGeometry = m_startGeometry.adjusted(0, offset.y(), offset.x(), 0);
  43. setGeometry(newGeometry);
  44. } else if (m_resizeBottomLeft) {
  45. QRect newGeometry = m_startGeometry.adjusted(offset.x(), 0, 0, offset.y());
  46. setGeometry(newGeometry);
  47. } else if (m_resizeBottomRight) {
  48. QRect newGeometry = m_startGeometry.adjusted(0, 0, offset.x(), offset.y());
  49. setGeometry(newGeometry);
  50. }
  51. event->accept();
  52. }
  53. }
  54. void mouseReleaseEvent(QMouseEvent *event) override
  55. {
  56. Q_UNUSED(event);
  57. // 重置所有的resize标志
  58. m_resizeLeft = false;
  59. m_resizeRight = false;
  60. m_resizeTop = false;
  61. m_resizeBottom = false;
  62. m_resizeTopLeft = false;
  63. m_resizeTopRight = false;
  64. m_resizeBottomLeft = false;
  65. m_resizeBottomRight = false;
  66. }
  67. void resizeEvent(QResizeEvent *event) override
  68. {
  69. Q_UNUSED(event);
  70. // 设置子窗口的背景颜色,用以区分
  71. setStyleSheet("background-color: yellow;");
  72. }
  73. void enterEvent(QEvent *event) override
  74. {
  75. Q_UNUSED(event);
  76. // 根据鼠标位置设置对应的resize标志
  77. QPoint pos = mapFromGlobal(QCursor::pos());
  78. m_resizeLeft = (pos.x() <= 5);
  79. m_resizeRight = (pos.x() >= width() - 5);
  80. m_resizeTop = (pos.y() <= 5);
  81. m_resizeBottom = (pos.y() >= height() - 5);
  82. m_resizeTopLeft = (m_resizeLeft && m_resizeTop);
  83. m_resizeTopRight = (m_resizeRight && m_resizeTop);
  84. m_resizeBottomLeft = (m_resizeLeft && m_resizeBottom);
  85. m_resizeBottomRight = (m_resizeRight && m_resizeBottom);
  86. }
  87. private:
  88. QPoint m_startPos; // 鼠标按下时的起始位置
  89. QRect m_startGeometry; // 窗口的起始位置和大小
  90. bool m_resizeLeft = false; // 是否可以改变窗口的左边界
  91. bool m_resizeRight = false; // 是否可以改变窗口的右边界
  92. bool m_resizeTop = false; // 是否可以改变窗口的上边界
  93. bool m_resizeBottom = false; // 是否可以改变窗口的下边界
  94. bool m_resizeTopLeft = false; // 是否可以改变窗口的左上角
  95. bool m_resizeTopRight = false; // 是否可以改变窗口的右上角
  96. bool m_resizeBottomLeft = false; // 是否可以改变窗口的左下角
  97. bool m_resizeBottomRight = false; // 是否可以改变窗口的右下角
  98. };
  99. int main(int argc, char *argv[])
  100. {
  101. QApplication app(argc, argv);
  102. QWidget parentWidget;
  103. parentWidget.setGeometry(100, 100, 400, 300);
  104. parentWidget.setStyleSheet("background-color: gray;");
  105. ResizableWidget childWidget(&parentWidget);
  106. childWidget.setGeometry(50, 50, 200, 150);
  107. parentWidget.show();
  108. return app.exec();
  109. }
  1. #include <QtWidgets>
  2. // 自定义的子窗口类
  3. class ChildWidget : public QWidget
  4. {
  5. public:
  6. ChildWidget(QWidget *parent = nullptr) : QWidget(parent)
  7. {
  8. setAutoFillBackground(true);
  9. QPalette palette;
  10. palette.setColor(QPalette::Background, Qt::green);
  11. setPalette(palette);
  12. }
  13. // 鼠标按下事件
  14. void mousePressEvent(QMouseEvent *event) override
  15. {
  16. if (event->button() == Qt::LeftButton)
  17. {
  18. // 记录鼠标按下时的位置
  19. m_lastPos = event->pos();
  20. }
  21. }
  22. // 鼠标移动事件
  23. void mouseMoveEvent(QMouseEvent *event) override
  24. {
  25. // 如果鼠标左键被按下,则进行窗口大小的改变
  26. if (event->buttons() & Qt::LeftButton)
  27. {
  28. // 计算鼠标移动的偏移量
  29. int dx = event->x() - m_lastPos.x();
  30. int dy = event->y() - m_lastPos.y();
  31. // 改变窗口大小
  32. // 这里只实现了拖拽右下角改变大小的功能,你可以根据需求调整和扩展
  33. QSize newSize = size() + QSize(dx, dy);
  34. resize(newSize);
  35. event->accept();
  36. }
  37. }
  38. private:
  39. QPoint m_lastPos;
  40. };
  41. // 自定义的主窗口类
  42. class MainWindow : public QMainWindow
  43. {
  44. public:
  45. MainWindow(QWidget *parent = nullptr) : QMainWindow(parent)
  46. {
  47. // 创建两个QWidget,一个作为主窗口,一个作为子窗口
  48. QWidget *mainWidget = new QWidget(this);
  49. ChildWidget *childWidget = new ChildWidget(mainWidget);
  50. // 使用垂直布局将子窗口添加到主窗口上
  51. QVBoxLayout *layout = new QVBoxLayout(mainWidget);
  52. layout->addWidget(childWidget);
  53. // 将主窗口设置为应用程序的主窗口
  54. setCentralWidget(mainWidget);
  55. }
  56. };
  57. int main(int argc, char *argv[])
  58. {
  59. QApplication app(argc, argv);
  60. MainWindow mainWindow;
  61. mainWindow.show();
  62. return app.exec();
  63. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/94902
推荐阅读
相关标签
  

闽ICP备14008679号