用于扩展Qt自身的插件(下)

扩展Qt自身的插件

  • 引言
  • 必须满足项
  • 创建插件
  • 示例代码
  • 生成插件
  • 配置加载插件的环境
  • 创建使用插件的项目
    • 配置库和头文件依赖的步骤:
  • 应用程序代码
  • 运行结果
  • 总结

引言

本文继上篇的扩展Qt自身的插件,接着记录Qt自身的插件,只不过本文提及的用于扩展Qt自身的插件是可以在QtCreator的设计器中展示。

必须满足项

要想使编写的插件能够在QtCreator的设计器中像基本控件一样展示,需要满足的一个前提条件是:必须使用和QtCreator相同版本的编译器和Qt库。
具体如下:
在这里插入图片描述
这是我的QtCreator的介绍,它基于Qt6.6.0 且使用编译器为MSVC2019 64bit。所以我想使自己编译的插件能够在QtCreator的设计器中加载就必须使用Qt6.6.0的库,同时使用编译器MSVC2019 64bit。否则编写的插件只能在QtDesigner中打开,而不是在QtCreator中加载。
下面是我安装的Qt6.6.0的库。
在这里插入图片描述
所以先看看自己的QtCreator编译时使用的Qt库和编译器,不满足在QtCreator中加载插件条件的,就先配置自己本地的环境。
我本来用的是Qt5.15.2,特意配的环境。环境如何配置,我后面在出一篇文章记录下。

创建插件

创建插件的方式和之前的两篇文章中有一些相似之处。下面是创建项目的过程。
打开QtCreator,点击菜单栏的文件-》新建项目-》其他项目-》Qt4设计师自定义控件,点击选择按钮,弹出:
在这里插入图片描述
输入名称testCustomWidget,选择合适的创建路径,项目路径中不能有中文,点击下一步按钮。弹出:
在这里插入图片描述
选择和QtCreator编译时相同的编译器,即关于QtCreator介绍中提及的编译器。我的是MSVC2019 64bit。点击下一步,弹出:
在这里插入图片描述
控件类中输入QCustomWidget,勾选创建代码框架,
在这里插入图片描述
同时切换到说明页,在组后面的编辑框中输入将来插件所在组的名称,可以自己输入,我输入的为My Custom Widgets。默认属性那页我没有修改。点击下一步按钮,再点击下一步按钮,最后点击完成按钮。
在这里插入图片描述
项目结构图如下:
在这里插入图片描述

示例代码

testCustomWidget.pro

CONFIG      += plugin debug_and_release
TARGET      = $$qtLibraryTarget(qcustomwidgetplugin)
TEMPLATE    = libHEADERS     = qcustomwidgetplugin.h
SOURCES     = qcustomwidgetplugin.cpp
RESOURCES   = icons.qrc
LIBS        += -L. QT += designertarget.path = $$[QT_INSTALL_PLUGINS]/designer
INSTALLS    += targetinclude(qcustomwidget.pri)

qcustomwidget.pri

HEADERS += qcustomwidget.h
SOURCES += qcustomwidget.cpp

qcustomwidgetplugin.h

#ifndef QCUSTOMWIDGETPLUGIN_H
#define QCUSTOMWIDGETPLUGIN_H#include <QDesignerCustomWidgetInterface>class QCustomWidgetPlugin : public QObject, public QDesignerCustomWidgetInterface
{Q_OBJECTQ_INTERFACES(QDesignerCustomWidgetInterface)Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetInterface")public:explicit QCustomWidgetPlugin(QObject *parent = nullptr);bool isContainer() const override;bool isInitialized() const override;QIcon icon() const override;QString domXml() const override;QString group() const override;QString includeFile() const override;QString name() const override;QString toolTip() const override;QString whatsThis() const override;QWidget *createWidget(QWidget *parent) override;void initialize(QDesignerFormEditorInterface *core) override;private:bool m_initialized = false;
};#endif // QCUSTOMWIDGETPLUGIN_H

qcustomwidgetplugin.cpp

