【问题标题】:Using Qt, how do I resize a widget using the mouse move event going up or to the left使用 Qt,如何使用向上或向左的鼠标移动事件调整小部件的大小
【发布时间】:2012-08-02 16:19:46
【问题描述】:

我有一个QMainWindow,它有一个QWidgetQWidget 出现,并在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 的计算为负数,因此窗口没有正确(或根本没有)调整大小。

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

谢谢!

【问题讨论】:

    标签: c++ qt qt4 qwidget


    【解决方案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 可以处理它。我不确定那一点。

    【讨论】:

    • 谢谢,我回家后会试试这个并接受你的成功回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多