QDesignerContainerExtension Class
通过 QDesignerContainerExtension 类,您可以在Qt Widgets Designer 工作区的自定义多页面容器中添加页面。更多
Header: | #include <QDesignerContainerExtension> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Designer) target_link_libraries(mytarget PRIVATE Qt6::Designer) |
qmake: | QT += designer |
公共函数
virtual | ~QDesignerContainerExtension() |
virtual void | addWidget(QWidget *page) = 0 |
virtual bool | canAddWidget() const = 0 |
virtual bool | canRemove(int index) const = 0 |
virtual int | count() const = 0 |
virtual int | currentIndex() const = 0 |
virtual void | insertWidget(int index, QWidget *page) = 0 |
virtual void | remove(int index) = 0 |
virtual void | setCurrentIndex(int index) = 0 |
virtual QWidget * | widget(int index) const = 0 |
详细说明
QDesignerContainerExtension 为创建自定义容器扩展提供了一个接口。容器扩展由Qt Widgets Designer 管理多页面容器插件所需的函数集合和容器页面列表组成。
警告: 这不是针对一般容器插件的扩展,而只是针对自定义多页面容器的扩展。
要创建容器扩展,您的扩展类必须同时继承自QObject 和 QDesignerContainerExtension。举个例子:
class MyContainerExtension : public QObject, public QDesignerContainerExtension { Q_OBJECT Q_INTERFACES(QDesignerContainerExtension) public: MyContainerExtension(MyCustomWidget *widget, QObject *parent = 0); int count() const; QWidget *widget(int index) const; int currentIndex() const; void setCurrentIndex(int index); void addWidget(QWidget *widget); void insertWidget(int index, QWidget *widget); void remove(int index); private: MyCustomWidget *myWidget; };
由于我们要实现一个接口,因此必须确保使用Q_INTERFACES() 宏将其告知元对象系统。这样,Qt Widgets Designer 就可以使用qobject_cast() 函数查询支持的接口,而只需使用QObject 指针。
要使Qt Widgets Designer 能够管理自定义的多页面容器部件,必须重新实现几个函数:Qt Widgets Designer 使用count() 来跟踪容器中的页面数,widget() 返回容器页面列表中给定索引处的页面,currentIndex() 返回所选页面的列表索引。 Qt Widgets Designer addWidget 使用 () 函数将给定页面添加到容器中,并期望将其追加到页面列表中,而insertWidget() 函数则期望通过在给定索引处插入给定页面将其添加到容器中。
在Qt Widgets Designer 中,扩展在需要时才会创建。因此,您还必须创建一个QExtensionFactory ,即一个能够为您的扩展创建实例的类,并使用Qt Widgets Designer 的extension manager 注册它。
当需要容器扩展时,Qt Widgets Designer 的extension manager 会遍历所有已注册的工厂,每个工厂都会调用QExtensionFactory::createExtension() ,直到找到第一个能够创建容器扩展的工厂为止。然后,该工厂将为插件创建扩展。
Qt Widgets Designer 中有四种可用的扩展类型:QDesignerMemberSheetExtension QDesignerPropertySheetExtension QDesignerTaskMenuExtension无论请求的扩展是与多页面容器、成员表、属性表还是任务菜单相关联,Qt Widgets Designer 的行为都是一样的。
QExtensionFactory 类提供了一个标准扩展工厂,也可用作自定义扩展工厂的接口。您可以创建一个新的QExtensionFactory 并重新实现QExtensionFactory::createExtension() 函数。例如
QObject *ANewExtensionFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const { if (iid != Q_TYPEID(QDesignerContainerExtension)) return 0; if (MyCustomWidget *widget = qobject_cast<MyCustomWidget*> (object)) return new MyContainerExtension(widget, parent); return 0; }
或者使用现有的工厂,扩展QExtensionFactory::createExtension() 函数,使工厂也能创建容器扩展。例如
QObject *AGeneralExtensionFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const { MyCustomWidget *widget = qobject_cast<MyCustomWidget*>(object); if (widget && (iid == Q_TYPEID(QDesignerTaskMenuExtension))) { return new MyTaskMenuExtension(widget, parent); } else if (widget && (iid == Q_TYPEID(QDesignerContainerExtension))) { return new MyContainerExtension(widget, parent); } else { return 0; } }
有关使用 QDesignerContainerExtension 类的完整示例,请参阅容器扩展示例。该示例展示了如何为Qt Widgets Designer 创建自定义多页面插件。
另请参阅 QExtensionFactory,QExtensionManager, 以及创建自定义部件扩展。
成员函数文档
[virtual constexpr noexcept]
QDesignerContainerExtension::~QDesignerContainerExtension()
销毁扩展名。
[pure virtual]
void QDesignerContainerExtension::addWidget(QWidget *page)
将给定的page 添加到扩展的页面列表中。
另请参阅 insertWidget()、remove() 和widget()。
[pure virtual]
bool QDesignerContainerExtension::canAddWidget() const
返回是否可以添加 widget。这决定了添加或插入页面的上下文菜单选项是否启用。
对于只有一个固定页面的容器,例如QScrollArea 或QDockWidget ,此值应返回 false。
另请参阅 addWidget() 和canRemove()。
[pure virtual]
bool QDesignerContainerExtension::canRemove(int index) const
返回给定index 上的 widget 是否可以移除。这决定了删除当前页面的上下文菜单选项是否启用。
对于只有一个固定页面的容器(如QScrollArea 或QDockWidget ),此值应返回 false。
另请参阅 remove() 和canAddWidget()。
[pure virtual]
int QDesignerContainerExtension::count() const
返回容器中的页数。
[pure virtual]
int QDesignerContainerExtension::currentIndex() const
返回当前选中页面在容器中的索引。
另请参阅 setCurrentIndex()。
[pure virtual]
void QDesignerContainerExtension::insertWidget(int index, QWidget *page)
将给定的page 插入到扩展页面列表中给定的index 处,从而将其添加到容器中。
另请参阅 addWidget()、remove() 和widget()。
[pure virtual]
void QDesignerContainerExtension::remove(int index)
从扩展程序的页面列表中删除位于index 的页面。
另请参阅 addWidget() 和insertWidget()。
[pure virtual]
void QDesignerContainerExtension::setCurrentIndex(int index)
将容器中当前选定的页面设置为扩展页面列表中index 处的页面。
另请参阅 currentIndex().
[pure virtual]
QWidget *QDesignerContainerExtension::widget(int index) const
返回扩展页面列表中位于给定index 处的页面。
另请参阅 addWidget() 和insertWidget()。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.