QTableView中嵌入复选框CheckBox

来源:互联网 发布:sap 供应商主数据查询 编辑:程序博客网 时间:2024/05/01 09:05

       第二种方法:设置QAbstractTableModel的flags()函数法
        通过Delegate创建QCheckBox来实现的Check列,只有在该列进入编辑模式时才能够Check/Uncheck。这显然不是我们想要的,网上翻来翻去,在一个国外论坛中看到了无需Delegate的实现方法,只需重写Model即可:

主要是修改两个函数:
//设置某一列为可选角色,绘画出QCheckBox
Qt::ItemFlags flags(const QModelIndex &index) const; 
//根据界面选择QCheckbox,修改Model中的数据
 bool setData(const QModelIndex &index, const QVariant &value, int role);

Cpp代码  收藏代码
  1. 2.在StudentInfoModel .h头文件中的主要代码:  
  2. class StudentInfoModel : public QAbstractTableModel   
  3. {  
  4.     Q_OBJECT  
  5. public:  
  6.     StudentInfoModel(const int totalColumn, const int aColumnNumWithChechBox = 0, QObject *parent = 0)  
  7.     :totalColumn(totalColumn),colNumberWithCheckBox(aColumnNumWithChechBox),  
  8.       
  9.     QAbstractTableModel(parent) {rowCheckStateMap.clear();};  
  10. public:  
  11.     int rowCount(const QModelIndex &parent = QModelIndex()) const;  
  12.     int columnCount(const QModelIndex &parent = QModelIndex()) const;  
  13.     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;  
  14.     QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;  
  15.     Qt::ItemFlags flags(const QModelIndex &index) const;  
  16.     bool setData(const QModelIndex &index, const QVariant &value, int role);  
  17.   
  18.   
  19. public:  
  20.     void AddStudentInfo(const StudentInfo &studentInfo);  
  21.   
  22.   
  23.     signals:  
  24.     void StudentInfoIsChecked(const StudentInfo &studentInfo);  
  25.   
  26.   
  27. private:  
  28.     typedef QVector<StudentInfo> StudentInfos;  
  29.     StudentInfos studentInfos;  
  30.     int totalColumn;  
  31.     int colNumberWithCheckBox;  
  32.     QMap<int, Qt::CheckState> rowCheckStateMap;  
  33. };  
  34.   
  35.   
  36. 3.在StudentInfoModel.cpp文件中的主要代码如下:  
  37. QVariant StudentInfoModel::data( const QModelIndex &index, int role ) const  
  38. {  
  39.     if (role == Qt::DisplayRole)   
  40.     {   
  41.         if (index.column() == 0)   
  42.             return QString::number(index.row()+1);   
  43.         if (index.column() == 1)   
  44.             return studentInfos[index.row()].stuNumber;   
  45.         if (index.column() == 2)  
  46.             return studentInfos[index.row()].stuName;   
  47.         if (index.column() == 3)  
  48.             return studentInfos[index.row()].stuID;   
  49.         if (index.column() == 4)  
  50.             return studentInfos[index.row()].stuPhoneNumber;  
  51.         if (index.column() == 5)   
  52.             return studentInfos[index.row()].department;   
  53.         if (index.column() == 6)   
  54.             return studentInfos[index.row()].stuDescription;   
  55.     }   
  56.     if (role == Qt::CheckStateRole)   
  57.     {   
  58.         if (index.column() == colNumberWithCheckBox)   
  59.         {   
  60.             if (rowCheckStateMap.contains(index.row()))   
  61.             return rowCheckStateMap[index.row()] == Qt::Checked ? Qt::Checked : Qt::Unchecked; return Qt::Unchecked;   
  62.         }   
  63.     }   
  64.     return QVariant();  
  65. }  
  66.   
  67.   
  68. Qt::ItemFlags StudentInfoModel::flags( const QModelIndex &index ) const  
  69. {  
  70.     if  
  71.     (!index.isValid())  
  72.     return 0;  
  73.   
  74.   
  75.     if (index.column() == colNumberWithCheckBox)  
  76.     return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;  
  77.   
  78.   
  79.     return  Qt::ItemIsEnabled | Qt::ItemIsSelectable;  
  80. }  
  81.   
  82.   
  83. bool StudentInfoModel::setData( const QModelIndex &index, const QVariant &value, int role )  
  84. {  
  85.     if(!index.isValid())  
  86.         return false;  
  87.     if (role == Qt::CheckStateRole && index.column() == colNumberWithCheckBox)  
  88.     {  
  89.         if (value == Qt::Checked) //  
  90.         {  
  91.             rowCheckStateMap[index.row()] = Qt::Checked;   
  92.             if(studentInfos.size() > index.row())  
  93.             emit StudentInfoIsChecked(studentInfos[index.row()]);  
  94.         }  
  95.         else  
  96.         {  
  97.             rowCheckStateMap[index.row()] = Qt::Unchecked;  
  98.         }   
  99.     }  
  100.     return true;  
  101. }  
 
 
 
0 0
原创粉丝点击