在QListView中添加radiobutton
创始人
2024-07-31 17:40:28
0

QListView中添加radiobutton,用到了model/view结构,那么首先我们先对他有个了解。Model-View-Controller(MVC),是从Smalltalk发展而来的一种设计模式,常被用于构建用户界面。经典设计模式的著作中有这样的描述:

MVC 由三种对象组成。Model是应用中的的程序对象,View是它的屏幕表示,Controller定义了用户界面如何对用户输入进行响应。在MVC之前,用户界面设计倾向于三者揉合在一起,MVC对它们进行了解耦,提高了灵活性与重用性。

假如把view与controller结合在一起,结果就是model/view结构。这个结构依然是把数据存储与数据表示进行了分离,它与MVC都基于同样的思想,但它更简单一些。这种分离使得在几个不同的view上显示同一个数据成为可能,也可以重新实现新的view,而不必改变底层的数据结构。为了更灵活的对用户输入进行处理,引入了delegate这个概念。它的好处是,数据项的渲染与编程可以进行定制。

其实这个MVC模式,model进行数据的访问与处理,view提供显示,而delegate则负责进行item的render,Qt中在使用的时候,如下

 1、 Create a existing model

    QDirModel *model = new QDirModel;

2 、Create the list view

QListView *list = new QListView(…);

3、 Display the item

list->setModel(model); 

4 、Create a existing model

QDirModel *model = new QDirModel;

5、 Create the list view

QListView *list = new QListView(…);

6、 Display the item

list->setModel(model);

至于与delegate的关联,我们可以用list->setItemDelegate(new QItemDelegate());

在QListView中,如果我们要使用一个check box,我们可以直接在model类中data函数处理

  1. QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const   
  2.   {  
  3.       if(role == Qt::CheckStateRole)  
  4.        {  
  5.              return true;   
  6.        }  
  7.       .......  
  8.   } 

这样在QListView中就可以显示出勾选的check box,但是如果需要进行radio button的显示,我们还需要进行一些相关处理。

在QItemDelegate中,有一个drawCheck函数

  1.     virtual void drawCheck ( QPainter * painter, const QStyleOptionViewItem & option, const  QRect & rect, Qt::CheckState state ) const  
  2.     {  
  3. if (!rect.isValid())  
  4.         return;  
  5.        QStyleOptionViewItem opt(option);  
  6.       opt.rect = rect;  
  7.        optopt.state = opt.state & ~QStyle.:State_HasFocus;  
  8.        switch (state) {  
  9.        case Qt::Unchecked:  
  10.           opt.state |= QStyle.:State_Off;  
  11.           break;  
  12.        case Qt::PartiallyChecked:  
  13.           opt.state |= QStyle.:State_NoChange;  
  14.           break;  
  15.        case Qt::Checked:  
  16.           opt.state |= QStyle.:State_On;  
  17.           break;  
  18.        }  
  19.        QApplication::style()->drawPrimitive(QStyle.:PE_IndicatorViewItemCheck, &opt, painter);  
  20.     } 

该函数实现了check box的绘制,对于qt来说,check box与radio button在某些方面来说是一样的,只是在各自的样式上面的有点不一样,也就是对于style的绘制不一样,于是参考qt中QStyle类,使用QStyle.:PE_IndeicatorRadioButton进行重新绘制,就可以变成radio button样式

QApplication::style()->drawPrimitive(QStyle.:PE_IndicatorRadioButton, &opt, painter);

于是我们重写一个drawRadio函数,与drawCheck一样,就是***一句使用上面处理。

然后我们重写delegate相关paint函数,

  1. void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const  
  2.   {  
  3.           QRect checkSpace;     //the rect for draw check    
  4.           int isCheck = index.model()->data(index, Qt::CheckStateRole).toInt();   //get the index item's check state  
  5.               if(isCheck)  
  6.              drawRadio(painter, option, checkSpace, Qt::Checked);  
  7.                else               
  8.               drawRadio(painter, option, checkSpace, Qt::Unchecked);  
  9.                      ... ...     //draw others like display role, decroration role        
  10.    } 

小结:关于在QListView中添加radiobutton的内容就介绍到这里,Model-View-Controller(MVC),是从Smalltalk发展而来的一种设计模式,常被用于构建用户界面。想必你因该了解了MVC结构了吧!

【编辑推荐】

浅谈Qt中多线程编程

Qt环境变量配置与安装

从新手到老手之Qt学习历程

Spring3.0.5 MVC—异常处理

详解ASP.NET MVC 3新的Layout布局系统

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...