澳门金莎娱乐手机版 金沙澳门手机版网址 B20内不重复非空单元格,Qt 学习之路 2(45)澳门金莎娱乐手机版

B20内不重复非空单元格,Qt 学习之路 2(45)澳门金莎娱乐手机版



ListCtrl控件双击后无法赢得除第1列以外的行号函数用的是网络的超级多人用的例子:

 Home

供给注意的:


  1. 虽然 + * 临时能够和 or、and 沟通,可是她们是有分其他,举个例子:

=sum(if(and(A1:A2>0,A1:A2<8),B1:B2)) 
VS
=sum(if((A1:A2>0)*(A1:A2<8),B1:B2))

前端唯有当A1、A2都介于0和第88中学间时才回来B1:B2的和,不然得到0;
后任则分别了,举例A1介于0和8以内,A2不介于0和8之内,那么求得的结果是B1的和,并非0。
AND(logical1,logical2, …卡塔尔(英语:State of Qatar) –详见 and
函数协理:当全体的logical们都为True时再次来到True –这是1个单值
OMurano(logical1,logical2, …卡塔尔国 –详见 or
函数协理:当所有的logical们假若有三个为True时回来True
–那是1个B20内不重复非空单元格,Qt 学习之路 2(45)澳门金莎娱乐手机版。单值
(A1:A2>0)*(A1:A2<8卡塔尔(قطر‎–重返的是{True;False}*{True;True}类型的数组相乘的结果{1;0}——那是八个数组
(A1:A2>0卡塔尔国+(A1:A2<8卡塔尔(قطر‎——再次回到的是{True;False}+{True;True}类型的数组相加的结果{2;1}——那是二个数组
正是说And、O景逸SUV总结出来的接连单值,不是数组。

  1. — 用于把公文转变到数字,也能够用*1代替,(或者N(“xx”+0)?)

  2. 利用: 将文本中的数字收取,例如:”抽取32.0元”

=LOOKUP(9E+307,--MID(A1,MIN(FIND({0;1;2;3;4;5;6;7;8;9},A1&1234567890)
),ROW(INDIRECT("1:"&LEN(A1)))))

还能再拉长对MIN(FIND…卡塔尔(英语:State of Qatar)的值与LEN(A1卡塔尔的可比,以防现身#N/A

释疑:布局了一个搜索数组,从第生龙活虎现身数字的位置上马取子字符串,然后将其转移为数字(无法改造为数字的为#N/A卡塔尔国,然后用Lookup钦赐贰个9E+307这么的运气,最终回来小于等于他的(实际上相当于最相近它的)数,也便是最长的能够调换为数字的子字符串。

  1. 应用:取出某列中国和亚洲空不重复的单元格的源委:

澳门金莎娱乐手机版 1

Excel数组公式

此处加一个渴求:再次回到B1:B20内不重复非空单元格。
步骤分解:
(1)首先收取非空不另行单元格所在的行号:

 IF($B$1:$B$20<>"",IF(MATCH($B$1:$B$20,$B$1:$B$20,0)=ROW($B$1:$B$20),ROW($B$1:$B$20)))

因为MATCH函数不能够运用空值作为第三个参数,所以先采用IF语句把空值消亡出去。然后由于MATCH函数重临寻找值中在漫天区域率先次面世的位置,将其和自身所在行号举办比对,就能够看清是还是不是再次。为了有助于将它定义为贰个名称x,那是贰个数组。
(2)然后使用
IF(ROW(1:1)>COUNT(x),"",INDEX(A:A,SMALL(x,ROW(1:1))))收获想要的结果,那是利用数组拿到叁个单值。

  1. 使用:重回B列内等于“A”的对应A列的笔录:

澳门金莎娱乐手机版 2

Excel数组公式

手续分解:
(1)首先接受 IF($B$1:$B$20="A",ROW($B$1:$B$20))
达成判定B列等于”A”的笔录的行号。注意那一个结果是一个数组,使其有了不相同的用途,为了便利能够将其定义为名称
x
(2)使用 SMALL(x,ROW(1:1))
把切合条件的行号依据从小到大的顺种类出来,那是使用数组得到三个单值。
(3)使用
INDEX($A$1:$A$20,SMALL(x,ROW(1:1))),把A列对应的记录取出来。
(4)为了不出新谬误值,使用SUM(($B$1:$B$20="A")*1)<ROW(1:1)
作为度量规范,日常选拔SUM数组公式,能够组合三个原则,且的涉嫌选择*,或的涉嫌选择+,独有多个条件时要加个常用标准,比方本例*1。
假定在大增一个规范化,则在这国君式中插手
IF(($B$1:$B$20="A")*($C$1:$C$20="B"),ROW($B$1:$B$20)) 然后相应地在
(SUM(($B$1:$B$20="A")*1)<ROW(1:1) 中参预相应的推断规范
(5)最后公式为:

     =IF(SUM(($B$1:$B$20="A")*1)<ROW(1:1),"",INDEX($A$1:$A$20,SMALL(x,ROW(1:1))))
  1. 回到重新次数最多的值
![](https://upload-images.jianshu.io/upload_images/5740850-7dacb3ea31a60ec2.png)

Excel数组公式

解题步骤:
(1)首先应用IF(COUNTIF($B$1:$B$20,$B$1:$B$20)=MAX(COUNTIF($B$1:$B$20,$B$1:$B$20)),ROW($B$1:$B$20))
拿到贰个数组,用于切合条件的行的行号,也正是G列所示的值,为了方便能够将其定义为名称
x
(2)使用 INDEX($C$1:$C$20,SMALL(x,ROW(1:1))),把C列中的内容抽出来。
(3)为了不出新错误值,能够运用IF(COUNTIF($B$1:$B$20,$B$1:$B$20)=MAX(COUNTIF($B$1:$B$20,$B$1:$B$20)),1)获取其余三个数组,用于符合条件的行的计数,将其定义为名称y。然后使用SUM(y)<ROW(1:1)作为剖断规范。
(4)最终公式为

:=IF(SUM(y)<ROW(1:1),"",INDEX($C$1:$C$20,SMALL(x,ROW(1:1))))
  1. 奉公守法重复次数的大大小小列示内容

澳门金莎娱乐手机版 3

Excel数组公式 – supershll – 回想里

解题步骤:
(1)首先获得不另行单元格所在的行号数组:

IF(MATCH($B$1:$B$20,$B$1:$B$20,0)=ROW($B$1:$B$20),ROW($B$1:$B$20)),

如E列所示。
(2)然后拿走不另行单元格的再次次数数组:

IF(MATCH($B$1:$B$20,$B$1:$B$20,0)=ROW($B$1:$B$20),COUNTIF($B$1:$B$20,$B$1:$B$20))

如F列所示
(3)为了实行排序的还要又收获行号,所以综合E列和F列的多寡,使用如下:

IF(MATCH($B$1:$B$20,$B$1:$B$20,0)=ROW($B$1:$B$20),COUNTIF($B$1:$B$20,$B$1:$B$20)+ROW($B$1:$B$20)/1000)

这么整数局地是重复次数,小数部分是行号。如G列所示,那些数组切合我们的采纳需要了,将其定义为名称x
(4)使用LAENVISIONGE函数进行排序。LARGE(x,ROW(1:1)),那是利用数组得到三个单值。
(5)然后选用MOD函数取骑行号。MOD(LARGE(x,ROW(1:1))*1000,1000)
(6)然后在动用INDEX函数收取对应行的记录。INDEX($B$1:$B$20,MOD(LARGE(x,ROW(1:1))*1000,1000))
(7)最后屏蔽错误值,IF(ROW(1:1)>COUNT(x),"",INDEX($B$1:$B$20,MOD(LARGE(x,ROW(1:1))*1000,1000))),
也得以接收ROW(1:1)>SUM(1/COUNTIF($B$1:$B$20,$B$1:$B$20))澳门金莎娱乐手机版 ,作为度量尺度,那个SUM的意思乃是区域内去重后的单元格的个数(要是重复的单元格a的个数n,n个(n/1卡塔尔国相加最终产生1卡塔尔(英语:State of Qatar)。

  1. 回到区域内切合条件的值

澳门金莎娱乐手机版 4

Excel数组公式 – supershll – 回忆里

解题步骤:
(1)首先应用IF($A$2:$H$12=1,ROW($A$2:$H$12)*10000+COLUMN($A$2:$H$12))寻觅切合条件的单元格行号和列号数组,这是一个2维数组。将其定义为名称x
(2)假设想使用INDEX函数就需求寻找相关的参数来,即INDEX(数据区,行数,列数)。使用INT(SMALL(x,ROW(1:1))/10000)获得行号,MOD(SMALL(x,ROW(1:1)),10000)获得列号。
(3)最终采纳INDEX得到结果,此公式是姓名列的公式(在那之中Column(卡塔尔(قطر‎-17是依附公式所在列设置的卡塔尔INDEX($A$1:$H$12,INT(SMALL(x,ROW(1:1))/10000),MOD(SMALL(x,ROW(1:1)),10000)+COLUMN()-17)
(4)最终正是遮盖错误值的难题。使用IF(SUM(IF($A$2:$H$12=1,1))<ROW(1:1),"","原公式")

  1. 按梯次重临不重复值
![](https://upload-images.jianshu.io/upload_images/5740850-265911a7e00bfa33.png)

Excel数组公式 - supershll - 记忆里

解题步骤:
(1)使用MATCH函数获取不重复行的行号和值的数组,将其定义为名称x

IF(MATCH($B$1:$B$6,$B$1:$B$6,0)=ROW($B$1:$B$6),ROW($B$1:$B$6)*100+$B$1:$B$6)

(2)使用SMALL函数:

SMALL(MOD(SMALL(x),{1;2;3}),100),ROW(1:1))
  1. 重返数字中不另行的前3位数。

澳门金莎娱乐手机版 5

Excel数组公式 – supershll – 回忆里

解题步骤:
(1)使用ROW(INDIRECT("1:"&LEN(A1*B1)))求出乘积结果的位数序号数组,如F列所示,定义为名称x
(2)使用MID(A1*B1,x,1)把乘积的结果依照原本顺序组成内部存款和储蓄器数组,如G列所示,定义为名称y
(3)然后使用MATCH函数获取不重复行的行号和值的数组,定义为名称m。如J列所示
IF(MATCH(y,y,0)=x,x*100+y)
(4)使用SMALL函数,SMALL(MOD(SMALL(m),{1;2;3}),ROW(1:1)),如M列所示,那是由数组获得的单值
(5)将结果串起来TEXT(SUM(SMALL(MOD(SMALL(m),{1;2;3}),{1;2;3})*10^{2,1,0}),"000")重复使用数组获得贰个单值。

  1. 小结:使用数组公式,必供给时刻清楚,哪天结果是数组,曾几何时结果是单值。然后再凭借结果插香港足球总会结,比如送数组中抽取单值或把单值组合成数组
voidParaMeterTool::OnDblclkList1(NMHDR*pNMHDR,LRESULT*pResult){LPNMITEMACTIVATEpNMItemActivate=reinterpret_castLPNMITEMACTIVATE(pNMHDR);//TODO:在此添加控件通知处理程序代码/*if(pNMItemActivate-iItem!=-1)*/listitemdbcl=list_meterdata.GetSelectionMark();if(listitemdbcl){CRectrect,dlgRect;//获得当前列的宽度以适应如果用户调整宽度intwidth=list_meterdata.GetColumnWidth(pNMItemActivate-iSubItem);list_meterdata.GetSubItemRect(listitemdbcl,pNMItemActivate-iSubItem,LVIR_BOUNDS,rect);//保存选择的列表项索引//这个因为两个列表公用一个CEdit控件//所以需要保存列表的索引//以及子项相对应的行列号索引listdbclicked=1;/*listitemdbcl=pNMItemActivate-iItem;*/listsubitemdbcl=pNMItemActivate-iSubItem;}*pResult=0;}

 / 

用pNMItemActivate直接拿走不得以,用GetSelectionMark(卡塔尔(英语:State of Qatar)函数也博得不到第二列的行号。。对该listctrl的编制程序是这么的,瞧着没毛病啊

Qt 学习之路 2

intline=list_meterdata.GetItemCount();str_list.Format(_T("%0.2f"),flow_s);list_meterdata.InsertItem(line,str_list);for(i=0;isinfo.meternum;i++){str_list.Format(_T("%d"),dt[i]);list_meterdata.SetItemText(line,i+1,str_list);}

 / 

Qt 学习之路 2(45):模型

Qt 学习之路 2(45):模型

 豆子  2013年2月26日  Qt 学习之路
2  23条评论

在前头两章的底工之上,大家将起来介绍 model 的通用概念。

在 model/view 结构中,model
提供意气风发种标准接口,供视图和信托访谈数据。在 Qt
中,那些接口由QAbstractItemModel类举行定义。不管底层数据是什么样存款和储蓄的,只若是QAbstractItemModel的子类,都提供后生可畏种表格格局的档次构造。视图利用联合的更动成访问模型中的数据。可是,须求提供的是,就算模型内部是如此组织数量的,不过并不须要也得那规范向顾客体现数据。

 

下边是各类 model
的团队示意图。我们运用此图来精晓什么叫“意气风发种表格情势的等级次序构造”。

澳门金莎娱乐手机版 6

如上海体育场所所示,List Model
即便是线性的列表,也许有三个 Root
Item(根节点),之下才是呈线性的三个个数目,而这么些多少实际上能够作为是二个独有一列的报表,不过它是有档次的,因为有一个根节点。Table
Model 就比较简单驾驭,只是也设有二个根节点。Tree Model
主要面向等级次序数据,而每生机勃勃档期的顺序都能够都游人如织列,由此也是二个带有等级次序的表格

为了能够使得数据的浮现同存款和储蓄分离,大家引进模型索引(model
index)的概念。通过索引,我们得以访谈模型的特定元素的特定部分。视图和信托使用索引来伏乞所急需的数额。由此能够看来,独有模型自个儿要求了解哪些赢得数量,模型所管理的数据类型能够动用通用的秘籍开展定义。索引保存有创立的它的充足模型的指针,这使得同一时间操作多少个模型成为只怕。

 

 

1
QAbstractItemModel *model = index.model();

模型索引提供了所急需的信息的有时索引,能够用于通过模型取回可能涂改数据。由于模型任何时候恐怕再一次组织其内部的组织,因而模型索引很大概成为不可用的,当时,就不应该保留这个多少。假若你供给短期有效的多少片段,必需创设长久索引。长久索引保险其引述的数额立马更新。一时索引(也正是普通使用的目录)由QModelIndex类提供,悠久索引则是QPersistentModelIndex类。

为了恒久模型中的数据,我们须要四个属性:行号、列号以至父索引。上面大家对这几个生龙活虎举办分解。

大家前面介绍过模型的骨干格局:数据以二维表的花样进行仓库储存。那个时候,叁个数目足以由行号和列号实行稳固。注意,大家只是是选择“二维表”那么些名词,并不表示模型内部真的是以二维数组的格局开展仓库储存;所谓“行号”“列号”,也唯有是为便于描述这种对应关系,并不着实是有行列之分。通过点名行号和列号,大家得以稳定五个成分项,收取其新闻。那时,大家赢得的是二个索引对象(纪念一下,通过索引大家能够赢得具体音信):

 

 

1
QModelIndex index = model->index(row, column, …);

模型提供了贰个简约的接口,用于列表以至表格这种非档期的顺序视图的数量获得。不过,正如上边的代码暗暗提示的那样,实际接口实际不是那么轻巧。大家得以经过文书档案查看那一个函数的原型:

 

 

1
2
3
QModelIndex QAbstractItemModel::index(int row,
                                      int column,
                                      const QModelIndex &parent=QModelIndex()) const

这里,大家唯有使用了前多个参数。通过下图来领悟一下:

澳门金莎娱乐手机版 7

 

在叁个差少之又少的报表中,每二个项都能够由行号和列号分明。因而,我们只需提供几个参数就能够获取到表格中的某贰个数码项:

 

 

1
2
3
QModelIndex indexA = model->index(0, 0, QModelIndex());
QModelIndex indexB = model->index(1, 1, QModelIndex());
QModelIndex indexC = model->index(2, 1, QModelIndex());

函数的倒数参数始终是
QModelIndex(卡塔尔国,接下去大家就要商量那个参数的含义。

在挨近表格的视图中,比如列表和表格,行号和列号足以定位三个数额项。不过,对于树型构造,只有四个参数就相差够了。那是因为树型构造是一个档案的次序布局,而档次布局中每叁个节点都有超大希望是其余多个报表。所以,每三个项需求指明其父节点。后边说过,在模型外界只好用过索引访问内部数据,因此,index()函数还索要一个parent 参数:

 

 

1
QModelIndex index = model->index(row, column, parent);

就像的,大家来探视上面包车型大巴暗中表示图:

澳门金莎娱乐手机版 8

图中,A 和 C 都以模型中的顶尖项:

 

 

1
2
QModelIndex indexA = model->index(0, 0, QModelIndex());
QModelIndex indexC = model->index(2, 1, QModelIndex());

A 还或者有温馨的子项。那么,我们就相应利用上面包车型大巴代码获取 B 的目录:

 

 

1
QModelIndex indexB = model->index(1, 0, indexA);

透过大家看出,若是独有行号和列号多个参数,B 的行号是 1,列号是 0,这同与
A 同级的行号是 1,列号是 0 的项相像,所以大家经过 parent 属性不一样开来。

如上大家谈谈了有关索引的永远。今后大家来走访模型的其它叁个局地:数据剧中人物。模型能够本着不一致的组件(或许构件的例外界分,比方开关的唤醒以致显示的公文等)提供不一致的多少。比如,Qt::DisplayRole用以视图的文件显示。通常来讲,数据项包蕴生机勃勃雨后春笋不一致的数额剧中人物,那一个脚色定义在Qt::ItemDataRole枚举中。

我们得以经过点名索引以致角色来获得模型所提供的数量:

 

 

1
QVariant value = model->data(index, role);

由此为每二个角色提供适当的数据,模型能够告诉视图和嘱托如何向客户展示内容。分裂类其余视图能够选用忽视本身不须要的数码。当然,我们也足以增加大家所须要的额外数据。

小结一下:

  • 模型使用索引来提需求视图和寄托有关数据项的职分的消息,那样做的补益是,模型之外的对象不要求通晓底层的多寡存款和储蓄格局;
  • 数量项通过行号、列号以至父项四个坐标实行稳固;
  • 模型索引由模型在别的组件(视图和嘱托)请求时才会被创建;
  • 一旦利用index()函数要求得到四个父项的可用索引,该索引会指向模型中这几个父项下边包车型客车数据项。那几个目录指向该项的一个子项;假若应用index()函数乞求拿到一个父项的不得用索引,该索引指向模型的最一级项;
  • 角色用于区分数据项的例外类其余数目。

上边回到前边我们已经见过的模型QFileSystemModel,看看怎样从模型获取数据。

 

 

1
2
3
QFileSystemModel *model = new QFileSystemModel;
QModelIndex parentIndex = model->index(QDir::currentPath());
int numRows = model->rowCount(parentIndex);

在此个例子中,大家成立了QFileSystemModel的实例,使用QFileSystemModel重载的index()得到索引,然后选取rowCount()函数总计当前目录下有多少多少项(也便是行数)。前边一章中乱七八糟的代码,以今后生可畏度优质清楚了。

为简易起见,上边大家只关怀模型第一列。大家遍历全数数据,获得第一列索引:

 

 

1
2
for (int row = 0; row < numRows; ++row) {
    QModelIndex index = model->index(row, 0, parentIndex);

我们利用index()函数,第一个参数是每生机勃勃行行号,第2个参数是
0,也正是率先列,第三个参数是
parentIndex,也正是当前目录作为父项。大家能够利用模型的data()函数获取每风流倜傥项的数据。注意,该函数再次来到值是QVariant,实际是二个字符串,因而我们平昔调换到QString

 

 

1
2
3
    QString text = model->data(index, Qt::DisplayRole).toString();
    // 使用 text 数据
}

上边的代码片段展现了从模型获取数据的后生可畏部分有效的函数:

  • 模型的数码消息能够通过rowCount()columnCount()拿到。那个函数必要制定父项;
  • 目录用于访谈模型中的数据。咱们需求动用行号、列号以致父项几个参数来拿到该索引;
  • 当大家应用QModelIndex()始建三个空索引使用时,大家获取的便是模型中最一流项;
  • 数量项富含了分化角色的多少。为获取一定剧中人物的多寡,必须钦赐这些角色。
  •  
标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图