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

news2025/1/18 9:09:07

扩展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    = lib

HEADERS     = qcustomwidgetplugin.h
SOURCES     = qcustomwidgetplugin.cpp
RESOURCES   = icons.qrc
LIBS        += -L. 

QT += designer

target.path = $$[QT_INSTALL_PLUGINS]/designer
INSTALLS    += target

include(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_OBJECT
    Q_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. here

    m_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_OBJECT

public:
    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.coloradmin.cn/o/1588119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 Leetcode 上使用 Javascript 查找数组中的所有重复项(使用 JS 的 DSA)

在本篇博客文章中&#xff0c;我们将探讨如何在数组中找出所有重复的元素&#xff0c;这个问题源自LeetCode上的一个问题。 问题描述&#xff1a; 我们有一个包含n个整数的数组&#xff0c;所有整数都在范围[1, n]内。每个整数要么出现一次&#xff0c;要么出现两次。任务是找…

如何借助AI高效完成写作提纲

AI变革力量&#xff1a;未来数据中心的智能化之旅&#xff01; 在当今这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;在众多领域展现出了它的能力&#xff0c;特别是在写作领域。AI写作工具不仅能够帮助我们高效地生成内容&#xff0c;还能在一定程度上提升…

在vue和 js 、ts 数据中使用 vue-i18n,切换语言环境时,标签文本实时变化

我的项目需要显示两种语言(中文和英文)&#xff0c;并且我想要切换语言时&#xff0c;页面语言环境会随之改变&#xff0c;但是目前发现&#xff0c;只能在vue中使用$t(‘’)的方式使用&#xff0c;但是这种方式只能在vue中使用&#xff0c;但是我的菜单文件是定义在js中&#…

JAVAEE之事务和事务传播机制

1.事务 1.1 事务的概念 事务是⼀组操作的集合, 是⼀个不可分割的操作. 事务会把所有的操作作为⼀个整体, ⼀起向数据库提交或者是撤销操作请求. 所以这组操作要么同时成功, 要么同时失败. 1.2 需要事务的原因 转账的时候&#xff0c;要么同时成功&#xff0c;要么同时失败…

关闭笔记本自带的键盘

目录 一、问题 二、方法 【方法一】 【方法二】 一、问题 笔记本自带的键盘上的个别按键又坏了&#xff0c;可能是因为使用电脑时&#xff0c;最先坏的几个按键那里温度比较高&#xff0c;久而久之就烧坏了吧。距离上次更换新键盘才差不多一年&#xff0c;所以不打算再买新…

2024年思维100春季线上比赛倒计时8天,来做做官方样题

今天是2024年4月12日&#xff0c;距离2024年春季思维100活动第一阶段的线上比赛4月20日还有8天。今年思维100活动的考试重点是什么呢&#xff1f;虽然主办方未公布&#xff0c;我们可以从主办方发布的参考题目中来推测今年的考试重点&#xff0c;并且按照这个来举一反三&#x…

任推邦七款热门拉新项目,普通人逆袭路径,月入6个W!

任推邦 不扣量的项目拉新平台 1UC网盘 —网推 价格上涨行业置顶 &#xff0c;大厂项目 市场空白&#xff0c;预算充足&#xff0c;不限量 适合自媒体/抖快等渠道 上传下载不限速 2迅雷网盘—网推 官方核心服务商&#xff0c;大厂项目 群组内测&#xff08;新增转播收…

TiDB 数据库调度(PD)揭秘

目录 一、PD 简介 1.1 元数据管理 1.2 调度决策 1.3 全局服务 1.4 集群配置与管理 二、TiKV 管理 2.1 调度需求 2.2 信息收集 三、TiDB server 管理 四、PD 集群主节点选取 一、PD 简介 TiDB PD (Placement Driver) 是 TiDB 分布式数据库系统中的核心组件之一&#xff0c;负…

应用实战|从头开始开发记账本2:基于模板快速开始

上期视频我们创建好了BaaS服务的后端应用。从这期视频开始&#xff0c;我们将从头开发一个互联网记账本应用。本期视频我们介绍一下如何使用模板快速开启我们的应用开发之旅。 应用实战&#xff5c;从头开始开发记账本2&#xff1a;基于模板快速开始 相关代码 本期视频我们介绍…

LigaAI x 极狐GitLab,共探 AI 时代研发提效新范式

近日&#xff0c;LigaAI 和极狐GitLab 宣布合作&#xff0c;双方将一起探索 AI 时代的研发效能新范式&#xff0c;提供 AI 赋能的一站式研发效能解决方案&#xff0c;让 AI 成为中国程序员和企业发展的新质生产力。 软件研发是一个涉及人员多、流程多、系统多的复杂工程&#…

三小时使用鸿蒙OS模仿羊了个羊,附源码

学习鸿蒙arkTS语言&#xff0c;决定直接通过实践的方式上手&#xff0c;而不是一点点进行观看视频再来实现。 结合羊了个羊的开发思路&#xff0c;准备好相应的卡片素材后进行开发。遇到了需要arkTS进行解决的问题&#xff0c;再去查看相应的文档。 首先需要准备卡片对应的图片…

ccf201509-3模板生成系统(list,map,字符串综合运用)

问题描述 成成最近在搭建一个网站&#xff0c;其中一些页面的部分内容来自数据库中不同的数据记录&#xff0c;但是页面的基本结构是相同的。例如&#xff0c;对于展示用户信息的页面&#xff0c;当用户为 Tom 时&#xff0c;网页的源代码是&#xff1a; 而当用户为 Jerry 时…

【Spring Boot 源码学习】SpringApplication 的 run 方法核心流程介绍

《Spring Boot 源码学习系列》 SpringApplication 的 run 方法核心流程介绍 一、引言二、往期内容三、主要内容3.1 run 方法源码初识3.2 引导上下文 BootstrapContext3.3 系统属性【java.awt.headless】3.4 早期启动阶段3.5 准备和配置应用环境3.6 打印 Banner 信息3.7 新建应用…

一起学习python——基础篇(16)

今天继续说说python的网络请求方法——get方法和post方法。上一章已经简单说了一下get方法&#xff0c;现在说一下post方法如何进行网络请求。 假如服务端开发人员给你一个接口文档内容如下&#xff1a; Request(请求参数)&#xff1a; 1、接口url为http://127.0.0.1:5005/a…

Mac 局域网内连接 MySQL

1. 前言 本文记录在 mac 局域网下实现数据库资源共享的问题 项目开发初期&#xff0c;都是在本地进行开发调试&#xff0c;数据库也在本地。那么和你配合开发的同事&#xff0c;就可能想要连接你 mac 电脑的数据库&#xff0c;连接过程中可能就会遇到问题。本文详细记录这些问…

MongoDB数据库转换为表格文件的Python实现

目录 一、引言 二、转换工具与库的选择 三、转换过程详解 安装必要的库 连接MongoDB数据库 查询并处理数据 将数据写入CSV文件 四、进阶技巧与注意事项 五、总结 一、引言 在当今大数据时代&#xff0c;数据的存储、处理与共享显得尤为重要。MongoDB作为一个面向文档…

centos7安装 on-my-zsh

如下&#x1f447; yum install -y zsh chsh -s /bin/zsh yum install -y git sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" 重启即可生效啦~

cordova后台插件开发新手教程

typora-root-url: imags cordova后台插件开发新手教程 预安装环境&#xff1a;JDK11、Android studios、nodo.js 一、环境搭建 1.安装Cordova npm install -g cordova2.创建项目 cordova create 具体命令&#xff1a; cordova create 目录名 包名 项目名 执行结果终端&am…

7-23 币值转换

题目链接&#xff1a;7-23 币值转换 一. 题目 1. 题目 2. 输入输出样例 3. 限制 二、代码 1. 代码实现 #include <iostream> #include <string> using namespace std;string numStr[] { // 0-9对应的字符串&#xff08;字符串是方便string&#xff09;"a…

tensorflow.js 如何从 public 路径加载人脸特征点检测模型

系列文章目录 如何在前端项目中使用opencv.js | opencv.js入门如何使用tensorflow.js实现面部特征点检测tensorflow.js 如何从 public 路径加载人脸特征点检测模型tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图tensorflow.js 使用 opencv.js 将人脸…