精华内容
下载资源
问答
  • 当加载一个 QML 对象到一个 C++ 应用程序中时,直接嵌入可以从 QML 代码中使用的一些 C++ 数据是非常有用的。例如,对嵌入对象调用一个 C++ 函数,或者使用一个 C++ 对象实例作为 QML 视图的数据模型。 通过 ...

    简述

    当加载一个 QML 对象到一个 C++ 应用程序中时,直接嵌入可以从 QML 代码中使用的一些 C++ 数据是非常有用的。例如,对嵌入的对象调用一个 C++ 函数,或者使用一个 C++ 对象实例作为 QML 视图的数据模型。

    通过 QQmlContext 类可以将 C++ 数据注入到 QML 对象中。该类将数据暴露给一个 QML 对象的上下文,以便可以直接从 QML 代码中引用数据。

    | 版权声明:一去、二三里,未经博主允许不得转载。

    QQmlContext

    QQmlContext 类定义了 QML 引擎内的上下文,上下文允许将数据暴露给由 QML 引擎实例化的 QML 组件。

    每个 QQmlContext 包含一组属性,允许以名称将数据显式地绑定到上下文。通过调用 QQmlContext::setContextProperty() 来定义和更新上下文属性。

    相应的接口:

    void QQmlContext::setContextProperty(const QString &name, const QVariant &value)
    简单的上下文属性,对应的值为 QVariant 类型。

    void QQmlContext::setContextProperty(const QString &name, QObject *value)
    相对来说稍微复杂一些,QObject * 对象类型。

    可以看出,上下文属性可以保存 QVariant 或 QObject * 类型的值。也就是说,既可以使用这种方式注入简单的 QVariant 类型;也可以注入自定义 C++ 对象,并且这些对象可以在 QML 中被直接修改和读取。

    设置简单的上下文属性

    这里写图片描述

    例如,下面的 QML 文本项,引用了一个当前范围中不存在的 currentDateTime 值:

    // main.qml
    import QtQuick 2.3
    
    Rectangle {
        width: 200; height: 100
    
        Text {
            anchors.centerIn: parent
            text: currentDateTime
        }
    }

    这个 currentDateTime 值可以由加载 QML 组件的 C++ 应用程序直接设置,使用 QQmlContext::setContextProperty():

    // main.cpp
    #include <QGuiApplication>
    #include <QQuickView>
    #include <QQmlContext>
    #include <QDateTime>
    
    int main(int argc, char *argv[])
    {
        QGuiApplication app(argc, argv);
    
        QQuickView view;
        // 设置上下文属性
        view.rootContext()->setContextProperty("currentDateTime", QDateTime::currentDateTime());
        view.setSource(QUrl("qrc:/main.qml"));
        view.setIcon(QIcon(":/logo.png"));
        view.setTitle(QStringLiteral("将C++对象嵌入到带有上下文属性的QML中"));
        view.show();
    
        return app.exec();
    }

    注意: 由于在特定上下文中评估 QML 中的所有求值表达式,因此如果上下文被修改,则该上下文中的所有绑定都将被重新求值。因此,应该在应用程序初始化之外谨慎使用上下文属性,因为这可能会降低应用程序性能。

    将对象设置为上下文属性

    修改上述示例,嵌入一个 QObject 实例而非一个 QDateTime 值,并且从 QML 调用对象实例上的一个函数:

    // application_data.h
    #ifndef APPLICATION_DATA_H
    #define APPLICATION_DATA_H
    
    #include <QObject>
    #include <QDateTime>
    
    class ApplicationData : public QObject
    {
        Q_OBJECT
    
    public:
        Q_INVOKABLE QDateTime getCurrentDateTime() const {
            return QDateTime::currentDateTime();
        }
    };
    
    #endif // APPLICATION_DATA_H

    注意: 并非所有的 C++ 函数都可以从 QML 调用,除了 Q_INVOKABLE() 标记的 public 函数之外,还可以是 public 槽函数。

    和前面的类似,只不过这里传递的是 QObject * 对象类型:

    // main.cpp
    #include <QGuiApplication>
    #include <QQuickView>
    #include <QQmlContext>
    #include "application_data.h"
    
    int main(int argc, char *argv[])
    {
        QGuiApplication app(argc, argv);
    
        QQuickView view;
        // 设置上下文属性
        ApplicationData data;
        view.rootContext()->setContextProperty("applicationData", &data);
        view.setSource(QUrl("qrc:/main.qml"));
        view.setIcon(QIcon(":/logo.png"));
        view.setTitle(QStringLiteral("将C++对象嵌入到带有上下文属性的QML中"));
        view.show();
    
        return app.exec();
    }

    然后,就可以在 QML 中使用 applicationData:

    // main.qml
    import QtQuick 2.3
    
    Rectangle {
        width: 200; height: 100
    
        Text {
            anchors.centerIn: parent
            text: applicationData.getCurrentDateTime()
        }
    }

    注意: 从 C++ 到 QML 返回的 date/time 可以通过 Qt.formatDateTime() 和相关函数进行格式化。

    从上下文属性中接收信号

    如果 QML 需要从上下文属性中接收信号,可以使用 Connections 类型进行连接。

    上面的日期时间是固定不变的,我们来为其添加一个定时器(每秒更新),让时间跑起来:

    这里写图片描述

    例如,ApplicationData 具有一个名为 dataChanged() 的信号,在定时器超时后发射:

    // application_data.h
    #ifndef APPLICATION_DATA_H
    #define APPLICATION_DATA_H
    
    #include <QObject>
    #include <QDateTime>
    #include <QTimer>
    
    class ApplicationData : public QObject
    {
        Q_OBJECT
    
    public:
        ApplicationData() {
            // 定时器
            QTimer *pTimer = new QTimer(this);
            pTimer->setInterval(1000);
            connect(pTimer, &QTimer::timeout, this, &ApplicationData::onTimeout);
            pTimer->start();
        }
    
        Q_INVOKABLE QDateTime getCurrentDateTime() const {
            return m_dateTime;
        }
    
    signals:
        void dataChanged();
    
    private slots:
        void onTimeout() {
            m_dateTime = QDateTime::currentDateTime();
            emit dataChanged();  // 超时后发射信号
        }
    
    private:
        QDateTime m_dateTime;
    };
    
    #endif // APPLICATION_DATA_H

    在 QML 中,定义一个 Connections 对象,将该信号连接至一个名为 onDataChanged 的处理程序:

    // main.qml
    import QtQuick 2.3
    
    Rectangle {
        width: 200; height: 100
    
        Text {
            id: timer
            anchors.centerIn: parent
            text: "Timer"
        }
    
        Connections {  // 连接信号
            target: applicationData
            onDataChanged: {
                timer.text = applicationData.getCurrentDateTime()
                console.log("The application data changed!")
            }
        }
    }

    其中 target 为目标对象,也就是我们的上下文属性 applicationData。

    展开全文
  • 通过Aspose实现文件对象嵌入Word功能

    千次阅读 2017-06-29 17:55:40
    需求公司系统更新,需要对历史数据进行附件迁移,将老系统A的附件迁移到新系统B中。其中老系统A的一张单据对应着多个... 偶然间发现可以将文件以对象的方式插入到word中,这样在一个word中就可以浏览到老系统的多个附件

    1. 需求

    公司系统更新,需要对历史数据进行附件迁移,将老系统A的附件迁移到新系统B中。其中老系统A的一张单据对应着多个附件,而新系统B要求单据和附件一对一的关系。
    偶然间发现可以将文件以对象的方式插入到word中,这样在一个word中就可以浏览到老系统的多个附件。

    2. 库的选择

    最开始百度啊,使用java操作word的方法,基本上都是poi包。经过搜索和到官网去看并没有发现可以满足需求的操作。接着去Google以下面种种关键字搜索
    insert file object in word java,Insert Embedded or Linked OLE Object in Word, Files embedded OLE objects找到了Aspose.Words。通过OLE(Object Linking and Embedding)对象链接与嵌入的方式进行文本的合并。

    3. 实现

    3.1 代码

    maven地址

    <dependency>
        <groupId>com.aspose</groupId>
        <artifactId>aspose-barcode</artifactId>
        <version>17.03</version>
    </dependency>

    核心代码

    public static void main(String args[]) throws Exception {
    
            PropertyConfigurator.configure("log4j.properties");
    
            Document doc = new Document();
            DocumentBuilder builder = new DocumentBuilder(doc);
            String MyDir = "C:\\Users\\SN2OV\\Desktop\\wordDemo\\src\\main\\resources\\File\\";
            BufferedImage image = ImageIO.read(new File(MyDir + "word32.png"));
            String fileArr[] = new String[]{"InsertDocument1.doc","InsertDocument2.doc","其他合同模板.docx","商务标.rar",
                    "成本模拟部署测试问题-其他所有模块.xls","其他合同模板.doc","乾鸣国际信息产业园(一期)1号楼、8号楼机电安装工程施工-中标通知书.pdf"};
            for(String file :fileArr){
                if(file.endsWith("png")){
                    Shape shape = builder.insertImage(MyDir + file);
                    builder.writeln();
                    builder.writeln(file);
                    continue;
                }
                Shape oleObject = builder.insertOleObject(MyDir + file, false, true, image);
                builder.writeln(file);
                builder.writeln();
            }
            doc.save(MyDir + "out.docx");
            //清除aspose代理的水印
            Utils.deleteWatermark(MyDir + "out.docx");
        }

    3.2注意事项

    3.2.1 Aspose插入和word中直接将文件对象拖入有区别

    • word原生的插入文件对象图标和文件名是一个整体;而通过Aspose包导入的只能通过人为设置的icon为对象添加图标,同时不能自动显示文件名,需要手动代码添加此功能。
      image
    • 经试验通过Aspose插入的对象文件类型为.doc .docx .xlsx .xls .pdf .jpg .png可以有效的打开,.ppt .pptx属于office自带的应该也可以。
    • builder.insertOleObject方法中,第二个参数为isLinked,设置为false才可以将内置文件完全复制进来,设置true则外部文件仅存储内部文件的地址,当地址改变或者文件删除后内部文件无法打开

    3.1.2 使用Aspose修改word时会默认加上水印

    可以通过其他jar包(比如poi)对该水印进行删除,因为Aspose的水印会自动添加到word的首段,将首段文件进行删除即可去掉水印。

    public static void deleteWatermark(String filePath){
            XWPFDocument doc = null;//word文档对象
            InputStream in_stream = null;
            OutputStream _os = null;
            try{
                in_stream=new FileInputStream(filePath);//文件流
                doc=new XWPFDocument(in_stream);
            }catch(IOException e){
                e.printStackTrace();
            }
            List<XWPFParagraph> _paraList=doc.getParagraphs();//得到一个包含所有段落的List
            XWPFParagraph _p=_paraList.get(0);//获取到第一个段落,根据需要读取相应段落
            List<XWPFRun> _runsList=_p.getRuns();//获取段落中的run列表
            XWPFRun _run=_runsList.get(0);//获取第一个run对象
            String s=_run.getText(0);//获取到run里面的子句字符串
            _run.setText(" ",0);//在0位置插入字符串
            try{
                _os=new FileOutputStream(filePath);
                doc.write(_os);
            }
            catch(IOException e){
                e.printStackTrace();
            }
            try {
                in_stream.close();
                _os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    4.成果

    插入后的效果
    image
    对第一个文件双击打开,浏览嵌入的文件
    image
    为了方便导附件做个壳
    image
    代码地址:http://download.csdn.net/detail/sn2ovfan/9884318

    注:InsertOLE.java的main函数中要简易的demo(运行时要修改文件路径),其他类涉及数据库的连接、附件迁移等代码,无法直接运行。

    展开全文
  • object嵌入对象标记

    2017-04-12 10:46:25
    一 标记介绍在HTML中可以使用标记将对象嵌入到页面中。标记可以编写在标记或标记内。在与标记之间可以编写提示文本,如果访问者当前的浏览器不支持嵌入的对象,提示文本可以给出提示。 标记常用的参数及说明   ...
    一 <object>标记介绍
    在HTML中可以使用<object>标记将对象嵌入到页面中。<object>标记可以编写在<head>标记或<body>标记内。在<object>与</object>标记之间可以编写提示文本,如果访问者当前的浏览器不支持嵌入的对象,提示文本可以给出提示。
    <object>标记常用的参数及说明

     
    二 <param>标记的参数
    用<object>标记在页面中嵌入对象之后,有时候需要向该对象或者控件传递参数,可以通过使用<param>标记,该标记没有结束标记</param>,并且该标记只在<object>标记内部有效,该标记有四个参数。

     
    • de422835-0f13-3f1c-bc05-806e5812a58a-thumb.png
    • 大小: 28.9 KB
    • c236bea3-0667-327e-9994-593ca9b0d088-thumb.png
    • 大小: 16.4 KB
    展开全文
  • C++嵌入对象

    千次阅读 2016-12-14 20:59:55
    嵌入对象 类的成员变量为用户自定义的类型时,这些成员变量称为嵌入对象。示例:在Master中嵌入World#include<iostream>class Master { public: Master(int id): _identifier(id) { std::cout <...

    嵌入对象
    类的成员变量为用户自定义的类型时,这些成员变量称为嵌入对象。

    示例:将Master嵌入World

    #include<iostream>
    
    class Master
    {
    public:
    	Master(int id):
    		_identifier(id)
    	{
    		std::cout << "Master for " << _identifier << "created" << std::endl;
    	}
    	~Master()
    	{
    		std::cout << "Master for " << _identifier << "destory" << std::endl;
    	}
    private:
    	int _identifier;
    };
    class World
    {
    public:
    	World(int id) :_identifier(id), _master(_identifier)
    	{
    		std::cout << "hello from world" << _identifier << std::endl;
    	}
    	~World()
    	{
    		std::cout << "Goodbye from world" << _identifier << std::endl;
    	}
    private:
    	const int _identifier;
    	const Master _master;
    };
    
    World theWorld(1);
    
    int main()
    {
    	World smallWorld(2);
    	return 0;
    }
    

    对象嵌入称做"has-a"关系,就上例来说” World has a Master"。

    在World构造函数的前导为:

    public:
    	World(int id) :_identifier(id), _master(_identifier)
    

    首先初始化_identifier,然后用_identifier初始化成员变量_master。因为_master是类的对象,所以调用类Master的构造函数,该构造函数需要一个值,这个值就是传递的_identifier。 类World的成员变量皆为常量成员,需要在前导中初始化,且在World生存期不变。

    为什么可以用_identifier初始化_master?

    在World的成员变量定义中 _identifier 在 _master 前面,所以_indentifier先被初始化,然后初始化_master。
    (所以说,上面前导中的顺序,其实并不代表真正的_indentifer和_master初始化顺序。而成员变量定义的顺序,才是初始化前后的顺序。其实在普通的变量定义时,变量定义先后的顺序,就是代表初始化前后的顺序)
    代码修改如下,输出结果一致。但是把两个变量定义的前后顺序修改后,输出结果不一致。

    public:
    	World(int id) : _master(_identifier),_identifier(id)
    

    综上所述:例子中首先初始化成员变量,之后调用了Master的构造函数,之后调用World的构造函数。。当释放对象时,反过来,先调用World的析构函数,再调用Master的析构函数。

    展开全文
  • 通过C++加载QML时,如果能将C++对象嵌入到QML中可能会很有用。这使得可以在QML中调用嵌入对象的方法,或者将C++对象实例作为QML视图的数据模型。 通过QQmlContext类可以将C ++数据注入QML对象。此类(QQmlContext)...
  • 错误,嵌入对象无效

    千次阅读 2015-05-12 00:36:15
    1,将visio中画的流程图复制到word文档上时,显示错误 “错误,嵌入对象无效”。 下面看的别人方法: -------------------------------------- 就是做好的图表copy到word...
  • 嵌入对象在网页中嵌入对象,实际上并不会在网页中插入对象,而是通过某种标签链接到指定的对象,标签创建的只是被引用对象的占位符而已。嵌入式对象主要包括图片、视频、音频、文档等,不同的对象使用不同的标签,并...
  • 从Word文档中提取嵌入对象

    万次阅读 2016-09-08 16:49:59
    从Word文档中提取嵌入对象 有时候我们可能需要提取嵌入到一个word文档的对象。这篇文章将讲述如何使用C#及一个免费Word组件- FreeSpire.Doc 从一个word文档中提取嵌入对象。 为了展示,我创建了一个word文档并向...
  • HTML嵌入多媒体对象

    千次阅读 2012-05-24 15:45:18
    【问题描述】如何在HTML中嵌入pdf、word,音频(如mp3),视频(如mp4),flash呢? 【分析】 ...1 嵌入pdf (1) 利用object (2) 利用超链接 内嵌pdf测试 2 嵌入word
  • 在Web页中嵌入QT对象

    千次阅读 2014-10-15 23:17:53
    根据最近读的QT高级编程,原来QT是可以在HTML中嵌入对象的,确实很厉害。于是自己动手写了一个Demo,中途出现了一点点问题,js执行有问题,看来要提交javascript了,我感觉python也应该适当提高提高了。下面要重点提...
  • VB对象的链接与嵌入

    千次阅读 2012-02-11 19:37:01
    OLE(Object Linking and Embedding),可以使VB应用程序访问Windows环境中其他应用程序的对象,从而使VB能够使用其他应用程序的数据。例如Word文档、 Excel工作表等,这类对象称为OLE对象。  VB能够访问的OLE对象...
  • JPA实体中字段映射补充和嵌入对象

    千次阅读 2018-06-27 16:07:21
    但是在实际中延迟加载简单类型的字段,不会带来多少资源的节省* 大型对象一个存储数据量很大的字符或者基于字节的对象,进行映射时候,需要特殊处理@Lob注解标识某个字段是大对象,并且当LOB列的名称需要重写假定...
  • 我用MFC写了一个OLE对象,然后在WORD中用“插入对象”命令嵌入。现在关于对象的尺寸问题一直困扰着我,请教各位大咖给予指导。 现象是这样的:嵌入WORD后,在对象上按右键选择“设置对象格式“,得到对象的原始尺寸...
  • 解决word中无法打开嵌入的visio对象 对于word2016中内嵌的visio对象,无法用鼠标右键打开编辑,双击的话会在word中打开一个很小的编辑框,很不方便,有的可以使用alt + 鼠标左键双击打开,但是有的不能。经过探索,...
  • 如何嵌入Excel对象

    千次阅读 2002-05-13 09:30:00
    在进行程序开发时,有时会需要将PowerBuilder与Excel应用程序结合使用,如将数据检索出来后,按照格式要求,...创建并连接对象: oleobject loo_excel oleobject loo_sheet loo_excel=create oleobject loo_excel.Conn
  • OLE- 微软API—对象链接与嵌入

    千次阅读 2013-02-20 11:09:40
    Object Linking and Embedding,对象连接与嵌入,简称OLE技术。OLE 不仅是桌面应用程序集成,而且还定义和实现了一种允许应用程序作为软件“对象”(数据集合和操作数据的函数)彼此进行“连接”的机制,这种连接...
  • Packager-对象包装程序1   ㈠、“对象包装程序”概述  “对象包装程序”是一种用于创建可以插入到某个文档中的程序包的工具。  “对象包装程序”窗口有两个窗格。“外观”窗格显示代表对象包的图标。...
  • Word中嵌入Visio对象无法显示问题

    千次阅读 2010-12-28 16:31:31
    Word中嵌入Visio对象无法显示问题 - [软件技术 ] 版权声明 :转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://bufferpool.blogbus.com/logs/46727253.html  环境:Windows XP,Word ...
  • 当用word打开对象包的时候报下面的错误: 用于创建此对象的程序是 Package。您的计算机尚未安装此程序。 解决办法,若要编辑此对象,您必须安装可以打开此对象的程序。 下载package.exe; 将package.exe文件放...
  • excel 不能使用对象链接和嵌入
  • 计算机这几天在打开Excel文档的时候,提示:不能使用对象链接和嵌入, 而且出现如下的提示:Microsoft Office Excel进程已停止工作, 每次打开Excel的时候都是同样的问题,害我跟客户远程服务的时候因为着急了半天,...
  • 最近excel在打开时出现 不能使用对象链接和嵌入 的错误(英文为:Cannot use object linking and embedding.),尝试修复、重装office、excel都未能解决,最后在网上查资料都说是因为病毒引起(被蠕虫感染),于是基本上打...
  • 如何在jsp中嵌入Java代码取出存放在Attribute中的对象

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 220,755
精华内容 88,302
关键字:

对象的嵌入