图形视图(18):【类】QGraphicsProxyWidget[官翻]

QGraphicsProxyWidget 类

QGraphicsProxyWidget类提供了一个代理层,用于将QWidget嵌入QGraphicsScene中。

Header:#include < QGraphicsProxyWidget>
qmake:QT += widgets
Inherits:QGraphicsWidget
Inherited By:
Since:Qt 4.2

详述

QGraphicsProxyWidget将基于QWidget的小部件(例如QPushButton,QFontComboBox甚至QFileDialog)嵌入QGraphicsScene。 它在两个对象之间转发事件,并在QWidget的基于整数的几何和QGraphicsWidget的基于qreal的几何之间转换。 QGraphicsProxyWidget支持QWidget的所有核心功能,包括标签焦点,键盘输入,拖放和弹出窗口。 您还可以嵌入复杂的小部件,例如带有子小部件的小部件。

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

    QTabWidget *tabWidget = new QTabWidget;

    tabWidget->addTab (new QLabel("hello 1"),"tab1");
    tabWidget->addTab (new QLabel("hello 2"),"tab2");
    tabWidget->addTab (new QLabel("hello 3"),"tab3");
    tabWidget->tabBar ()->setDocumentMode (true);
    tabWidget->tabBar ()->setDrawBase (true);
    tabWidget->setTabShape (QTabWidget::Triangular);

    QGraphicsScene scene(0,0,300,200);
    QGraphicsProxyWidget *proxy = scene.addWidget(tabWidget);
    proxy->moveBy (20,30);

    QGraphicsView view(&scene);
    view.show();

    return app.exec();
}

QGraphicsProxyWidget通过为每个弹出窗口创建一个子代理来自动嵌入嵌入式小部件的弹出子窗口。这意味着当嵌入的QComboBox显示其弹出列表时,将自动创建一个新的QGraphicsProxyWidget,嵌入弹出框并正确定位它。这仅在弹出窗口是嵌入式小部件的子部件时有效(例如QToolButton::setMenu()要求QMenu实例是QToolButton的子部件)。

用QGraphicsProxyWidget嵌入小部件

有两种方法可以使用QGraphicsProxyWidget嵌入小部件。最常见的方法是将一个小部件指针传递到QGraphicsScene::addWidget()以及任何相关的Qt::WindowFlags。这个函数返回一个指向QGraphicsProxyWidget的指针。然后,您可以选择重新导入代理或定位嵌入的小部件本身。

例如,在下面的代码片段中,我们在代理中嵌入了一个分组框:

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

     QTabWidget *tabWidget = new QTabWidget;

     QGraphicsScene scene;
     QGraphicsProxyWidget *proxy = scene.addWidget(tabWidget);

     QGraphicsView view(&scene);
     view.show();

     return app.exec();
 }

下图是其内容边距和内容矩形标记的输出。

img

另一种方法,可以先创建一个新的QGraphicsProxyWidget项,然后调用setWidget()来嵌入一个QWidget。widget()函数的作用是:返回一个指向嵌入小部件的指针。QGraphicsProxyWidget与QWidget共享所有权,因此如果两个小部件中的一个被销毁,另一个小部件将被自动销毁。

小部件同步状态

QGraphicsProxyWidget使其状态与嵌入的小部件保持同步。例如,如果代理被隐藏或禁用,嵌入的小部件也将被隐藏或禁用,反之亦然。当通过调用addWidget()嵌入小部件时,QGraphicsProxyWidget将小部件的状态复制到代理中,在此之后,两者将尽可能保持同步。默认情况下,当您将小部件嵌入到代理中时,小部件和代理都将是可见的,因为QGraphicsWidget在创建时是可见的(您不必调用show())。如果显式隐藏嵌入的小部件,代理也将变得不可见。

 QGraphicsScene scene;

 QLineEdit *edit = new QLineEdit;
 QGraphicsProxyWidget *proxy = scene.addWidget(edit);

 edit->isVisible();  // returns true
 proxy->isVisible(); // also returns true

 edit->hide();

 edit->isVisible();  // returns false
 proxy->isVisible(); // also returns false

QGraphicsProxyWidget为以下状态保持对称:

QWidget stateQGraphicsProxyWidget stateNotes
QWidget::enabledQGraphicsProxyWidget::enabled
QWidget::visibleQGraphicsProxyWidget::visible显式的状态也是对称的。
QWidget::geometryQGraphicsProxyWidget::geometry几何图形只保证在嵌入式小部件可见时是对称的。
QWidget::layoutDirectionQGraphicsProxyWidget::layoutDirection
QWidget::styleQGraphicsProxyWidget::style
QWidget::paletteQGraphicsProxyWidget::palette
QWidget::fontQGraphicsProxyWidget::font
QWidget::cursorQGraphicsProxyWidget::cursor嵌入的小部件覆盖代理小部件光标。代理光标的变化取决于当前鼠标下嵌入的子部件。
QWidget::sizeHint()QGraphicsProxyWidget::sizeHint()来自嵌入式小部件的所有大小提示功能都由代理转发。
QWidget::getContentsMargins()QGraphicsProxyWidget::getContentsMargins()由setWidget()更新一次。
QWidget::windowTitleQGraphicsProxyWidget::windowTitle由setWidget()更新一次。

注意:QGraphicsScene将嵌入的小部件保持在一种特殊状态,以防止它在嵌入小部件时干扰其他小部件(包括嵌入的和未嵌入的)。在这种状态下,小部件的行为可能与未嵌入时略有不同。

警告:提供这个类是为了方便在连接QWidgets和QGraphicsItems时使用,它不应该用于高性能场景。特别是,将小部件嵌入到场景中,然后通过使用OpenGL viewport的QGraphicsView显示,将不会对所有组合工作。

另请参阅QGraphicsScene::addWidget()和QGraphicsWidget。

公共类型

enum anonymous

由virtual type()函数返回的值。

ConstantValueDescription
QGraphicsTextItem::Type12图形代理窗口小部件

公共函数

构造和析构

  1. QGraphicsProxyWidget(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags())
  2. virtual ~QGraphicsProxyWidget()

QWidget

  1. QWidget * widget() const
    void setWidget(QWidget *widget)
  2. QGraphicsProxyWidget * createProxyForChildWidget(QWidget *child)
  3. QRectF subWidgetRect(const QWidget *widget) const

重写的公共函数

  1. virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
  2. virtual void setGeometry(const QRectF &rect) override
  3. virtual int type() const override

重写的受保护的函数

  1. virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override
  2. virtual void dragEnterEvent(QGraphicsSceneDragDropEvent *event) override
  3. virtual void dragLeaveEvent(QGraphicsSceneDragDropEvent *event) override
  4. virtual void dragMoveEvent(QGraphicsSceneDragDropEvent *event) override
  5. virtual void dropEvent(QGraphicsSceneDragDropEvent *event) override
  6. virtual bool event(QEvent *event) override
  7. virtual bool eventFilter(QObject *object, QEvent *event) override
  8. virtual void focusInEvent(QFocusEvent *event) override
  9. virtual bool focusNextPrevChild(bool next) override
  10. virtual void focusOutEvent(QFocusEvent *event) override
  11. virtual void grabMouseEvent(QEvent *event) override
  12. virtual void hideEvent(QHideEvent *event) override
  13. virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override
  14. virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override
  15. virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override
  16. virtual void inputMethodEvent(QInputMethodEvent *event) override
  17. virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const override
  18. virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) override
  19. virtual void keyPressEvent(QKeyEvent *event) override
  20. virtual void keyReleaseEvent(QKeyEvent *event) override
  21. virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override
  22. virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override
  23. virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) override
  24. virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override
  25. virtual void resizeEvent(QGraphicsSceneResizeEvent *event) override
  26. virtual void showEvent(QShowEvent *event) override
  27. virtual QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const override
  28. virtual void ungrabMouseEvent(QEvent *event) override
  29. virtual void wheelEvent(QGraphicsSceneWheelEvent *event) override

受保护的槽函数

  1. QGraphicsProxyWidget * newProxyWidget(const QWidget *child)

演示代码

#include <QtWidgets>

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

    QGroupBox *groupBox = new QGroupBox("Contact Details");
    QLabel *numberLabel = new QLabel("Telephone number");
    QLineEdit *numberEdit = new QLineEdit;

    QFormLayout *layout = new QFormLayout;
    layout->addRow(numberLabel, numberEdit);
    groupBox->setLayout(layout);


    QGraphicsScene scene;
    QGraphicsProxyWidget *proxy = scene.addWidget(groupBox);
    proxy->setWindowFlags (Qt::Dialog);
    QGraphicsView view(&scene);
    view.show();

    return app.exec();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值