#include "qcustomwidgetplugin.h"
#include "qcustomwidget.h"#include <QtPlugin>QCustomWidgetPlugin::QCustomWidgetPlugin(QObject *parent): QObject(parent)
{}void QCustomWidgetPlugin::initialize(QDesignerFormEditorInterface * /* core */)
{if (m_initialized)return;// Add extension registrations, etc. herem_initialized = true;
}bool QCustomWidgetPlugin::isInitialized() const
{return m_initialized;
}QWidget *QCustomWidgetPlugin::createWidget(QWidget *parent)
{return new QCustomWidget(parent);
}QString QCustomWidgetPlugin::name() const
{return QLatin1String("QCustomWidget");
}QString QCustomWidgetPlugin::group() const
{return QLatin1String("CustomWidgets");//组名,可以在代码中修改组名,一代码中的组名为主
}QIcon QCustomWidgetPlugin::icon() const
{return QIcon();
}QString QCustomWidgetPlugin::toolTip() const
{return QLatin1String("pop-up Window");
}QString QCustomWidgetPlugin::whatsThis() const
{return QLatin1String("弹窗");
}bool QCustomWidgetPlugin::isContainer() const
{return false;
}QString QCustomWidgetPlugin::domXml() const
{return QLatin1String(R"(<widget class="QCustomWidget" name="qCustomWidget">
</widget>)");
}QString QCustomWidgetPlugin::includeFile() const
{return QLatin1String("qcustomwidget.h");
}

qcustomwidget.h

