radiobutton在listview中处理

原创 2007年09月28日 14:22:00

最近一直在使用Qt中的Model / View 进行编程。

首先介绍一下 Model / View的使用,参考http://doc.trolltech.com/4.2/model-view-programming.html

The model/view architecture

The model communicates with a source of data, providing an interface for the other components in the architecture. The nature of the communication depends on the type of data source, and the way the model is implemented.

The view obtains model indexes from the model; these are references to items of data. By supplying model indexes to the model, the view can retrieve items of data from the data source.

In standard views, a delegate renders the items of data. When an item is edited, the delegate communicates with the model directly using model indexes.

有图中我们可以知道,其实这个MVC模式差不多,model进行数据的访问与处理,view提供显示,而delegate则负责进行item的render,并且在Qt中,已经为我们提供了很多写好的常用class,使得我们能够很好的拿来使用。如 QAbstractListModel, QDirModel, QListView, QTreeView, QItemDelegate。而在使用的时候,如下

 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);  

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);
  
  至于与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;
        opt.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     
                    
     } 
  
  这样就能狗绘制一个radio button, 这是我目前发现的一种方法,不知道还有没其他办法。

  至于check box与radio button怎么处理,参考qt相关开源代码就可以了,以后如果有时间在补上。

Android之ListView包含RadioButton的单选问题解决办法

1.最简洁的解决办法。 get
  • FastThinking
  • FastThinking
  • 2014年11月11日 17:48
  • 10824

Android开发:在ListView中使用RadioGroup时出现混乱选中现象

重写Adapter的getView方法(); 设置每个item中RadioGroup的监听器(viewHolder.answerRg.setOnCheckedChangeListener...
  • yaya_soft
  • yaya_soft
  • 2014年05月07日 08:54
  • 8123

Listview中设置了Radiogroup\radiobutton,有些没被选中的item项也被选中的Bug的解决方法

在监听之前首先把监听器设置为空viewHolder.radioGroup.setOnCheckedChangeListener(null);下一步还要将没选中的radiobutton就.radioGr...
  • qq_18581651
  • qq_18581651
  • 2015年11月25日 14:28
  • 444

ListView Item里面含有RadioButton、CheckBox、星星、EditText控件

  • 2016年11月12日 21:09
  • 22.39MB
  • 下载

listView清空

sellectList.clear();//清除 listphoneAdapter.notifyDataSetChanged();//刷新一遍List
  • zhouxuebao87
  • zhouxuebao87
  • 2014年10月24日 09:43
  • 353

去掉RadioButton前面的小圆圈的两种方法

1、在布局文件中: android:button=”@null” 2、在代码文件中:Bitmap a=null; typeBtn.setButtonDrawable(new B...
  • Shirly_YY
  • Shirly_YY
  • 2017年03月10日 16:11
  • 756

Listview里嵌套radiobutton,默认只有一个可以被选中

1、item布局 xml version="1.0" encoding="utf-8"?> LinearLayout xmlns:android="http://schemas.android.co...
  • gaojing694855420
  • gaojing694855420
  • 2016年12月30日 08:49
  • 576

ListView中item只能选择一项的做法,ListView与radioButton结合使用

ListView中item只能选择一项的做法,ListView与radioButton结合使用,只需要adapter设置一下即可 :      public class MainCategory...
  • u010753376
  • u010753376
  • 2015年11月26日 09:44
  • 629

Android开源项目分类汇总

Android 开源项目源码解析(Volley、UIL、Dagger、EventBus、xUtils 等分析) Android 职位内部推荐(阿里、百度、美团、点评、魅族等) code...
  • BianChengNinHao
  • BianChengNinHao
  • 2015年06月25日 10:37
  • 846

Android开源项目--分类汇总

转自:https://github.com/Trinea/android-open-project Android开源项目第一篇——个性化控件(View)篇   包括ListView、Ac...
  • StoneNotes
  • StoneNotes
  • 2015年04月12日 00:01
  • 536
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:radiobutton在listview中处理
举报原因:
原因补充:

(最多只允许输入30个字)