3

次のコードは、GraphicsViewFrameworkのドキュメントに基づいています。QLineEditをQGraphicsSceneに埋め込み、プログラムを実行します。シーンの行編集を右クリックすると、クリップされたコンテキストメニューが表示されます。QGraphicsProxyWidgetのコンテキストメニューは、子QGraphicsProxyWidgetとしてシーンによって描画されるため、ウィンドウが小さすぎるとクリップされます。すべての埋め込みウィジェットに、QGraphicsSceneに埋め込まれていないときと同じように、コンテキストメニューをトップレベルウィンドウとして表示したいと思います。BypassGraphicsProxyWidgetフラグを2つの方法で試しましたが、希望どおりに機能しません。LinuxおよびWindowsのQt4.8/5.0でテスト済み。すべてのプラットフォームで同じ問題。

埋め込みウィジェットに、ネイティブな外観の通常のトップレベルのコンテキストメニューを表示させるにはどうすればよいですか?QGraphicsViewのcontextMenuEventをオーバーロードすると、ネイティブのトップレベルのコンテキストメニューが提供されます-ある種の委任を実行して、QGraphicsViewにシーンに埋め込まれたウィジェットのコンテキストメニューを表示させることはできますか?

#include <QApplication>
#include <QLineEdit>
#include <QGraphicsScene>
#include <QGraphicsProxyWidget>
#include <QGraphicsView>

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    QGraphicsScene scene;
    QGraphicsProxyWidget *proxy = scene.addWidget(new QLineEdit(), Qt::BypassGraphicsProxyWidget);

    QGraphicsView view(&scene);
    view.setWindowFlags(Qt::BypassGraphicsProxyWidget);
    view.show();

    return app.exec();
}
4

2 に答える 2

1

Qt::BypassGraphicsProxyWidget セットを持つ QWidget を追加することで、ネイティブ コンテキスト メニューを取得します。子はコンテキスト メニューをポップアップ ネイティブ スタイルとしてレンダリングします。

#ifndef QGLPARENT_H
#define QGLPARENT_H

#include <QGLWidget>
#include <QGraphicsScene>
#include <QGraphicsProxyWidget>
#include <QGraphicsView>

class QGLParent : public QGraphicsView
{
private:
    QGraphicsProxyWidget *child;
public:
    QGLParent(QWidget *parent, QWidget *child) : QGraphicsView(parent)
    {
        setFrameShape(QFrame::NoFrame);
        QGLFormat format(QGL::SampleBuffers);
        format.setSwapInterval(1);

        setScene(new QGraphicsScene());
                setViewport(new QGLWidget(format));
                //setViewportUpdateMode(QGraphicsView::FullViewportUpdate);

        child->setWindowFlags(Qt::BypassGraphicsProxyWidget);
        this->child = scene()->addWidget(child);
    }
protected:
    void resizeEvent(QResizeEvent *event)
    {
        scene()->setSceneRect(QRect(QPoint(0, 0), event->size()));
        child->resize(event->size().width(), event->size().height());
        QGraphicsView::resizeEvent(event);
    }
};

#endif
于 2012-12-29T19:29:52.017 に答える
1

残念ながら、これは既知のバグQTBUG-10683です。バグレポートの最後のコメントで回避策が提案されています。

于 2012-12-28T00:44:21.183 に答える