2

私は写真を表示するためのライブラリを手に入れました.PictureGLWidgetと呼びましょう:

class PictureGLWidget: public QGLWidget {

そのため、PictureGLWidget は QGLWidget を拡張します。PictureGlWidget では、

  void PictureGlWidget::mouseReleaseEvent(QMouseEvent* releaseEvent);

すでに実装されています。

私は独自のプロジェクトを開始しました。クラス MyMainWindow としましょう。ここでは、PictureGlWidget を Pointerobject として使用するだけです。

PictureGlWidget * myPictureGLWidget = new PictureGlWidget(...);
//..
layout->addWidget(myPictureGLWidget , 0, 1);

この時点で、すでに PictureGlWidget と対応する画像が MainwindowWidget に表示されています。その PictureGlWidget をクリックしてマウスを押したままにすると、小さな MainWindow よりもはるかに大きいので、(2D スクロールのように) 画像を移動できます。

さらに PictureGlWidget は関数を提供します

bool PictureGlWidget::getPictureLocation(double& xPos, double& yPos);

これは、写真の現在のクリッピングを解放した写真の中心位置を教えてくれます。私の画像は私の小さな MainWindowWidget よりもはるかに大きいため、PictureGLWidget よりもはるかに大きいことを思い出してください。写真のサイズが 4000x4000px (左上 0,0) であると想像してください。PictureGLWidget は、800x800px と表示するだけです。したがって、getPictureLocation() は、現在表示されている画像部分の中心座標を設定し、(400, 400) のような値を返します。これは、中央の左上隅のどこかにある可能性があります。

そのウィジェットをスクロールしてマウスを離した後、現在表示されているピクチャパーツ(その大きな画像のほんの一部)の中心位置を取得したいと思います。私はそれを上書きすることでそれを行うと思った

MyMainWindow::mouseReleaseEvent(QMouseEvent *event){ qDebug() << "Mouse released!"; }

方法ですが、まだどこにも接続していません。現在、それは私の mouseReleases に反応しておらず、そのテキストは表示されません。

4

2 に答える 2

1

一部のイベントに反応するためにオーバーライドできる QWidget の仮想保護メソッドは、「接続」する必要はありません。これらは Qt スロットではなく、必要に応じて Qt が自動的に呼び出す従来の関数です。

Qt Event system docで説明されているように、実装PictureGlWidget::mouseReleaseEvent(QMouseEvent*)がイベントを受け入れる場合、それは親ウィジェットに伝播されません。ただし、PictureGLWidget にイベント フィルターをインストールして、イベントが送信される前に受信することができます。

PictureGlWidget * myPictureGLWidget = new PictureGlWidget(...);
layout->addWidget(myPictureGLWidget , 0, 1);
myPictureGLWidget->installEventFilter(this);

次に、メイン ウィンドウに適切なメソッドを実装します。

bool MyMainWindow::eventFilter(QObject *object, QEvent *event)
{
    if (object == myPictureGLWidget && event->type() == QEvent::MouseButtonRelease) {
        QMouseEvent * mouseEvent = static_cast<QMouseEvent *>(event);
        // Do what you need here
    }
    // The event will be correctly sent to the widget
    return false;
    // If you want to stop the event propagation now:
    // return true
}

やらなければならないことを行った後、イベントを停止するか、PictureQLWidget インスタンスに送信するか (通常の動作) を決定することもできます。

ドキュメント:

于 2015-07-20T13:32:50.340 に答える