在QListView中添加radiobutton

移动开发
Qt 4推出了一组新的item view类,它们使用model/view结构来管理数据与表示层的关系。这种结构带来的功能上的分离给了开发人员更大的弹性来定制数据项的表示,它也提供一个标准的model接口,使得更多的数据源可以被这些item view使用。

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布局系统

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-08-02 11:07:00

2009-07-06 15:19:13

webwork ser

2023-01-18 17:22:38

YAML注释Linux

2011-06-28 14:27:38

Qt Qt For Sym

2013-11-28 14:06:04

Ubuntu技巧用户

2011-07-21 15:49:27

iPhone 模拟器 视频

2019-05-23 10:11:39

Python编程语言singledispa

2012-06-13 09:05:46

谷歌Chrome离线应用

2009-07-17 13:45:16

WinCE开始菜单

2022-03-03 13:22:52

LinuxKDE PlasmaKDE

2018-04-08 11:10:45

GitLinux开源

2011-03-22 10:57:30

Oracle添加用户赋权

2020-06-22 10:33:52

云计算边缘计算IT

2022-11-03 11:19:22

2009-09-11 11:39:23

C# RadioBut

2011-08-18 17:32:55

iPhone开发Table Cell

2023-09-12 15:39:07

WASIXprocessZig

2009-07-21 12:24:01

Scala先决条件添加字段

2011-03-03 10:04:28

PureFTPdmysql

2023-10-18 11:01:07

GNOME按钮
点赞
收藏

51CTO技术栈公众号