【翻译】Qt Designer自定义控件简介

原文链接:Using Custom Widgets with Qt Widgets Designer

Qt Designer 可以通过其可扩展的插件机制显示自定义控件,允许用户和第三方扩展定义控件的范围。或者,也可以使用现有的控件作为提供类似 API 的控件类的占位符。

处理自定义控件

尽管 Qt Designer支持所有标准的 Qt 控件,但由于以下原因,一些特定的控件可能不能作为标准使用:

  • 用户界面处于设计模式下,自定义控件可能不可用。
  • 针对特定平台开发的自定义控件,设计器可能需要在特定平台下运行才能为终端用户开发UI界面。
  • 自定义控件的源代码不可用,或者由于非技术原因(比如license限定)也会造成一些自定义控件无法使用。

在上述情况下,依然可以达到使用自定义控件的目的。为了实现这一点,我们可以使用 Qt Designer 的提升窗口部件功能。

除此之外,若自定义控件的源代码可用,我们可以调整自定义控件以便在Qt Designer中使用。

提升窗口部件(控件)

在这里插入图片描述

如果必须设计某些表单,且某些自定义控件对设计器不可用,我们可以用类似的控件来替代缺失的控件。例如,我们可以用 QPushButton 的实例表示自定义按钮类 MyPushButton 的实例,并将这些实例提升到 MyPushButton,以便 uic 为这个缺失的类生成合适的代码。
在这里插入图片描述
当选择一个控件作为占位符时,将缺失控件的 API 与标准 Qt 控件的 API 进行比较是很有用的。基于标准控件子类的专用控件,占位符的选择基于自定义控件的基类; 例如,QSlider 可能用于专用的 QSlider 子类。

对于不与标准 Qt 控件兼容 API 的专用控件,可以考虑调整为一个自定义控件,以便在 Qt Designer中使用。如果无论如何也不可行,那么 QWidget 将是所有控件的首选。

要添加占位符,请选择一个合适的基类,然后从控件的右键菜单中选择提升为...。在对话框的下半部分输入提升的类名称头文件后,点击 添加。占位符类现在将与基类一起出现在上面的列表中。单击“提升”按钮以接受此选项。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
现在,当表单中存在基类的控件,占位符类将出现在提升为子菜单中,从而可方便地将对象升级到该类。
在这里插入图片描述

通过从控件的右键菜单中选择取消***的提升,可以将提升的控件还原为其基类。
在这里插入图片描述

用户自定义控件

自定义控件可以整合到 Qt Designer中使用,使设计器在应用程序中使用真实控件而非占位符控件来配置用户界面。创建自定义控件插件的过程详见本手册的“为 Qt Designer创建自定义控件”一文。

要使用以这种方式创建的插件,需确保该插件位于 Qt Designer 可检索到的插件路径中。通常,存储在 Qt根目录/plugins/design 路径下的插件将在 Qt Designer 启动时加载。关于构建和安装插件的更多信息可以在这里找到。有关创建插件的信息,您还可以参考 Plugins HOWTO 文档。

扩展阅读

Qt Designer 最新中文手册文档(Qt6)

### 创建用于图像显示的自定义控件 为了在Qt Designer中创建一个能够显示图像的自定义控件,可以遵循以下方法: #### 插件项目建立 通过Qt Creator新建文件或项目菜单中的其他项目分组里的Qt4设计师自定义控件选项启动新项目向导。在这个过程中指定插件项目的名称与存储位置,例如命名为`ImageDisplayWidgetPlugin`[^5]。 #### 控件类设计 构建一个新的C++类继承自QWidget作为基础框架,并在此基础上集成QLabel组件负责展示图片资源。此类需重载paintEvent事件处理函数以便实现更复杂的绘制逻辑(如果必要的话)。以下是简化版代码片段示例: ```cpp #include <QWidget> #include <QLabel> class ImageDisplayWidget : public QWidget { Q_OBJECT public: explicit ImageDisplayWidget(QWidget *parent = nullptr); protected: void paintEvent(QPaintEvent *) override; private: QLabel* label; }; ``` 初始化成员变量label并将其实例关联至当前窗口部件内部布局管理器内完成初步搭建工作。 ```cpp ImageDisplayWidget::ImageDisplayWidget(QWidget *parent) : QWidget(parent), label(new QLabel(this)) { QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(label); } ``` #### 图像加载功能实现 为了让该控件支持动态更新所呈现的画面内容,还需提供公共接口供外部调用者传递目标Pixmap对象给内部标签组件。 ```cpp void ImageDisplayWidget::setImage(const QPixmap &newImage){ this->label->setPixmap(newImage.scaled( this->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); } ``` #### 集成到Qt Designer环境 确保编译后的DLL库被正确放置于对应版本Qt安装目录下的plugins/designer子文件夹之中。之后重启Qt Designer应用程序并通过帮助-关于插件菜单项触发缓存清理机制使新增加的功能模块生效可见[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值