m_treeSongCategoryWidget->setRootIsDecorated( false )//去掉虚线边框
m_treeSongCategoryWidget->setFrameStyle(QFrame::NoFrame) //去掉边框
m_treeWidget->setStyleSheet("QTreeView::branch {image:none}")//去掉子节点的虚框
在自定义的delegate中检查if(index.data(Qt::UserRole).toString() == "your value")的值,该值在QTreeWidget中要预先设定。这样就可以在让指定QTreeWidgetItem->setData(1, (Qt::UserRole), "your value")的QTreeWidgetItem使用相对应的delegate了.就在构造函数里面加上以下两行代码即可:
//根据内容自动设置列宽
ui->treeWidget->header()->setResizeMode(QHeaderView::ResizeToContents)
ui->treeWidget->header()->setStretchLastSection(false)
在解决完上述问题后,又遇到一个问题,就是用鼠标左键或者右键单击QTreeWidget里面的选项时,水平滚动条会自动跑到最左边,双击不会出现这个问题,详细查阅了QTreeWidget的实现代码,在其父类中有个事件处理函数void QAbstractItemView::timerEvent(QTimerEvent *event),加了一个滚动处理,这里真是有点晕了,它的注释就是“we only get here if there was no double click”,大家可以看下这里为什么要加这个滚动处理。
解决方法如下(我已经对QTreeWidget进行了二次封装,就直接在这上面改的,不封装照样可以实现,原理是一样的):
1.加两个变量,记录是否有选项被点击,一个记录点击时的水平滚动条位置
bool m_isItemClicked
int m_horizontalScrollBarPos
2.对两个事件进行处理
connect(ui->treeWidget->horizontalScrollBar(), SIGNAL(valueChanged(int)), this,SLOT(scrollbarchange(int)))
void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column)
{
m_isItemClicked = true
m_horizontalScrollBarPos = ui->treeWidget->horizontalScrollBar()->sliderPosition()
}
void MainWindow::scrollbarchange(int value)
{
if (m_isItemClicked)
{
ui->treeWidget->horizontalScrollBar()->setValue(m_horizontalScrollBarPos)
m_isItemClicked = false
}
}
开发环境:win10、QT5.9
开发工具:vs2019
1、根据搜索框的内容匹配下面的索引,找到则显示该字段及该字段的上下索引;
2、当找不到该内容则全都不显示;
3、部分字段匹配搜索,输入的字段与索引项存在部分匹配的时候则同样会显示该索引项及其父子索引项;
1、实现该界面
该界面包括一个QLineEdit控件和一个QTreeWidget控件。
//使用递归的方式向目标节点的父节点进行递归查找
void TableWidgwet::showParent(QTreeWidgetItem* pItem)
{
if (pItem != nullptr) //判断当前节点是否存在
{
QTreeWidgetItem* pTreeParentItem = pItem->parent()//获取当前节点的父节点
if (pTreeParentItem != nullptr) //判断父节点是否存在
{
pTreeParentItem->setHidden(false) //将该父级索引项设置为显示
showParent(pTreeParentItem)//直接传入处理过的节点
//避免传入该节点后递归后跳转到祖父节点
}
}
}
//使用递归的方式遍历子节点同时设置为显示
void TableWidgwet::showSon(QTreeWidgetItem* pItem)
{
int iChild = pItem->childCount() //获取该子节点的数目
for (int i = 0i <iChild++i)//遍历当前项的子节点并设置
{
pItem->child(i)->setHidden(false)
showSon(pItem->child(i))//对当前 子项进行递归
}
}
3、对当前的节点进行遍历查找且对遍历的节点进行显示和隐藏的设置
//依旧是采用递归的方式实现
void TableWidgwet::searchItem(QTreeWidgetItem* tableItem,QString&strText)
{
if (tableItem != nullptr)//防止野指针的问题
{
for (int i = 0i <tableItem->childCount()++i)
{
QTreeWidgetItem* pTreeItem = tableItem->child(i)
if (pTreeItem != nullptr)
{
//如何索引项字段部分匹配于输入框字段则设置该项及其父子项显示且展开
if (pTreeItem->text(0).contains(strText))
{
pTreeItem->setHidden(false)
pTreeItem->setExpanded(true);
showSon(pTreeItem)
showParent(pTreeItem)
}
else
{
pTreeItem->setHidden(true)//不匹配则隐藏
searchItem(pTreeItem, strText)//递归遍历
}
}
}
}
}
4、对整个树形索引控件的一级索引项进行遍历,并调用上述的函数实现对每个一级索引项下的索引项进行递归遍历设置
void TableWidgwet::showItem()
{
for (int i = 0i <ui.treeWidget->topLevelItemCount()++i)
{
if (ui.treeWidget->topLevelItem(i)->text(0).contains(ui.lineEdit->text()))
{
ui.treeWidget->topLevelItem(i)->setHidden(false)
}
else
{
ui.treeWidget->topLevelItem(i)->setHidden(true)
}
searchItem(ui.treeWidget->topLevelItem(i), ui.lineEdit->text())
}
}
5、使用connect对QLineEdit的textchange事件响应与槽函数绑定处理
connect(ui.lineEdit, &QLineEdit::textChanged, this, &TableWidgwet::showItem)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)