3

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

このアプローチの問題は、マウスを上にドラッグしたとき、またはクリックした場所の左にドラッグしたときです。wとの計算hが負であるため、ウィンドウのサイズが正しく(またはまったく)変更されません。

上/左に移動すると、必要に応じて幅/高さも増やしてウィジェットの右下隅を同じ場所に保ちながら、ウィジェットの原点を変更する必要があることを理解していますが、これを行うにはどうすればよいですか?

ありがとう!

4

1 に答える 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();
 } 

コンパイラなしでこれを入力しました。

ちなみに、マウス移動イベントがウィジェット内で発生した場合にMyQMainWindowがそれを処理できるように、setMouseTracking(true)も必要になる場合があります。そのビットについてはよくわかりません。

于 2012-08-02T17:56:42.123 に答える