QtのQGraphicsView高度な記事

著者:ビリー
著作権:著作権は作者によって予約、非商用の転載元を明記してください、作者が許可連絡商用再版してください

序文

前の章では、QGraphicsViewの基本的な内容を紹介し、具体的に参照してください。QtののQGraphicsView序章この章では、我々はそこにどのような特定の特性GraphicsViewフレームワークを見てください。

衝突検出

スケーリングと回転

QGraphicsViewにより、 QGraphicsView :: setMatrix() QPainterのサポートと同じアフィン変換、ビューへの変換を適用することにより、簡単に共通のナビゲーションズーム、回転などの機能をサポートすることができます。

例:

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QDialog>
#include <QVBoxLayout>
#include <QPushButton>

class MyGraphicsView : public QGraphicsView	// 自定义视图类,实现对视图的缩放和旋转
{
public:
    MyGraphicsView() {}

public slots:
    void zoomIn() { scale(1.2, 1.2); }
    void zoomOut() { scale(1/1.2, 1/1.2); }
    void rotateLeft() { rotate(-30); }
    void rotateRight() { rotate(30); }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QGraphicsScene scene;   // 定义一个场景,设置背景色为红色
    scene.setBackgroundBrush(Qt::red);

    QPen pen;   // 定义一个画笔,设置画笔颜色和宽度
    pen.setColor(QColor(0, 160, 230));
    pen.setWidth(10);

    QGraphicsRectItem *m_rectItem = new QGraphicsRectItem();   // 定义一个矩形图元
    m_rectItem->setRect(0, 0, 80, 80);
    m_rectItem->setPen(pen);
    m_rectItem->setBrush(QBrush(QColor(255, 255, 255)));
    m_rectItem->setFlag(QGraphicsItem::ItemIsMovable);
    scene.addItem(m_rectItem);      // 把矩形图元添加到场景

    QDialog *dialog = new QDialog(nullptr, Qt::CustomizeWindowHint | Qt::WindowTitleHint);
    dialog->setWindowOpacity(0.8);
    dialog->setWindowTitle("operation");
    dialog->setLayout(new QVBoxLayout);
    QPushButton *m_zoomInBtn = new QPushButton("zoomIn");
    QPushButton *m_zoomOutBtn = new QPushButton("zoomOut");
    QPushButton *m_rotateLeftBtn = new QPushButton("rotateLeft");
    QPushButton *m_rotateRightBtn = new QPushButton("rotateRight");
    dialog->layout()->addWidget(m_zoomInBtn);
    dialog->layout()->addWidget(m_zoomOutBtn);
    dialog->layout()->addWidget(m_rotateLeftBtn);
    dialog->layout()->addWidget(m_rotateRightBtn);
    scene.addWidget(dialog);

    MyGraphicsView view; // 定义一个视图,并把场景添加到视图
    view.setScene(&scene);
    view.resize(1024, 768);
    view.show();

    // 点击按钮实现视图的缩放和旋转
    QObject::connect(m_zoomInBtn, &QPushButton::clicked, [&]() { view.zoomIn(); });
    QObject::connect(m_zoomOutBtn, &QPushButton::clicked, [&]() { view.zoomOut(); });
    QObject::connect(m_rotateLeftBtn, &QPushButton::clicked, [&]() { view.rotateLeft(); });
    QObject::connect(m_rotateRightBtn, &QPushButton::clicked, [&]() { view.rotateRight(); });

    return a.exec();
}

ここに画像を挿入説明

プリント

印刷中のQtのサポートは、ので、あなたのプログラムにはQtの印刷機能を使用するためには、あなたが最初のプロファイルを追加する必要があり、完了するために、独立したprintsupportモジュールを持つことです。
QT + = printsupport

