在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函数处理
- QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
- {
- if(role == Qt::CheckStateRole)
- {
- return true;
- }
- .......
- }
这样在QListView中就可以显示出勾选的check box,但是如果需要进行radio button的显示,我们还需要进行一些相关处理。
在QItemDelegate中,有一个drawCheck函数
- virtual void drawCheck ( QPainter * painter, const QStyleOptionViewItem & option, const QRect & rect, Qt::CheckState state ) const
- {
- if (!rect.isValid())
- return;
- QStyleOptionViewItem opt(option);
- opt.rect = rect;
- optopt.state = opt.state & ~QStyle.:State_HasFocus;
- switch (state) {
- case Qt::Unchecked:
- opt.state |= QStyle.:State_Off;
- break;
- case Qt::PartiallyChecked:
- opt.state |= QStyle.:State_NoChange;
- break;
- case Qt::Checked:
- opt.state |= QStyle.:State_On;
- break;
- }
- QApplication::style()->drawPrimitive(QStyle.:PE_IndicatorViewItemCheck, &opt, painter);
- }
该函数实现了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函数,
- void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
- {
- QRect checkSpace; //the rect for draw check
- int isCheck = index.model()->data(index, Qt::CheckStateRole).toInt(); //get the index item's check state
- if(isCheck)
- drawRadio(painter, option, checkSpace, Qt::Checked);
- else
- drawRadio(painter, option, checkSpace, Qt::Unchecked);
- ... ... //draw others like display role, decroration role
- }
小结:关于在QListView中添加radiobutton的内容就介绍到这里,Model-View-Controller(MVC),是从Smalltalk发展而来的一种设计模式,常被用于构建用户界面。想必你因该了解了MVC结构了吧!
【编辑推荐】