首页 > 编程知识 正文

qtreeview样式表,qt树形控件和列表的结合

时间:2023-05-05 23:46:02 阅读:19521 作者:4813

简而言之,我没有专门研究Qt。 只是,写小项目时遇到问题的时候,为了解决这个问题,特意学习了QTreeView的知识点。 本人的目的是实现显示网络数量的拓扑图。 简而言之,就是实现树结构的链表。 与二叉树相比,二叉树发现一个节点的最近子节点只有两个:左子节点和右子节点。 但是,我的需求在每个节点上可以有0个或更多节点,所以我在寻找问题解决方案时偶然看到了QTreeView。 因为自己图形界面的实现只学习了Qt的基础,所以决定用它。 下图是本人写分项目的结果。

学习心得:我们在Qt designer下将其拖到此表单树视图中

然后需要模型对象QStandardItemModel。 必须在初始化时将此对象导入到TreeView表单中,同时包含此对象的头文件。 示例:

模型=newqstandarditemmodel (ui-treeview; //在导入创建模型UI-treeview-setmodel(model )的//模型时,每个列的标签都应该位于头部。 实现方法如下。

model-sethorizontalheaderlabels (QStringLiteral )项目名称(QStringLiteral )相关信息1 ) qstring literal )相关信息此时

如果尝试将第一个条目添加到强保温杯,则需要QStandardItem对象。 实现代码如下:

qtandarditem * item=newqstandarditem (tr ) ) itemone ); //条目对象从创建model-appendrow(item )的//模型对象添加此条目时:

向QStandardItemModel模型对象添加条目的函数也有其他方法。 函数的原型是voidqstandarditemmodel 33603360 setitem (introw、int column、QStandardItem *item )或voitem

下面的示例从上面的代码中添加测试代码。

模型设置(0,0,newqstandarditem (tr ) ) itemtwo ) ); 模型设置(2,0,newqstandarditem (tr ) ) itemthree ) ); 结果如下

原始item one不再存在,因为上一个setitem (0,0,** )的位置正好是索引的第0行第0列,所以占用了item one。 因为item three的索引是第三行第零列,所以item two和item three之间每隔一行。

如果希望在item two条目下播放子条目,请使用item two对象添加子条目,而不是添加子条目而不是model。 函数也是appendRow,也可以使用setChild函数。 上述实现表明,本人使用的是匿名对象设置条目。 例如,假设您想要获取一个名为item two的条目对象。 如果知道item two的行号为0行,则可以进行model-item(0)。 获取对象并向该对象添加子条目。 实施示例如下:

模型- item (0) -应用行(newqstandarditem (tr ) ) itemfour ) ); 效果如下。

假设您只是有item two条目,但不知道行号。 我在函数实现中搜索了那个对象。 此函数的原型如下:

qistqstandarditem * qstandarditemmodel :3360 find items (constqstringtext,Qt : matchflagsflags=Qt 33603360 mat ccch

此函数的返回值是list链表,因此可以通过遍历每个对象来获取。 此链表的长度为1,因为上面的历史记录中只有一个item two。 实施参考如下:

qistqstandarditem * list=模式查找项(tr ) (itemtwo ); for(intI=0; ilist.length (; I ) qdebug(tr ) ' listhas ' ).append (list.at ) I )-text ) ); //打印此条目的文本}效果在调试终端上显示如下:

搜索item four时,它是条目的子条目,这意味着item four是item two的子条目,因此调用的对象是条目对象而不是model对象。 原理与model类似,QStandardItem对象中的常见函数如下:

标准日期*标准日期

m::child(int row, int column = 0) 返回子条目列中的某行或某行某列的一个条目,model的函数是Item。bool QStandardItem::hasChildren() 判断返回是否有子条目,model的函数是hasItemint QStandardItem::rowCount() 返回有多少个子条目

int QStandardItem::row() const返回该条目所在父条目的行号

QStandardItem *QStandardItem::parent() const返回父条目对象

 接下来如果想在item two后面第二列即相关信息1或相关信息2列那添加条目,综合上述的代码添加最下几行代码如下:

model = new QStandardItemModel(ui->treeView);ui->treeView->setModel(model);model->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("项目名")<<QStringLiteral("相关信息1")<<QStringLiteral("相关信息2"));QStandardItem * item = new QStandardItem(tr("item one"));model->appendRow(item);model->setItem(0,0,new QStandardItem(tr("item two")));model->setItem(2,0,new QStandardItem(tr("item three")));model->item(0)->appendRow(new QStandardItem(tr("item four")));QList<QStandardItem*> list = model->findItems(tr("item two"));/*以下是添加部分*/for(int i = 0;i<list.length();i++)//list.length在本历程中返回值是 1 ,故只遍历一次{ //item变量指向这个Item two这个对象 QStandardItem* item = list.at(i); /*参数1:item-row()是获取在上一级model或条目下自己所在的行号 参数2: 1 是第1列,从第0列开始计数,故是相关信息1下的条目列 参数3: 是创建一个对象,文本信息是item two msg*/ model->setItem(item->row(),1,new QStandardItem(tr("item two msg")));}

效果如下:

 若要在item four的的位置后面添加相关信息1,思路首先是获取item four这个条目对象,既然要获取item four这个对象,前提又要获取去item two这个条目对象,那如果不知item two的位置,因此用数据结构的思路写一个查询函数的代码,实现如下:

QStandardItem *Widget::getItem(QStandardItemModel *model, QString s){ QStandardItem *getitem = NULL; if(!model->hasChildren())//判断是否有孩子,没有则返回0 return NULL; QList<QStandardItem*> list = model->findItems(s); qDebug() << tr("list is %1").arg(list.length()); if(list.length() == 0)//如果链表长度为0,即没找到文本为s的条目 { //将搜索子条目是否存在文本为s的条目 for(int i = 0;i < model->rowCount()&& getitem == NULL;i++)//遍历model下的所有条目,如果getitem有获得对象,则退出循环 { getitem = getItem(model->item(i),s);//寻找第i行条目下的子条目列中是否存在文本为s的条目。 } } else { return list.at(0); } return getitem;}QStandardItem *Widget::getItem(QStandardItem *item, QString s){ if(item == NULL) return NULL; qDebug() << tr("fine %1").arg(item->text()); QStandardItem *getitem = NULL; if(item->text().compare(s) == 0) return item; if(!item->hasChildren())//判断是否有孩子,没有则返回0 return NULL; for(int i = 0;i < item->rowCount() && getitem == NULL;i++)//遍历item下所有子条目,若果getitme有获得对象,则退出循环 { QStandardItem * childitem = item->child(i); getitem = getItem(childitem,s);//寻找这个子条目的所有子条目是否存在文本为s的条目。 } return getitem;}

两个函数的关系是重载关系,参数不同,以实现递归查找,注意所有项目名条目中不能有两个或两个以上的相同的文本,不然以上函数只能返回其中一个最先找的文本为s的条目对象。如要找到多个s,则返回的对象应该是个链表,如有兴趣大家自己去实现吧。

测试一下用例,代码如下:

QStandardItem * getitem = getItem(model,tr("item four"));getitem->parent()->setChild(getitem->row(),1,new QStandardItem(tr("item four msg")));

效果如下:

分析结果该函数实现过程正常。 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。