文章目录
- 详述
- 公共类型
- 属性
- autoFillBackground : bool
- focusPolicy : Qt::FocusPolicy
- font : QFont
- geometry : QRectF
- layout : QGraphicsLayout
- layoutDirection : Qt::LayoutDirection
- maximumSize : const QSizeF
- minimumSize : const QSizeF
- palette : QPalette
- preferredSize : const QSizeF
- size : QSizeF
- sizePolicy : const QSizePolicy
- windowFlags : Qt::WindowFlags
- windowTitle : QString
- 公共函数
- 重写的公共函数
- 公共槽
- 信号
- 静态公共函数
- 受保护的函数
- 重写的受保护的函数
- 演示代码
QGraphicsWidget 类
QGraphicsWidget类是QGraphicsScene中所有小部件项目的基类。
Header: | #include < QGraphicsWidget > |
---|---|
qmake: | QT += widgets |
Inherits: | QGraphicsObject ,QGraphicsLayoutItem |
Inherited By: | QGraphicsProxyWidget |
Since: | Qt 4.2 |
详述
QGraphicsWidget是一个扩展的基础项目,它提供了QGraphicsItem以外的其他功能。它在许多方面类似于QWidget:
- 提供一个调色板,一个字体和一个style() 。
- 具有定义的geometry() 。
- 通过setLayout() 和layout() 支持布局。
- 支持grabShortcut() 和insertAction() 的快捷方式和操作
与QGraphicsItem不同,QGraphicsWidget不是抽象类。您可以创建QGraphicsWidget的实例,而不必对其进行子类化。对于仅用于将子小部件组织到布局中的目的的小部件,此方法很有用。
如果您需要高级输入焦点处理(例如,标签焦点和激活或布局),则QGraphicsWidget可用作您自己的自定义项目的基础项目。
由于QGraphicsWidget与QWidget类似并且具有相似的API,因此将小部件从QWidget移植到QGraphicsWidget而不是QGraphicsItem更加容易。
注意:可以使用QGraphicsProxyWidget将基于QWidget的窗口小部件直接嵌入到QGraphicsScene中。
QGraphicsWidget和QWidget之间的明显区别是:
QGraphicsWidget | QWidget |
---|---|
坐标和几何图形是用qreal(双精度浮点数,取决于平台)定义的。 | QWidget使用整数几何(QPoint, QRect)。 |
默认情况下,小部件已经是可见的;您不必调用show()来显示小部件。 | QWidget默认是隐藏的,直到调用show()。 |
支持小部件属性的子集。 | 支持所有小部件属性。 |
顶级项目的样式默认为QGraphicsScene::style | 顶级小部件的样式默认为QApplication::style |
图形视图提供了一个自定义的拖放框架,不同于QWidget。 | 标准的拖放框架。 |
小部件项不支持模态。 | 全面的模态支持。 |
QGraphicsWidget支持Qt的widget属性的子集(Qt::WidgetAttribute),如下表所示。 此表中未列出的所有属性均不受支持或未使用。
Widget Attribute | Usage |
---|---|
Qt::WA_SetLayoutDirection | 由setLayoutDirection() 设置,由unsetLayoutDirection() 清除。 您可以测试此属性,以检查是否已为窗口小部件明确分配了layoutDirection。 如果未设置该属性,则将继承layoutDirection() 。 |
Qt::WA_RightToLeft | 由setLayoutDirection() 切换。 继承自父级/场景。 如果设置,则小部件的布局将按从右到左的顺序排列水平排列的小部件。 |
Qt::WA_SetStyle | 由setStyle() 设置和清除。 如果设置了此属性,则已为窗口小部件明确指定了样式。 如果未设置,则小部件将使用场景或应用程序的样式。 |
Qt::WA_Resized | 由setGeometry() 和resize() 设置。 |
Qt::WA_SetPalette | 由setPalette() 设置。 |
Qt::WA_SetFont | 由setFont() 设置。 |
Qt::WA_WindowPropagation | 允许传播到窗口小部件。 |
尽管QGraphicsWidget继承自QObject和QGraphicsItem,但是您应该使用QGraphicsItem提供的功能(而不是QObject)来管理父项和子项之间的关系。 这些功能控制物品的堆叠顺序及其所有权。
注意:QObject::parent() 应该始终为QGraphicsWidgets返回nullptr,但是未严格定义此策略。
另请参见QGraphicsProxyWidget,QGraphicsItem以及小部件和布局。
公共类型
enum anonymous
由virtual type()函数返回的值。
Constant | Value | Description |
---|---|---|
QGraphicsTextItem::Type | 11 | 图形小部件项 |
属性
autoFillBackground : bool
此属性保存是否自动填充小部件背景
如果启用,此属性将导致Qt在调用paint() 方法之前填充小部件的背景。 使用的颜色由小部件调色板中的QPalette::Window颜色角色定义。
此外,除非设置了WA_OpaquePaintEvent或WA_NoSystemBackground属性,否则Windows始终会用QPalette::Window填充。
默认情况下,此属性为false。此属性在Qt 4.7中引入。
Access functions:
- bool autoFillBackground() const
- void setAutoFillBackground(bool enabled)
另请参见Qt::WA_OpaquePaintEvent和Qt::WA_NoSystemBackground。
focusPolicy : Qt::FocusPolicy
此属性保存小部件接受键盘焦点的方式
如果窗口小部件通过制表键接受键盘焦点,则焦点策略为Qt::TabFocus;如果窗口小部件通过单击接受焦点,则焦点策略为Qt::ClickFocus;如果窗口小部件同时接受两者,则焦点策略为Qt::StrongFocus;如果它同时接受Qt::NoFocus(默认值) 根本不接受焦点。
如果小部件处理键盘事件,则必须为其启用键盘焦点。 通常这是从小部件的构造函数完成的。 例如,QLineEdit构造函数调用setFocusPolicy(Qt::StrongFocus)。
如果启用焦点策略(即,不是Qt::NoFocus),则QGraphicsWidget将自动启用ItemIsFocusable标志。 在小部件上设置Qt::NoFocus将清除ItemIsFocusable标志。 如果小部件当前具有键盘焦点,则该小部件将自动失去焦点。
Access functions:
- Qt::FocusPolicy focusPolicy() const
- void setFocusPolicy(Qt::FocusPolicy policy)
另请参见focusInEvent() ,focusOutEvent() ,keyPressEvent() ,keyReleaseEvent() 和 enabled。
font : QFont
该属性保存小部件的字体
QFont由已明确定义的字体属性和从小部件的父级隐式继承的属性组成。 因此,与使用setFont() 设置的字体相比,font() 可以返回不同的字体。 该方案允许您在字体中定义单个条目,而不会影响字体的继承条目。
当窗口小部件的字体更改时,它将根据其父窗口小部件解析其条目。 如果该窗口小部件没有父窗口小部件,它将根据场景解析其条目。 然后,小部件将自己发送一个FontChange事件并通知其所有后代,以便他们也可以解析其字体。
默认情况下,此属性包含应用程序的默认字体。
Access functions:
- QFont font() const
- void setFont(const QFont &font)
另请参见QApplication::font() ,QGraphicsScene::font和QFont::resolve() 。
geometry : QRectF
此属性保存小部件的几何形状
设置项目的几何形状为矩形。 调用此函数可修改项目的位置和大小。 该项目首先被移动,然后被调整大小。
调用此函数的副作用是该小部件将接收一个move事件和一个resize事件。 此外,如果为小部件分配了布局,则该布局将被激活。
Access functions:
- QRectF QGraphicsLayoutItem::geometry() const
- void setGeometry(qreal x, qreal y, qreal w, qreal h)
layout : QGraphicsLayout
该属性保存小部件的布局
在分配新布局之前,将删除任何现有的布局管理器。 如果layout为nullptr,则该窗口小部件将不具有布局。 现有的subwidgets的几何形状将不受影响。
QGraphicsWidget获取布局的所有权。
当前由布局或其所有子布局管理的所有小部件都将自动重新设置为此项目的父级。 然后使布局无效,并且根据该项目的geometry() 和contentsMargins() 调整子窗口小部件的几何形状。 将布局分配给此小部件后,未由布局明确管理的子代将不受布局的影响。
如果当前没有布局管理此小部件,则layout() 将返回nullptr。
Access functions:
- QGraphicsLayout * layout() const
- void setLayout(QGraphicsLayout *layout)
Notifier signal:
- void layoutChanged()
layoutDirection : Qt::LayoutDirection
此属性保存此小部件的布局方向
此属性修改此小部件及其所有后代的Qt::WA_RightToLeft属性。它还设置了此小部件的Qt::WA_SetLayoutDirection属性。
小部件的布局方向确定布局管理器水平排列此小部件的子小部件的顺序。默认值取决于应用程序的语言和语言环境,并且通常与读取和写入单词的方向相同。使用Qt::LeftToRight,布局开始从此小部件的左侧向右侧放置子小部件。 Qt::RightToLeft做相反的事情-布局将从右边缘开始向左放置小部件。
子小部件从父级继承其布局方向。顶级小部件项目从QGraphicsScene::layoutDirection继承其布局方向。如果通过调用setLayoutDirection() 来更改窗口小部件的布局方向,则该窗口小部件将向自身发送LayoutDirectionChange事件,然后将新的布局方向传播到其所有后代。
Access functions:
- Qt::LayoutDirection layoutDirection() const
- void setLayoutDirection(Qt::LayoutDirection direction)
- void unsetLayoutDirection()
另请参见QWidget::layoutDirection和QApplication::layoutDirection。
maximumSize : const QSizeF
此属性保存小部件的最大大小
另请参见QGraphicsLayoutItem::setMaximumSize() ,QGraphicsLayoutItem::maximumSize() 。
minimumSize : const QSizeF
此属性保存小部件的最小大小
另请参见QGraphicsLayoutItem::setMinimumSize(), QGraphicsLayoutItem::minimumSize()。
palette : QPalette
此属性保存小部件的调色板
调色板为颜色组(例如QPalette::Button)和状态(例如QPalette::Inactive)提供颜色和画笔,从而松散定义了小部件及其子级的一般外观。
QPalette由已经明确定义的颜色组和从小部件的父级隐式继承的组组成。 因此,palette() 可以返回与setPalette() 所设置的调色板不同的调色板。 该方案允许您在调色板中定义单个条目,而不会影响调色板的继承条目。
当窗口小部件的调色板更改时,它将根据其父窗口小部件解析其条目,或者如果它没有父窗口小部件,则针对场景进行解析。 然后,它向自己发送一个PaletteChange事件,并通知其所有后代,以便他们也可以解析其调色板。
默认情况下,此属性包含应用程序的默认调色板。
Access functions:
- QPalette palette() const
- void setPalette(const QPalette &palette)
另请参见QGuiApplication::palette() ,QGraphicsScene::palette和QPalette::resolve() 。
preferredSize : const QSizeF
此属性保存小部件的首选大小
另请参见QGraphicsLayoutItem::setPreferredSize() ,QGraphicsLayoutItem::preferredSize() 。
size : QSizeF
此属性保存小部件的大小
调用resize() 会将窗口小部件的大小调整为由minimumSize() 和maximumSize() 限制的大小。 此属性仅影响窗口小部件的宽度和高度(例如,其右边缘和底边缘); 小部件的位置和左上角不受影响。
调整窗口小部件的大小会触发窗口小部件立即接收具有窗口小部件的旧大小和新大小的GraphicsSceneResize事件。 如果在此事件到达时为窗口小部件分配了布局,则该布局将被激活,并且它将自动更新任何子窗口小部件的几何形状。
此属性不会影响父窗口小部件的任何布局。 如果小部件本身由父级布局管理; 例如,它具有分配了布局的父窗口小部件,该布局将不会激活。
默认情况下,此属性包含一个宽度和高度为零的大小。
Access functions:
- QSizeF size() const
- void resize(const QSizeF &size)
- void resize(qreal w, qreal h)
Notifier signal:
- void geometryChanged()
sizePolicy : const QSizePolicy
此属性保存窗口小部件的大小策略
另请参见QGraphicsLayoutItem::sizePolicy() ,QGraphicsLayoutItem::setSizePolicy() 和QWidget::sizePolicy() 。
windowFlags : Qt::WindowFlags
此属性保存窗口小部件的窗口标志
窗口标志是窗口类型(例如Qt::Dialog)和几个标志的组合,这些标志提供了有关窗口行为的提示。 该行为是平台相关的。
默认情况下,此属性不包含任何窗口标志。
窗户是面板。 如果设置了Qt::Window标志,ItemIsPanel标志将被自动设置。 如果清除Qt::Window标志,则也会清除ItemIsPanel标志。 请注意,可以独立于Qt::Window设置ItemIsPanel标志。
Access functions:
- Qt::WindowFlags windowFlags() const
- void setWindowFlags(Qt::WindowFlags wFlags)
参见QGraphicsItem::isWindow() 和QGraphicsItem::isPanel() 。
windowTitle : QString
此属性保存窗口标题(标题) 此属性仅用于Windows。
默认情况下,如果未设置标题,则此属性包含一个空字符串。
Access functions:
- QString windowTitle() const
- void setWindowTitle(const QString &title)
公共函数
构造和析构
- QGraphicsWidget(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags())
- virtual ~QGraphicsWidget()
属性相关
- bool autoFillBackground() const
- void setAutoFillBackground(bool enabled)
- Qt::FocusPolicy focusPolicy() const
- void setFocusPolicy(Qt::FocusPolicy policy)
- QFont font() const
- void setFont(const QFont &font)
- void setGeometry(qreal x, qreal y, qreal w, qreal h)
- QGraphicsLayout * layout() const
- void setLayout(QGraphicsLayout *layout)
- Qt::LayoutDirection layoutDirection() const
- void setLayoutDirection(Qt::LayoutDirection direction)
- void unsetLayoutDirection()
- QPalette palette() const
- void setPalette(const QPalette &palette)
- QSizeF size() const
- void resize(const QSizeF &size)
- void resize(qreal w, qreal h)
- Qt::WindowFlags windowFlags() const
- void setWindowFlags(Qt::WindowFlags wFlags)
- QString windowTitle() const
- void setWindowTitle(const QString &title)
QAction
- QList<QAction *> actions() const
- void addAction(QAction *action)
- void addActions(QList<QAction *> actions)
- void insertAction(QAction *before, QAction *action)
- void insertActions(QAction *before, QList<QAction *> actions)
- void removeAction(QAction *action)
Margin
- virtual void getContentsMargins(qreal *left, qreal *top, qreal *right, qreal *bottom) const override
- void setContentsMargins(QMarginsF margins)
- void setContentsMargins(qreal left, qreal top, qreal right, qreal bottom)
- void getWindowFrameMargins(qreal *left, qreal *top, qreal *right, qreal *bottom) const
- void setWindowFrameMargins(QMarginsF margins)
- void setWindowFrameMargins(qreal left, qreal top, qreal right, qreal bottom)
- void unsetWindowFrameMargins()
Shortcut
- int grabShortcut(const QKeySequence &sequence, Qt::ShortcutContext context = Qt::WindowShortcut)
- void setShortcutEnabled(int id, bool enabled = true)
- void releaseShortcut(int id)
- void setShortcutAutoRepeat(int id, bool enabled = true)
大小
- QRectF rect() const
- QRectF windowFrameGeometry() const
- QRectF windowFrameRect() const
风格
- QStyle * style() const
- void setStyle(QStyle *style)
其它
- void adjustSize()
- QGraphicsWidget * focusWidget() const
- bool isActiveWindow() const
- virtual void paintWindowFrame(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr)
- Qt::WindowType windowType() const
重写的公共函数
- virtual QRectF boundingRect() const override
- virtual void getContentsMargins(qreal *left, qreal *top, qreal *right, qreal *bottom) const override
- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override
- virtual void setGeometry(const QRectF &rect) override
- virtual QPainterPath shape() const override
- virtual int type() const override
公共槽
- bool close()
信号
- void geometryChanged()
- void layoutChanged()
静态公共函数
- void setTabOrder(QGraphicsWidget *first, QGraphicsWidget *second)
受保护的函数
- virtual void changeEvent(QEvent *event)
- virtual void closeEvent(QCloseEvent *event)
- virtual bool focusNextPrevChild(bool next)
- virtual void grabKeyboardEvent(QEvent *event)
- virtual void grabMouseEvent(QEvent *event)
- virtual void hideEvent(QHideEvent *event)
- virtual void initStyleOption(QStyleOption *option) const
- virtual void moveEvent(QGraphicsSceneMoveEvent *event)
- virtual void polishEvent()
- virtual void resizeEvent(QGraphicsSceneResizeEvent *event)
- virtual void showEvent(QShowEvent *event)
- virtual void ungrabKeyboardEvent(QEvent *event)
- virtual void ungrabMouseEvent(QEvent *event)
- virtual bool windowFrameEvent(QEvent *event)
- virtual Qt::WindowFrameSection windowFrameSectionAt(const QPointF &pos) const
重写的受保护的函数
- virtual bool event(QEvent *event) override
- virtual void focusInEvent(QFocusEvent *event) override
- virtual void focusOutEvent(QFocusEvent *event) override
- virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override
- virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override
- virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) override
- virtual bool sceneEvent(QEvent *event) override
- virtual QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const override
- virtual void updateGeometry() override
演示代码
#include <QtWidgets>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
app.setApplicationName ("Graphics Framework");
QGraphicsScene scene;
scene.setSceneRect(0, 0, 800, 480);
QGraphicsWidget *w = new QGraphicsWidget(nullptr, Qt::Window);
w->resize (400,300);
w->setPos (50,50);
w->setGeometry (50,50,400,300);
QObject::connect (w,&QGraphicsWidget::geometryChanged,[&]{
qDebug() << w->geometry () << w->windowFrameGeometry ();
});
QPalette palette = app.palette ();
palette.setBrush (QPalette::Background,Qt::red);
w->setPalette (palette);
w->setWindowTitle ("QGraphicsWidget");
w->setFlags (QGraphicsItem::ItemIsMovable);
scene.addItem(w);
scene.setBackgroundBrush(Qt::darkGreen);
QGraphicsView view(&scene);
view.show();
return app.exec();
}