精华内容
下载资源
问答
  • setdata函数的作用
    千次阅读
    2019-09-03 17:18:44

    博主用QStandItem::setData()函数后,发现设置了QStandItem::setIcon()函数后,用setData()函数无效。实际上,并不是无效,数据真实存储了,只是我们引用不对。

    1.1错误分析

    具体的引用应该用如下:data(Qt::UserRole+1)

    modeIndex.data(Qt::UserRole+1).toULongLong()

    而不是用data().values()[1].toInt()读取。

    itemMode->itemData(modeIndex).values()[1].toInt()

    1.2解决方案

    下面是具体的用法

    //存储进setData()函数里面
    QStandardItem *item3=new QStandardItem(QIcon(":/1.png"),fileInfo->fileName);
            item3->setData(fileRefer,Qt::UserRole + 1);
    
    
    //从data()函数里面取出数据
    void QWidget::slot_pressedRow_tree(QModelIndex modeIndex)
    {    
        qDebug()<<<modeIndex.data(Qt::UserRole+1).toULongLong();
    }

     

    如果想要存储多个,可以用对象,也可以设置多个角色,调用函数setData(QVariant),如下代码所示:

    //逐条存储
    item3->setData(fileRefer1,Qt::UserRole + 1);    //设置用户数据
    item3->setData(fileRefer2,Qt::UserRole + 2);    //设置用户数据
    //获取数据(QModelIndex index)
    int value1 = index->data(Qt::UserRole).toInt();  // 获取用户数据
    QString value2 = index->data(Qt::UserRole + 1).toString();  // 获取用户数据
    qDebug() << value1;
    qDebug() << value2;
    
    
    //存储对象
    User users;
    item3->setData(Qt::UserRole, QVariant::fromValue(users));  //设置用户数据
    //获取数据(QModelIndex index)
    QVariant variant = index->data(Qt::UserRole);  // 获取用户数据
    User user = variant.value<User>();
    qDebug() << "ID : " << user.value1;
    qDebug() << "Name : " << user.value2;

     

     

    参考内容:

    https://blog.csdn.net/qq_36038987/article/details/80762610(setData函数用法)

    更多相关内容
  • 主要介绍了详解关于微信setData回调函数中的坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 小程序setData函数小探究

    千次阅读 2018-08-02 19:43:23
    setData函数改变Page的data是同步的,会异步通知视图层data的改变,视图层收到通知后进行渲染。即官方文档里生命周期的Send Data箭头(下图) callback分析 先上代码: Page({ data: { theData: 1 }, ...

    官方文档可以知道

    这里写图片描述

    setData函数改变Page的data是同步的,会异步通知视图层data的改变,视图层收到通知后进行渲染。即官方文档里生命周期的Send Data箭头

    callback分析

    先上代码:

    Page({
      data: {
        theData: 1
      },
      onLoad: function(options) {
        console.log("data begin:" + this.data.theData);
        this.setData({
          theData: 2
        }, () => {
          console.log("callback");
        });
        console.log("data after:" + this.data.theData);
        /*长耗时*/
        for (var i = 0; i < 1000000; i++) {
          for (var j = 0; j < 2000; j++) {
            j++;
          }
        }
        console.log("data long after:" + this.data.theData);
      }
    })
    

    结果:
    这里写图片描述
    结果描述:data begin:1与data after:2瞬间就打印,并且页面也瞬间显示完成,随后过几秒后data long after才打印,并且紧接着callback也打印了。

    结论
    1、逻辑层是单线程,视图层的回调callback是异步代码段,因此逻辑层的高耗时代码段执行完成后,异步代码段才会执行。(其实就是js引擎就是单线程,没啥好结论的[捂脸][捂脸])
    2、setData函数是同步方法,使用serData后,data对象的值就是修改后的,后面的代码取出的data就是修改后的,可以放心处理不必担心出现异步问题。

    callback再分析:

    setData后,逻辑层会通知视图层data改变了,随后视图层会进行渲染。
    在这里插入图片描述

    渲染是需要耗时的,这里猜测一下:callback是在逻辑层通知视图层成功后就立即调用,还是在视图层渲染成功后才通知逻辑层调用callback?(即是在1处执行callback还是在2处执行callback?)

    先上代码:

    Page({
      data: {
        colorMap: [],
        count: 0
      },
      onLoad: function() {},
      change: function() {
        var columnAmount = 75;
        var rowAmount = 200;
        var colorMap = [];
        //这里随机生成1~5数字,用于前端随机展示5种不同的颜色块,颜色块共200*75个
        //所以视图层渲染起来会比较慢
        for (var i = 0; i < rowAmount; i++) {
          colorMap[i] = [];
          for (var j = 0; j < columnAmount; j++) {
            colorMap[i][j] = Math.ceil(Math.random() * 5);
          }
        }
        var that = this;
        console.log("begin setData")
        this.setData({
          //注意该setData会导致视图层较高耗时
          colorMap: colorMap
        }, () => {
          that.data.count++;
          console.log("callback", that.data.count)
          if (that.data.count < 5) {
            that.change();
          }
        });
      }
    });
    
    <view class='mycontainer'>
      <view wx:for="{{colorMap}}" class="row" wx:for-item="rowitem">
        <view wx:for="{{rowitem}}" class='box color{{boxitem}}' wx:for-item="boxitem"></view>
      </view>
      <button bindtap="change">change</button>
    </view>
    
    .mycontainer{
      width: 100%;
      height: 100%;
    }
    .box{
      width: 10rpx;
      height: 10rpx;
      float: left;
    }
    .row{
      width: 100%;
      height: 10rpx;
    }
    .color1{background-color: red;}
    .color2{background-color: yellow;}
    .color3{background-color: rgb(47, 179, 255);}
    .color4{background-color: cyan}
    .color5{background-color: orange;}
    

    结果:
    在这里插入图片描述

    结果描述:
    点击change后:
    1、迅速打印出begin setData
    2、然后等了大约半秒
    3、模拟器出现随机颜色块,同时控制台打印出callback
    4、重复了1~3一共5次

    代码可以看出,主要的耗时是在视图层的渲染里的,如果是逻辑层通知视图层成功后就执行callback,那么应该是先打印callback,然后大约半秒,模拟器才出现随机颜色块。因此得出下面结论:

    结论:
    逻辑层执行setData后,视图层进行渲染,渲染成功后,逻辑层的callback才会被调用。

    小结:因此对于要求必须渲染成功后才允许执行某代码块的场景,可以放心使用setData的callback方法。

    展开全文
  • 在微信小程序中经常会使用到setData函数把变量渲染到视图层,那么什么是setData呢?如何使用?注意事项有些什么?下面我们就来详细了解一下! 正文 setData是小程序开发中使用最频繁的接口,也是最容易引发性能问题...

    在微信小程序中经常会使用到setData函数把变量渲染到视图层,那么什么是setData呢?如何使用?注意事项有些什么?下面我们就来详细了解一下!

    正文

    1. setData是小程序开发中使用最频繁的接口,也是最容易引发性能问题的接口。
    2. setData函数用于将数据从逻辑层渲染到视图层(异步),同时改变对应的this.data的值(同步)。

    实例1:简单实现点击修改变量值

    <text>test:{{test}}</text>
    <button bindtap="bindTest">点击改变test值</button>
    
    Page({
        data: {
            test: "我是测试变量"
        },
        bindTest: function () {
            console.log("this.data.test:" + this.data.test);
            this.setData({
                test: "我是测试变量,我的值被改变了!"
    	})
    	console.log("this.data.test:" + this.data.test);
        }
    })
    

    效果:
    在这里插入图片描述

    实例解析:

    1. 代码很容易理解,点击按钮test变量的值被改变了,通过setData函数渲染到了前端展示。
    2. 另外我在this.setDta前后分别打印出了this.data.test的值,看看最终打印结果:
      在这里插入图片描述

    这里就说明了setData函数渲染到视图层后,会同步修改this.data.test的值。

    实例2:动态修改数组指定下标的某个参数值(类似购物车)

    <block wx:for="{{test}}" wx:key="index">
        <view data-index="{{index}}" bindtap="bindTest">{{item.txt}}</view>
    </block>
    
    Page({
        data: {
    	test: [
    	    { txt: "我是1号" },
    	    { txt: "我是2号" },
    	    { txt: "我是3号" }
    	]
        },
        bindTest: function (e) {
    	// 被点击的view
    	let index = e.currentTarget.dataset.index;
    	// 根据index找到test对应索引中对应要修改的参数
    	let revise = "test[" + index + "].txt";
    	this.setData({
    	    [revise]: "呃,我被人给点了!!!"
    	})
        }
    })
    

    效果
    在这里插入图片描述

    实例解析:

    1. 其实这个就是根据index找到test对应索引中对应要修改的参数,然后进行修改并渲染到页面上;
    2. 该功能购物车选中状态、数量更改都可以使用到;
    3. 此方法比使用循环寻找更改然后再渲染,更方便、性能更好!

    注意事项

    1. 如果Page对象的data中没有定义该key,则setData自动创建;如有则修改data中原变量的值。
    2. 直接修改this.data,而不调用this.setData(),是无法改变当前页面的状态的,会导致数据不一致。
    3. 使用this.setData({})时,注意this指向问题。 仅支持可以JSON化的数据。
    4. 单次设置的数据不能超过1024KB,尽量避免一次设置过多的数据。
    5. 不要把data中的任何一项的value设为undefined,否则这一项将不能被设置,可能会有潜在的问题。

    常见的setData操作错误(官方文档)

    1.频繁的去setData

    在我们分析过的一些案例里,部分小程序会非常频繁(毫秒级)的去setData,其导致了两个后果:

    1. Android 下用户在滑动时会感觉到卡顿,操作反馈延迟严重,因为 JS线程一直在编译执行渲染,未能及时将用户操作事件传递到逻辑层,逻辑层亦无法及时将操作处理结果及时传递到视图层;
    2. 渲染有出现延时,由于WebView 的 JS 线程一直处于忙碌状态,逻辑层到页面层的通信耗时上升,视图层收到的数据消息时距离发出时间已经过去了几百毫秒,渲染的结果并不实时;

    2.每次setData都传递大量新数据

    由setData的底层实现可知,我们的数据传输实际是一次evaluateJavascript脚本过程,当数据量过大时会增加脚本的编译执行时间,占用WebView JS线程。

    3.后台态页面进行setData

    当页面进入后台态(用户不可见),不应该继续去进行setData,后台态页面的渲染用户是无法感受的,另外后台态页面去setData也会抢占前台页面的执行。

    展开全文
  • 其实这个功能实现起来也不难,核心就是用到了window子对象clipboardData的一个方法:setData()语法: clipboardData.setData(sDataFormat, sData) 参数:sDataFormat:要复制的内容的格式;sData:要复制的内容。 ...
  • Qt中setData()和data()用法

    千次阅读 2021-03-25 22:54:33
    最近在一个项目要到了setData()和data() 常见接口 1、**setdata()**存储数据 2、**data()**取出数据 单独存储 1、通过setData(),我们可以单独存储用户数据,使用Qt::UserRole、Qt::UserRole + 1.。。。。 ...

    简述

    最近在一个项目要到了setData()和data()

    常见接口

    1、**setdata()**存储数据
    2、**data()**取出数据

    单独存储

    1、通过setData(),我们可以单独存储用户数据,使用Qt::UserRole、Qt::UserRole + 1.。。。。

    QListWidget *pListWidget = new QListWidget(this);
        int i = 0;
        for(i = 0; i  < 5; ++i )
        {
            QListWidgetItem *pItem = new QListWidgetItem(pListWidget);
            pItem->setData(Qt::UserRole + 1, QString("数据 %1").arg(i));  // 用户数据
             pItem->setData(Qt::UserRole + 2, QString("测试 %1").arg(i));
            pItem->setText(QString("Item %1").arg(i));  // 文本
            pListWidget->addItem(pItem);
        }
        // 连接信号槽
        connect(pListWidget, &QListWidget::itemClicked, this, &Widget::onItemClicked);
    

    槽函数取出数据

    void onItemClicked(QListWidgetItem *item) {
        int nID = item->data(Qt::UserRole).toInt();  // 获取用户数据
        QString strName = item->data(Qt::UserRole + 1).toString();  // 获取用户数据
        QString strC = item->data(Qt::UserRole + 2).toString();
        qDebug() << "ID : " << nID;
        qDebug() << "Name : " << strName;
        qDebug() << "strC" << strC;
    }
    

    整体存储

    也可以通过**setData()**进行整体存储,这时候只需要使用Qt::UserRole即可,把用户数据当成一个结构体来存储。
    1、定义一个结构体

    //用户信息
    struct User : QObjectUserData 
    {
    	int nID;	//ID
    	QString strName;//用户名
    };
    
    QListWidget *pListWidget = new QListWidget(this);
    int i = 0;
    do {
        ++i;
        QListWidgetItem *pItem = new QListWidgetItem(pListWidget);
        User user;
        user.nID = i;
        user.strName = QString("Qter %1").arg(i);
        pItem->setData(Qt::UserRole, QVariant::fromValue(user));  // 设置用户数据
        pItem->setText(QString("Item %1").arg(i));
        pListWidget->addItem(pItem);
    } while (i < 5);
    

    槽函数

    void onItemClicked(QListWidgetItem *item) {
        QVariant variant = item->data(Qt::UserRole);  // 获取用户数据
        User user = variant.value<User>();
     
        qDebug() << "ID : " << user.nID;
        qDebug() << "Name : " << user.strName;
    }
    
    展开全文
  • 演示微信小程序开发对 Page.prototype.setData() 函数的封装的例子,作者:云淡风轻。  比如显示/隐藏、添加样式、移除样式、添加class、绑定事件、移除事件、重新注册事件源、列表绑定事件等。
  • 在onLoad()函数中调用setData() onReady: function () { this.setData({ value:"调用setData()修改后的值" }) },
  • 用js实现微信小程序setData函数 通过数据路径来修改数据的方式,用于处理复杂数据十分强大。 let data = { link: { title: 'xxxx', goods: [{name: '西瓜', price: 200}, {name: '西瓜', price: 200}] } ...
  • 重载qsqlquerymodel的setdata函数如何实现qsqltablemodel的setdata的效果,即无论修改qtableview哪列哪行的值都可以对应修改数据表里的值,即到底是怎么判断出qtableview当前选中的格子的字段值是什么。
  • JS交互逻辑详解——data数据变更时同步(setData 函数) & 视图层更新是异步 js和wxml交互流程分析 js与模板是如何交互的? App() 该函数是微信小程序api的一部分,App名称是固定的 getApp() 作用:在...
  • 如果允许用户编辑view中的item,那么必须重写model中的setData()函数和flag()函数,  //允许用户编辑item,必须重写setData()函数  bool TradeTableModel::setData ( const QModelIndex & index, ...
  • setData函数包括上一篇中的onLoad、onShow、onReady、onHide以及onUnload函数均在微信小程序开发文档中的Page(Object object)一栏中可查到。 setData函数用于在小程序中动态更新数据并在屏幕上实时显示数据更新结果...
  • 微信小程序—success回调函数为什么使用this.setData报错 在success函数中执行this.setData报错 是因为success方法指向闭包,所以this属于闭包,由此在success回调函数里是不能直接使用this.setData()的,如果我们...
  • 微信小程序中 setData 详解

    万次阅读 多人点赞 2020-06-21 11:44:26
    定义: 设置数据,更改数据 作用setData函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的 this.data的值(同步) 仔细细品这句话,会包含了很多信息 setData它是微信小程序提供的一个内置的接口,是用于...
  • 在组件中绑定一个事件处理函数。 事件分为冒泡事件和非冒泡事件: 冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。 非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。 如 <!--...
  • 然后我们看下setData()的两个功能过程:setData函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的this.data的值(同步)。再来看setdata调用情景:一般setData()方法多用于点击后改变页面信息或者...
  • 这些值在微信小程序中都需要使用一个名为setData的方法,而这个方法是通过键值对的形式对数据进行修改,setData({ 参数名: 值 });  既然知道是以键值对的方式进行传参,那么我们在修改数组和对象的时候就直接将要...
  • wxml: <view> <block wx:for="{{dataArray}}" wx:key="id">...this.setData({ dataArray: [] }) //this.data.dataArray = [] 1、dataArray数据要渲染在wxml页面上 2、如果只是使用this.data
  • _this.setData({ imgList: tempFilePathsImgs },()=>_this.uploadimagFile()) uploadimagFile(){ }
  • 1.wx:for给每个循环的item绑定唯一的key,是为了避免在虚拟dom比较的时候,由于数据更新,使用了默认的...3.setData修改数据的时候,如果没有调用,会修改数据源,但页面不会重新渲染,所以必须调用setData函数; ...
  • 【微信小程序】 setData 的用法

    千次阅读 2020-09-10 12:04:16
    setData 函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的 this.data 的值(同步)。 data Object 以 key: value 的形式表示,将 this.data 中的 key 对应的值改变成 value 简单示例 Page({ data: { ...
  • wx.chooseImage({ success (res) { const tempFilePaths ... //此处应该如此转换后才可以用setData赋值,否则setData失效报错 var thimg = data.msg; that.setData({ comimg: thimg }) } }) } })  
  •  介绍:setData函数主要用于将逻辑层数据发送到视图层,同时对应的改变this.data.x的值。  参数:Object 以 key : value 的形式表示,将 this.data 中的 key 对应的值改变成 value。 使用:先给出代码,wxss没有...
  • 主要介绍了微信小程序 setData 对 data数据影响的 一点研究,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
  • ① 定义一个形状类CShape(抽象类),并添加一个普通成员函数(用来重设形状大小,重载成员函数SetData()、两个纯虚成员函数-周长计算函数Perimeter()和面积计算函数Area(); ② 由CShape派生出一个圆形类...
  • 微信小程序之回调函数中用setData

    千次阅读 2020-02-05 17:06:03
    起因: 想在某个回调函数中用setData 改变值 出错的代码: Page({ data: { userinfo : 'notknow' }, getuser1 : function(){ console.log('hello'); wx.getSystemInfo({ success: function(res) { consol.....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,711
精华内容 23,484
关键字:

setdata函数的作用