自定义qtquick 插件模块,支持qmldesigner

news2025/7/9 0:26:00

自定义qtquick 插件模块,支持qmldesigner

wmxModule.pro

#-------------------------------------------------
#
# Project created by wmx
#
#-------------------------------------------------

QT       += core qml quick

TARGET = wmxModule
TEMPLATE = lib
CONFIG += plugin

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += \
        wmxModulePlugin.cpp

HEADERS += \
        wmxModulePlugin.h

RESOURCES += \
    Img.qrc \
    Qml.qrc

#---目标路径
#msvc{
#        message("msvc")
#        prefix=msvc
#}

#mingw{
#        message("mingw")
#        prefix=mingw
#}

message(QT_ARCH : $$QT_ARCH )

DESTDIR = $$PWD/../bin/WMX/$${prefix}
message(DESTDIR :$$DESTDIR)

# 插件描述文件,copy到插件目录
DISTFILES = qmldir
!equals(_PRO_FILE_PWD_, $$DESTDIR) {
    copy_qmldir.target = $$system_path($$DESTDIR/qmldir)
    copy_qmldir.depends = $$system_path($$_PRO_FILE_PWD_/qmldir)

    message(target:$$copy_qmldir.target)
    message(depends:$$copy_qmldir.depends)

    copy_qmldir.commands = $${QMAKE_COPY_FILE} $${copy_qmldir.depends} $${copy_qmldir.target}
    QMAKE_EXTRA_TARGETS += copy_qmldir
    PRE_TARGETDEPS += $$copy_qmldir.target
}

# 加引号
message(system_quote : $$system_quote(\media\wmx))

#转为系统路径,win是\ 分隔,linux 是 / 分隔
message(system_path : $$system_path(\media\wmx))

# 系统分隔符
message(QMAKE_DIR_SEP: $$QMAKE_DIR_SEP)



wmxModulePlugin.h


#include <QQmlExtensionPlugin>

class WmxModulePlugin : public QQmlExtensionPlugin
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
public:
    void registerTypes(const char *uri) override;
};

WmxModulePlugin

#include "wmxModulePlugin.h"
void WmxModulePlugin::registerTypes(const char *uri)
{
    //注册资源
    Q_INIT_RESOURCE(Img);
    Q_INIT_RESOURCE(Qml);

}

自定义 MyControl.qml

import QtQuick 2.0

Rectangle {
    id:root
    width: 100
    height: width
    radius: width / 2
    color: "red"
    border{
        width: 1
        color: "yellow"
    }

    Image {
        anchors{
            centerIn: parent
            margins: 5
        }
        source: "qrc:/Img/wmx.png"
    }
}

Img.qrc

<RCC>
    <qresource prefix="/wmx"/>
    <qresource prefix="/">
        <file>Img/wmx.png</file>
    </qresource>
</RCC>

Qml.qrc

<RCC>
    <qresource prefix="/control">
        <file>Qml/Components/MyControl.qml</file>
    </qresource>
</RCC>

qmldir

#模块名称,相对importPath下到qmdir路径的点分路径
module WMX
#dll名称
plugin wmxModule
#c++插件类名称
classname WmxModulePlugin
#控件
MyControl 1.0 qml/MyControl.qml
#类型信息
typeinfo plugin.qmltypes
#依赖关系
depends QtQuick 2.0
#支持设计器
designersupported

编译后

$$PWD/../bin/WMX/ 路径下:
生成以下文件
libwmxModule.so 、 qmldir

生成类型信息文件 .qmltypes

在此目录打开终端输入命令

qmlplugindump WMX 1.0 ../  >  ./plugin.qmltypes

plugin.qmltypes

import QtQuick.tooling 1.2

// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by:
// 'qmlplugindump WMX 1.0 ../'

Module {
    dependencies: ["QtQuick 2.0"]
    Component {
        prototype: "QQuickRectangle"
        name: "MyControl 1.0"
        exports: ["MyControl 1.0"]
        exportMetaObjectRevisions: [0]
        isComposite: true
        defaultProperty: "data"
    }
}

生成 qmldesigner 支持

在模块路径 $$PWD/../bin/WMX/ 下:
新建目录 designer 、 qml

支持属性识别、编辑

MyControl.qml 放到 qml目录下,这样qmldesigner 根据 qmldir 声明找到此文件,支持属性识别、编辑

支持 qmldesigner 视图Library 模块识别 ,控件缩略图标

