首页 文章

使用Qt,如何使用鼠标移动事件向上或向左调整窗口小部件的大小

提问于
浏览
3

我的 QMainWindowQWidget . 出现 QWidget ,其原点设置在 QMainWindow 的鼠标按下事件中 . 然后,在 QMainWindow 的鼠标移动事件中,设置 QWidget 的几何图形,以便看起来用户正在 QMainWindow 上绘制一个矩形 . 这就是我这样做的方式:

void MyQMainWindow::mousePressEvent(QMouseEvent * E) {
    QPoint pos = e->pos();
    myQWidget->setGeometry(pos.x(), pos.y(), 0, 0);
    myQWidget->show();
}

void MyQMainWindow::mouseMoveEvent(QMouseEvent * e) {
    QPoint pos = e->pos();
    QPoint prv = myQWidget->pos();
    int w = pos.x() - prv.x();
    int h = pos.y() - prv.y();

    myQWidget.setGeometry(prv.x(), prv.y(), w, h);
}

void MyQMainWindow::mouseReleaseEvent(QMouseEvent *) {
    myQWidget.hide();
}

这种方法的问题是当我向上拖动鼠标时,或者在我单击的位置左侧 . 我对 wh 的计算是否定的,因此窗口没有正确调整大小(或根本不调整大小) .

我意识到向上/向左移动意味着我需要更改小部件的原点,同时通过根据需要增加宽度/高度来保持小部件的右下角,但是我该怎么做?

谢谢!

1 回答

  • 1

    我会做这样的事情:

    void MyQMainWindow::updateWidgetGeometry()
     {
          if (_initial == QPoint(-1,-1)) {
              return;
          }
    
          x = qMin(_initial.x(), _current.x());
          y = qMin(_initial.y(), _current.y());
          w = abs(_initial.x() - _current.x());
          h = abs(_initial.y() - _current.y());
    
          myQWidget.setGeometry(x, y, w, h);    
     } 
    
     void MyQMainWindow::mousePressEvent(QMouseEvent * E)
     {
          _initial = e->pos();
          _current = e->pos();
          updateWidgetGeometry()
          myQWidget->show();
     } 
    
     void MyQMainWindow::mouseMoveEvent(QMouseEvent * E)
     {
          _current= e->pos();
          updateWidgetGeometry()
     }
    
     void MyQMainWindow::mouseReleaseEvent(QMouseEvent *) 
     {
         _current = QPoint(-1,-1);
         _initial = QPoint(-1,-1);
         myQWidget.hide();
     }
    

    在没有编译器的情况下输入它 .

    顺便说一下,你可能还需要setMouseTracking(true),这样如果你的鼠标移动事件发生在你的MyQMainWindow处理它的小部件内 . 我不确定那一点 .

相关问题