9

QGraphicsViewがオンになっている間にカーソルを変更しようとしていますが、ScrollHandDragうまくいかないようです。無効にするとカーソルを変更できますが、ScrollHandDragアクティブな間は変更できません。何が間違っているのかわかりません...

以下は、問題を再現するコードの一部です。

QApplication app(argc, argv);
QGraphicsScene scene;
QRect rectangle(-8, -4, 100, 100);
QPen pen(Qt::blue, 1, Qt::SolidLine);
scene.addRect(rectangle, pen);
scene.setBackgroundBrush(Qt::white);
QGraphicsView vue(&scene);
vue.setFixedSize(250, 250);
//vue.setDragMode(QGraphicsView::ScrollHandDrag);
vue.setCursor(Qt::CrossCursor);
vue.show();

return app.exec();
4

2 に答える 2

14

QGraphicsViewドラッグ中にカーソルが自動的に変更されますが、いくつかの関数を再実装することで簡単に修正できます。

class CoolView : public QGraphicsView
{
protected:
    void enterEvent(QEvent *event)
    {
        QGraphicsView::enterEvent(event);
        viewport()->setCursor(Qt::CrossCursor);
    }

    void mousePressEvent(QMouseEvent *event)
    {
        QGraphicsView::mousePressEvent(event);
        viewport()->setCursor(Qt::CrossCursor);
    }

    void mouseReleaseEvent(QMouseEvent *event)
    {
        QGraphicsView::mouseReleaseEvent(event);
        viewport()->setCursor(Qt::CrossCursor);
    }
};
于 2012-06-08T17:54:10.133 に答える
4

Qt のソース コードをいじってみると、ドラッグ モードに入ったときにそのカーソルを制御しているように見えますが、それを止める方法はありません。

私が知っている唯一の回避策は、カーソルをグローバルに設定するQApplication::setOverrideCursor()を使用することです。残念ながら、これは、アプリケーション全体がどこでも同じカーソルで動けなくなるのを防ぐためにQApplication::restoreOverrideCursor()、マウスカーソルがいつ出入りするかを管理する必要があることを意味します。QGraphicsView

また、カーソルがビューポート レベルで設定されていることにも注意してください。vue.viewport()->setCursor(Qt::CrossCursor)

参考資料:

QApplication::setOverrideCursor

QApplication::restoreOverrideCursor

QApplication::changeOverrideCursor

于 2012-06-08T16:45:43.397 に答える