在 designer 目录下:
1 新建 images目录,放缩略图标
2 新建 plugin.metainfo 文件,编辑以下内容:

MetaInfo {
    Type {
    	 #名称
        name: "WMX.MyControl"
        #缩略图
        icon: "images/wmx.png"
        ItemLibraryEntry {
        	#控件名称
            name: "MyControl"
            #控件分类
            category: "WMX-Base"
            #分类图标
            libraryIcon: "images/wmx.png"
            #版本
            version: "1.0"
            #导入的模块
            requiredImport: "WMX"
            #默认属性
            Property { name: "width"; type: "int"; value: 50}
            Property { name: "height"; type: "int"; value: 50}
        }
    }
}

使用插件

testModule.pro

QT += quick
CONFIG += c++11

DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
        main.cpp

RESOURCES += qml.qrc

#目标路径
DESTDIR = $$PWD/../bin

MODULE_PATH=$$PWD/../bin/
QML_IMPORT_PATH = $$MODULE_PATH
QML2_IMPORT_PATH = $$MODULE_PATH
## Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH +=  $$MODULE_PATH


main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QDebug>
#include <QLoggingCategory>

int main(int argc, char *argv[])
{
    // 查看qml调试信息
    qputenv("QML_IMPORT_TRACE","1");
    QLoggingCategory::setFilterRules("qt.quick.controls.style=true"
                                     );

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

    //查看导入路径
    qDebug()<<"engine.importPathList : \n"<<engine.importPathList();

    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
                         if (!obj && url == objUrl)
                             QCoreApplication::exit(-1);
                     }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

main.qml

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Window 2.12

import WMX 1.0


Window {
    id: root
    visible: true
    width: 800
    height: 600
    title: qsTr("Hello window")


    Button {
        id: button
        x: 294
        y: 199
        text: qsTr("Button")
    }

    MyControl {
        id: myControl
        x: 50
        y: 68
        width: 200
        height: 200
        scale: 1
    }

}


可以点设计器,拖拽模块,设置属性,预览等等

在这里插入图片描述

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

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

相关文章

图像处理QPixmap、Picture、QBitmap

QPixmap 类是一种可用作绘制设备的屏幕外图像表示形式。 QPixmap可以使用QLabel或QAbstractButton的子类之一可以轻松显示在屏幕上 QPixmap 对象可以按值传递&#xff0c;因为 QPixmap 类使用隐式数据共享&#xff0c;也可以流式传输。 QPixmap可以和QImage之间进行转换&…

【关于lombok框架一文秒懂】

目录 1. Lombok框架 2. 安装lombok插件 1. Lombok框架 Lombok框架是用于在编译期自动生成相关代码的&#xff0c;例如&#xff1a;Setters & Getters、hashCode()、equals()、toString()、无参数构造方法、全参数构造方法等。 相关的注解有&#xff1a; Data&#xff1…

python中的编码格式

1- 字符集和编码 1&#xff09; 初代编码 – ASCII 1- 物理机与电脑的交互&#xff1a;物理机中有个组件叫二极管&#xff0c; 可以通过电流通过二极管显示的高电平和低电平来记录信号。 2- 二极管的高电平和低电平则被计算机解读为0 和 1 3- 多个0和1拼接起来成为了二进制数据…

自动化测试框架设计原理详解

一、自动化测试场景 1、测试四象限 并不是所有测试类型都适合自动化。哪些测试更适合自动化?哪些更适合手工测试? 根据Brain Marick提出的测试四象限,我们可以对测试进行归类,将其划分到4个象限中,以解答这些问题,如下图所示。 第一象限:面向技术和指导开发,该象限中…

ActivityPub 笔记

ActivityPub 协议是一个去中心化的社交网络协议&#xff0c;其基于 ActivityStreams 2.0 数据格式。 在 ActivityPub 协议里&#xff0c;一个用户在服务器上的角色为“参与者&#xff08;actor&#xff09;”。用户在不同的服务器上的角色为不同的“参与者”。每一名“参与者”…

LSTM和GRU

LSTM和GRU RNN的优缺点 优点&#xff1a; 可以捕获序列之间的关系&#xff1b;共享参数。 缺点&#xff1a; 存在梯度消失和梯度爆炸问题&#xff1b;RNN的训练是一个比较困难的任务&#xff1b;无法处理长序列问题。 LSTM LSTM可以处理长序列问题&#xff0c;同样在之前…

openssl做文件处理(base64,MD5,sha256等)

