QtModelView教程应用举例

心系山区北京中科医院温情相伴 http://m.39.net/pf/a_6739268.html

上次和大家分享了QtModel/View只读表的方法,简单回顾下:

因为是为一个Table设置Model,为了快速入门,我们选择继承QAbstractTableModel。继承后需要重写三个函数,分别是Model的行数和列数、以及每个Cell需要显示的内容。

这次和大家分享QtModel/View教程的几个其他例子。

一、使用Roles属性扩展只读Table

怎么扩展?扩展些什么?

上次的实例中我们是在role==Qt::DisplayRole时进行的显示,那么扩展时是不是有其他Roles属性?

具体扩展的内容,是不是也根据这些Roles呢?答案是肯定的。

无需更改其他任何内容即可设置字体,背景色,对齐方式和复选框等属性,其他属性可请参阅Qt名称空间文档以了解有关QtItemDataRole枚举功能的更多信息。

在上次的程序基础上添加BackgroundRole属性,如下:

caseQt::BackgroundRole:

if(row==1col==2)//changebackgroundonlyforcell(1,2)

returnQBrush(Qt::red);

break;

效果如下

这里面值得注意的是调用data()函数的频率,具体可打印效果进行查看,一次可以判断使用分离的模型如何影响应用程序的性能。还有就是当鼠标悬浮在Cell时,都会对data()进行调用。

二、在Cell中显示时钟

回顾之前的操作,View都是自动将数据与属性显示出来的,并且在特定条件下进行“更新显示”,如将鼠标悬浮在Cell上时;那么我们如何主动让Model更新数据呢——Model可以接收数据变化的信号,从而进行响应。Ok,下面看具体的例子:

接下来扩展的是在单元格中每个一秒显示一次当前的时间。

我们要考虑的几个问题:

如何产生一个更新时间的计数器?

如何将信号发送给Model进行更新?

直接看代码:

①使用QTimer进行计数,溢出时响应如下:

voidMyModel::slot_updateTime()

{

QModelIndextopLeft=createIndex(0,0);

emitdataChanged(topLeft,topLeft);

}

将具体的Cell信息发送出去即可。

②DisplayRole属性设置

introw=index.row();

intcol=index.column();

if(role==Qt::DisplayRole)

{

if(row==0col==0)

{

returnQTime::currentTime().toString();

}

}

效果如下:

小结:本次主要和大家分享一下data()函数中其他属性的应用以及如何通过信号更新Cell数据。下次和大家分享下在Model中如何设置行列标题以及如何设置Table的可编辑属性。

学不可以已,积少成多!



转载请注明:http://www.abuoumao.com/hyfz/4427.html

网站简介| 发布优势| 服务条款| 隐私保护| 广告合作| 网站地图| 版权申明

当前时间: 冀ICP备19029570号-7