機能を示すグラフィカルビュースルー:QGraphicsSceneを::)(レンダリングとQGraphicsView ::レンダリング()は、単一の行(シングルライン)の印刷を提供します。これらの機能は、同じAPIを提供し、QPainterの表示関数に渡されることで、あなたがシーンを印刷することができ、コンテンツの全部または一部を表示します。

その中のシーンの異なるレンダリング機能とビュー QGraphicsScene ::シーンの座標を使用して)(レンダリング、およびQGraphicsView ::(レンダリング)ビューの座標を使用してQGraphicsScene ::()レンダリングは、多くの場合、例えば、印刷パターンデータやテキストドキュメントをモノリシック変換されていないシーンを印刷するために使用されます。QGraphicsView ::レンダリング()デフォルトでは、ビューポートの現在の内容を示す、スクリーンショット(スクリーンショット)を印刷するのに適しています。

公式例:ここに画像を挿入説明ここに画像を挿入説明

ドラッグ&ドロップ

QGraphicsViewはQWidgetから継承しているので、GraphicsViewにもドラッグアンドドロップ機能を提供します。また、フレームワークもGraphicsViewシーンプリミティブはサポートドラッグ&ドロップを提供しています。ビューは、ドラッグイベントを受信したときに、ドラッグ事象GraphicsViewフレームはQGraphicsSceneDragDropEventイベントを変換し、その後シーンに送られ、シーン、イベントを引き継ぐ、次いで図の受付第カーソルドラッグ要素にイベントを送信します。

シーンでのドラッグイベントを得るために、あなたがする必要がQGraphicsScene :: dragEnterEvent()およびサブクラスシーンQGraphicsItemの中にあなたのイベントハンドラのいずれかの特定のニーズを再実装。ドラッグ&ドロップのサポートアイテムも実施すべきプロセスをドラッグするために、)(QGraphicsItem :: setAcceptDropsを呼び出すことによって取得することができ、必要にQGraphicsItem :: dragEnterEvent()、QGraphicsItem :: dragMoveEvent()、QGraphicsItem :: dragLeaveEvent()とQGraphicsItem再実装:: dropEvent()。

カーソルのヒント&ツール

QWidgetのように、のような、QGraphicsItemもカーソルQgraphicsItem ::はsetCursor()とツールチップQGraphicsItem :: setToolTip()をサポートしています。カーソルが項目の領域に入ると、カーソルが促されるQGraphicsView活性化ツールはQGraphicsItemを呼び出すことによって検出さ::含有します()。またQGraphicsViewビュー上で直接、デフォルトのカーソルを設定することができます::はsetCursor()。

アニメーション

GraphicsViewフレームワークは、簡単にアニメーションを作成することができ、アニメーションフレームワークを使用して、アニメーションの複数のレベルをサポートしています。アニメーションGraphicsViewフレームワークは、以下の種の実現をサポートします:

  • プリミティブはQGraphicsObjectから継承する必要がある、とのカップリングプロパティQPropertyAnimationが必要です;
  • QObjectのとQGraphicsItemプリミティブからの継承を作成すると、プリミティブはQObjectを::このTimeEvent()段階的な様式で増加することによってアニメーションを制御するために、独自のタイマーを設定することができます;
  • QGraphicsSceneを呼び出すことによって、シーンを進めるために::アドバンス()、順番にQGraphicsItemを呼び出します::アドバンス();

OpenGLレンダリング

OpenGLレンダリングを使用するためには、ビューポートQGraphicsView QGraphicsView :: SETVIEWPORT()などの新しいQGLWidgetを設定します。あなたはアンチエイリアシングを提供するために、OpenGLを取得した場合、あなたは、OpenGLサンプルバッファのサポートを必要としています。

QGraphicsView view;
view.setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
view.setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
view.setScene(new OpenGLScene);
view.show();

アイテムのグループ

別の子としてのプリミティブプリミティブによって、あなたは原始的なグループの本質的な特徴のほとんどを得ることができます。すべての要素は、すべての変換親から子に渡され、一緒に移動します

さらに、QGraphicsItemGroupは特別なプリミティブです。要素を追加したり削除したりするには、イベント処理のサブエンティティをマージするための便利なインターフェイスを使用しています。QGraphicsItemGroupは、変換図の元の位置に留まるプリミティブと親エンティティを再割り当てするであろうプリミティブ素子に印加次いでその新しい親に係る要素の位置を変更します。)(QGraphicsScene :: createItemGroupで原始的なグループを作成することができます。

レイアウトとグラフィックスコンポーネント

QGraphicsWidgetによってQT4.4は、グラフィックスプリミティブとレイアウトをサポートしています。QWidgetのに似てQGraphicsWidgetが、QGraphicsWidgetはQPaintDeviceから継承しますが、QGraphicsItemから継承されません。QGraphicsWidgetサポートイベント、シグナルとスロット、サイズ及び戦略。、QGraphicsGridLayoutはQGraphicsLinearLayoutグラフィカル要素のレイアウトを管理することができます。

このようなスタイル、フォント、カラーパレット、レイアウト方向QWidgetのとQGraphicsItemグラフィック、精度と独立変換サポートとしてQGraphicsWidget継承QWidgetのとQGraphicsItem利点。

QGraphicsLayout QGraphicsWidgetは、特別に設計されたフレームレイアウトの第二世代のために設計されています。QLayoutに似たAPIをQGraphicsLayout。あなたはQGraphicsLinearLayoutとQGraphicsGridLayoutによってコンポーネントとサブレイアウトを管理することができます。

組み込みコンポーネント

グラフィカルビューフレームワークのシームレスなサポートにシーンに埋め込まれた任意のコンポーネントを提供します。単純なコンポーネントは、そのようなQTableWidgetまたは複合部品などにQLineEdit、のQPushButton、さらにはメインウィンドウとして、埋め込まれていてもよいです。

シーンに埋め込む部品に、ちょうどQGraphicsScene :: addWidget()を呼び出し、またはQGraphicsProxyWidget例、手動で埋め込まれたコンポーネントを作成します。クライアントコンポーネントは、アセンブリボックス、および活性化入力フォーカスダウン再生、サブアセンブリ、例えばカーソル、ツールチップ、マウス、タブレットやキーボードイベントなどQGraphicsProxyWidget特性、フレームの深さのグラフィカルビューでアニメーションを統合することができます。QGraphicsProxyWidgetでも組み込み統合アセンブリタブ順序は、組み込みコンポーネント]タブで選択することができます。でもQGraphicsViewは、シーンの中に埋め込まれていてもよいです。

公開された63元の記事 ウォンの賞賛220 ・は 10000 +を見て

おすすめ

転載: blog.csdn.net/qq_34139994/article/details/105331578