这次使用openssl&#xff0c;发现openssl不仅可以用来做加密和解密&#xff0c;实际上也可以用来做文件的处理&#xff0c;比如base64转码、解码&#xff0c;文件md5的计算等。实现这些&#xff0c;即可以从命令行去做&#xff0c;也可以通过代码去实现。 1. 命令行操作 1. ba…

【ML特征工程】第 5 章 :分类变量:机器鸡时代的鸡蛋计数

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

想做副业没有方向,这三条告诉你什么是副业思维

怎样副业赚钱&#xff1f;教你几招&#xff0c;掌控自己的固有思维 你了解钱是怎么来的吗&#xff1f;你如果弄不懂这一点&#xff0c;你也是很难赚到钱的。 钱不是苦的&#xff0c;辛苦努力挣的基本都是一点钱。 假如将你的工作时长换为钱&#xff0c;你可以清晰地赚多少钱…

Java并发-线程上下文切换与死锁

理解线程的上下文切换 概述&#xff1a;在多线程编程中&#xff0c;线程个数一般都大于 CPU 个数&#xff0c;而每个 CPU 同一时&#xff0d;刻只能被一个线程使用&#xff0c;为了让用户感觉多个线程是在同时执行的&#xff0c; CPU 资源的分配采用了时间片轮转的策略&#x…

javacc之路0--- 安装与使用

官网&#xff1a; https://javacc.github.io/javacc/ https://github.com/javacc/javacc#getting-started 安装 下载解压 执行&#xff1a; mvn package 将 javacc-7.0.10.jar 重命名为 javacc.jar 并将目录下的scripts文件夹加入到环境变量中。 执行javacc命令验证是否成功…

【Qt 按钮】QPushButton所有函数和样式

【Qt 按钮】QPushButton所有函数和样式一、QSS语句 &#xff08;界面样式大全&#xff09;二、 构造函数三、Geometry &#xff08;获取属性&#xff09;四、 QFont五、setFont六、text七、setText八、move九、resize十、adjustSize[按钮自动适应文本大小]十一、setFocus十二、…

【附源码】计算机毕业设计JAVA预约健身私教网站

【附源码】计算机毕业设计JAVA预约健身私教网站 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA my…

开发人员为什么要写测试用例?

作为一名开发人员&#xff0c;你可能会发现周围的开发并不太喜欢写测试用例&#xff0c;甚至有些同学根本不写测试用例&#xff0c;认为写测试用例完全是浪费时间&#xff0c;或者是测试用例只是测试的事情。 在开发过程中&#xff0c;往往都是呼啦啦的写完代码&#xff0c;然后…

【负荷预测、电价预测】基于神经网络的负荷预测和价格预测附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

别人熬夜看世界杯 我熬夜改代码 你满意了

2022年卡塔尔世界杯正如火如荼地进行着&#xff0c; 一边是热火朝天的比赛&#xff0c;一边是让人惊掉下巴的爆冷结局&#xff0c; 但正因为这些不确定因素&#xff0c;反倒让世界杯增添了几分魅力和乐趣&#xff01; 小编在看球赛的过程中&#xff0c;不禁起了联想&#xff…

Django+Vue中文件的上传和下载

场景&#xff1a;上传一个源数据Excel文件&#xff0c;然后根据数据处理生成另外一个Excel文件并支持下载 Django&#xff1a; 1.首先在Django的settings.py文件中增加配置 MEDIA_URL /media/ MEDIA_ROOT os.path.join(BASE_DIR, media)2.项目的urls.py中增加 url(r^medi…

环境主题静态HTML网页作业作品 大学生环保网页设计制作成品 简单DIV CSS布局网站

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

百度智能云与实体经济“双向奔赴”: 一场1+1>2的双赢

实体经济&#xff0c;已经成为检验科技企业潜力的试金石。 在最近的财报季中&#xff0c;各家大厂的财报里“实体经济”都是关键字眼&#xff0c;已经成为各家心照不宣的共同目的地。 当然&#xff0c;条条大路通罗马。每一家的战略思路和打法都不一样。11月22日&#xff0c;…

Centos7下新硬盘的挂载操作

1、查看当前硬盘使用情况 df -h 2、 查看磁盘分配情况 fdisk -l 如图所示 vdb 磁盘 还未被使用&#xff0c;现在开始分配。 3、 磁盘分配 使用m查看详细命令&#xff0c;n添加一块新分区&#xff0c;默认最多只能有四个主分区&#xff0c;但可以通过设置将第…