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

Using Qt, how do I resize a widget using the mouse move event going up or to the left

本文关键字:调整 事件 小部 移动 左移 Qt 何使用 鼠标 使用      更新时间:2023-10-16

我有一个具有QWidgetQMainWindow。出现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的计算是负数,因此窗口的大小调整不正确(或根本不正确)。

我意识到向上/向左移动意味着我需要更改小部件的原点,同时根据需要增加宽度/高度,使其右下角保持在同一位置,但我该如何做到这一点?

谢谢!

我会这样做:

 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();
 } 

这是在没有编译器的情况下键入的。

顺便说一句,你可能还需要设置MouseTracking(true),这样,如果你的鼠标移动事件发生在小部件内,你的MyQMainWindow就可以处理它。我不确定这一点。