我们可以把这个类理解成一个表格,表格内容为String,该表格的行可以任意添加,但是列是指定的。比如我们新建一个3列的表格,并且添加表格列的名称
m_pRoomModel=newQStandardItemModel(0,3);//row参数无关紧要,setItem时会自动增加
m_pRoomModel->setHeaderData(0,Qt::Horizontal,tr("编号"));m_pRoomModel->setHeaderData(1,Qt::Horizontal,tr("名称"));
m_pRoomModel->setHeaderData(2,Qt::Horizontal,tr("优先级"));
然后我们可以把向这个Model中加item,并把这个Model显示出来,比如:
ui->treeViewRoom->setModel(m_pRoomModel);这就是在一个treeview中显示出来,我们还可以用其他方式显示出来。
然后我们还可以每次向m_pRoomModel加item时都可以在treeview中显示出来。
QStandardItem*pItem=newQStandardItem(QString::number(pRoom->getRoomIdx()));
m_pRoomModel->setItem(row,TREEVIEW_COL_ROOMIDX,pItem);
注意pitem的内容一定是字符串。
我们可以用QStandardItemModel去负责显示的数据:如
m_pRoomModel=newQStandardItemModel(0,3);
ui->treeViewRoom->setModel(m_pRoomModel);
这就是用treeview把QModelQStandardItem内容显示出来。
说明:在该QStandardItemModel中的数据都是String类型,显示出来的列是我们自己在QtreeView中委托的显示类型,一般默认为编辑框,我们可以自己委托成下拉框,只读框等等。比如:
ui->treeViewRoom->setItemDelegateForColumn(\
TREEVIEW_COL_ROOMPRIO,newComboBoxDelegate(this));
设置成下拉框。
因为一般显示出来的值都有一个与之对应有实际意义的程序内部变量,那么我们如何把显示的值和内部变量联系起来,就要通过下述办法:
如果我们在界面修改了相应的显示内容,Model中的数据会更改(前提是可以修改),那么我们可以把model中的数据更改信号和TreeView中的相应槽函数联系起来,负责把界面数据传送到程序内部的数据中(不是显示的数据,这一点我们得弄清楚,显示是有专门的数据负责的)。比如:
connect(m_pRoomModel,SIGNAL(dataChanged(QModelIndex,QModelIndex)), \
this,SLOT(slotRoomPrioChanged(QModelIndex,QModelIndex)));
然后因为要传送数据,就得从model中提取数据,如何把我们需要的数据从model中取出来:可以用m_pRoomModel->index(row,col).data().to…,最后的to后面可以跟你想要的类型,可以是整型或者String等等,row代表值所在行,col代表lie。比如
introomIdx=m_pRoomModel->index(row,TREEVIEW_COL_ROOMIDX).data().toInt();
总结:QTreeView显示数据可以指定为从QStandardModel中读取,而QStandardModel中的内容也会因为QTreeView中的显示数据更改而更改。相当于QStandardModel是QTreeView的数据支持!!!
ui->treeViewRoom->setItemDelegateForColumn(\
TREEVIEW_COL_ROOMPRIO,newComboBoxDelegate(this));
ui->treeViewRoom->setItemDelegateForRow(\
TREEVIEW_COL_ROOMIDX,newReadOnlyDelegate(this));
我们可以理解成把某列或者某行设置成我们想要显示的风格,然后具体怎么显示则由
函数中第二个参数(委托对象)去负责,我们不用管。在添加Item时,显示工作和显示的数据传输都由该对象负责。这样就为我们屏蔽了一些复杂工作。
具体是如何显示的个人结合代码猜想是:每当我们双击QTreeView显示内容时:我们便可以看到我们委托的显示。所以在双击QTreeView显示内容时肯定发射了信号,QTreeView的槽函数接收到了信号,然后调用了我们委托对象的一些设置和显示函数,在委托对象中读取QTreeView背后的model的数据来显示,然后如果在委托对象中修改了数据也会更新到model中。具体如何调用我们没有底层的代码,尚不知晓!!!在Model中如果更新了数据也会触发数据更改信号。
总结:我们可以这样理解:QStandardItemModel是显示的数据源,而具体如何显示它其中的内容我们可以任意指定,可以是QTreeView或者QListView或者QTableView
在这些View中我们还可以指定某行或者某列为一种我们自己指定的显示方式,这叫做委托。而数据的传输核心则是QStandardItemModel