#ifndef QCUSTOMWIDGET_H
#define QCUSTOMWIDGET_H#include <QtUiPlugin/QDesignerExportWidget>//QDESIGNER_WIDGET_EXPORT
#include <QWidget>
#include <QLabel>
#include <QSize>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QPoint>class QColor;class QDESIGNER_WIDGET_EXPORT QCustomWidget : public QWidget
{Q_OBJECTpublic:explicit QCustomWidget(QWidget *parent = nullptr);private:void initWindow();void setWindowStyle();
public:Q_PROPERTY(int BorderRadius  READ getBorderRadius  WRITE setBorderRadius NOTIFY borderRadiusChanged FINAL)Q_PROPERTY(int topLeftRadius READ getTopLeftRadius WRITE setTopLeftRadius NOTIFY topLeftRadiusChaned FINAL)Q_PROPERTY(int topRightRadius READ getTopRightRadius WRITE setTopRightRadius NOTIFY topRightRadiusChaned FINAL)Q_PROPERTY(int bottomLeftRadius READ getBottomLeftRadius WRITE setBottomLeftRdius NOTIFY bottomLeftRadiusChaned FINAL)Q_PROPERTY(int bottomRightRadius READ getBottomRightRadius WRITE setBottomRightRadius NOTIFY bottomRightRadiusChanged FINAL)Q_PROPERTY(QColor backGroundColor READ backGroundColor WRITE setBackGroundColor)Q_PROPERTY(QColor titleColor READ titleColor WRITE setTitleColor)Q_PROPERTY(QString titleName READ getTitle WRITE setTitile FINAL)
//    Q_PROPERTY(QString context READ getContext WRITE setContext FINAL)//一旦定义了属性,就不能设置函数中传入第二个参数Q_PROPERTY(QSize size READ getSize WRITE setSize NOTIFY sizeChanged FINAL)Q_PROPERTY(QString button1Text READ getBtn1Text WRITE setBtn1Text)Q_PROPERTY(QString button2Text READ getBtn2Text WRITE setBtn2Text)Q_PROPERTY(QString titleBtnImage WRITE setBtnImage)void setBorderRadius(const int& radius);void setTopLeftRadius(const int& radius);void setTopRightRadius(const int& radius);void setBottomLeftRdius(const int& radius);void setBottomRightRadius(const int& radius);void setBackGroundColor(const QColor &clolor);void setTitleColor(const QColor& color);void setTitile(const QString& strTitle);void setContext(const QString& strContext,const QColor& color);void setBtn1Text(const QString& strText);void setBtn2Text(const QString& strText);void setBtnImage(const QString &strImage);void setBtn1Style(</

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/624154.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java反序列化基础-类的动态加载

类加载器&双亲委派 什么是类加载器 类加载器是一个负责加载器类的对象&#xff0c;用于实现类加载的过程中的加载这一步。每个Java类都有一个引用指向加载它的ClassLoader。而数组类是由JVM直接生成的&#xff08;数组类没有对应的二进制字节流&#xff09; 类加载器有哪…

基于ubuntu22.04系统安装nvidia A100驱动与NVLink启用

1、官方仓库 针对驱动包下载认准nvidia官网 dpkg -i nvidia-driver-local-repo-ubuntu2204-550.54.15_1.0-1_amd64.deb apt update apt search nvidia-driver-5502、安装 根据步骤1apt search nvidia-driver-550查出版本&#xff1a;此驱动包封在nvidia-driver-local-repo-ub…

基于springboot的医护人员排班系统

随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了医护人员排班系统的开发全过程。通过分析医护人员排班系统管理的不足&#xff0c;创建了一个计算机管理医护人员排班系统的方案。文章介绍了医护人员排班系统的系统分…

【数据结构与算法】之双向链表及其实现!

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 数据结构与算法 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 目录 1、双向链表的结构及概念 2、双向链表的实现 2.1 要实现的接口…

算法设计与分析实验报告c++实现(矩阵链相乘、投资问题、完全背包问题、数字三角形、最小生成树、背包问题)

一、实验目的 1&#xff0e;加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 用动态…

【微信小程序之分包】

微信小程序之分包 什么是分包分包的好处分包前的结构图分包后的结构图分包的加载规则分包的体积限制使用分包打包原则引用原则独立分包独立分包的配置方法独立分包的引用原则分包预下载配置分包的预下载分包预下载限制 什么是分包 分包指的是把一个完整小程序项目&#xff0c;…

突破编程_前端_SVG(使用 svg-pan-zoom 库进行平移与缩放)

1 svg-pan-zoom 概述 svg-pan-zoom 是一个轻量级、高性能且易于使用的 JavaScript 库&#xff0c;专为增强 SVG 图像的浏览体验而设计。它提供了平移和缩放功能&#xff0c;使用户能够无缝探索大型或复杂的 SVG 图形。这个库允许用户对SVG图像进行交互操作&#xff0c;包括缩放…

新版AndroidStudio使用switch-case语句时出现Constant expression required错误

原因: 在新版的Android Studio中使用JDK17以上版本&#xff0c;会出现switch语句报错"Constant expression required"的问题&#xff0c;这是因为在JDK17中switch语句的条件表达式支持使用枚举类型&#xff0c;而这个特性还没有被支持。 解决方法: ①在gradle.prope…

Github 2024-04-12 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目6TypeScript项目2Cuda项目1C++项目1C项目1HTML项目1Jupyter Notebook项目1JavaScript项目1Python - 100天从新手到大师 创建周期:22…

HTTP/1.1特性总结

优点 【简单&#xff0c;灵活和易于扩展&#xff0c;应用广泛和跨平台】 1.简单&#xff1a; http基本的报文格式就是headerbody&#xff0c;头部信息也是key-value简单的文本形式&#xff0c;易于理解&#xff0c;降低了学习和使用的门槛 2.灵活和易于扩展&#xff1a; &…

python-常用数据结构(2)

6、某企业为职工发放奖金:如果入职超过5年,且销售业绩超过15000元的员工,奖金比例为0.2;销售业绩超过10000元的员工,奖金比例为0.15:销售业绩超过5000元的员工,奖金比例为0.1;其他奖金比例为0.05。如果是人职不超过5年,且销售业绩超过4000的员工,奖金比例为0.045;否则为0.01。输…

前端ocr技术:electron+vue3中使用tesseract插件识别图片中字符

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、electron各种csp问题二、试用插件总结 前言 项目需要ocr技术识别图片中的中文字符&#xff0c;本来这部分是后端的工作&#xff0c;但是因为各种原因&#xff0c;决定前端也做一个版本。 在ai时代之前&#xff0c;o…