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

4

我有一个 QMainWindow,里面包含一个 QWidget。这个 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才能处理它。对于这一点我不太确定。


谢谢,我回家后会尝试这个方法,并在成功后接受你的答案。 - sfw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接