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

  • 2015-09-22 16:48
  • 1.82MB
  • 下载

ListView+radioButton实现每行单选

有时候我们需要制作自定义的单选列表,但是会遇到一些问题,比如多选,假选问题,所以网上找了找资料,整理一个demo出来,贴一下代码: <ListView android:id="@+id...

在ListView的Item中使用RadioButton实现单选

有时候要先上面的功能,listview的条目不光可以选择而且还要显示其他的信息,这个就需要两种方式进行监听,radiobutton实现单选,并且根据选择的item,知道选择的信息的核心代码如下: ...

listview中radiobutton的选择问题

程序效果: 点击一整行,更换radiobutton选择。 xml代码: [java] view plaincopy "1.0" ...

android开发过程中遇到的一些问题(包括自定义ProgressBar, Intent, Animation, ListView, RadioButton)

问题如下: 1.在自定义的ListView中,在一个Item中同时添加图片、文字、单选按钮时很困难。 最简单的解决办法(网上摘录): 把单选按钮用图片表示即可,然后使用SimpleAdapter...

android标题栏RadioButton实现,下面展示切换viewpager,fragment,内容是listview

功能:标题栏用RadioGroup,RadioButton来实现,下面的展示由viewpager和fragment组合实现,内容为listView。 下载整个项目代码,可到我的资源页下载:http:...

listview中的radiobutton实现单选的两种方式而且可以控制另一控件button的是否可见

项目需要,listview中,每行有radioButton和textview,button等控件,实现单选且选中的那一行显示button控件。话不多说,看关键代码,注释详细 方法一:利用ma...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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