Qt编程 treeWidge->findItems (),只能找到根节点,子节点找不到,怎么解决?或者用啥方法找到子节点?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt编程 treeWidge->findItems (),只能找到根节点,子节点找不到,怎么解决?或者用啥方法找到子节点?相关的知识,希望对你有一定的参考价值。

Qt编程
我用的是treeWidge控件,通过QTreeWidgetItem添加节点。
我想查找treeWidge中的某个节点,用到了treeWidget->findItems
( const QString &
text, Qt::MatchFlags flags, int column = 0 )
const QString &
text:这里我写的是要查找节点的全名
可是,如果是根节点是可以找到的,子节点就找不到了,这个怎么解决呢??和Qt::MatchFlags
flags有没有关系??

或者用什么方法可以找到任意位置的节点呢,前提是只知道节点的名字。
非常感谢

请您仔细看看文档。
在MatchFlags 中有MatchRecursive, 可以查找整个节点树。

仅需或一下MatchRecursive这个flag即可。

有问题HI~
参考技术A Qtreewidget::findItems 只能找到父节点,找不到子节点:
属性中配置: Qt::Matchcursive | Qt::Matchcontains
Qt::Matchcursive 表示 在整个目录树中匹配
Qt::Matchcontains表示包含匹配,如输入"n", 如果有 "input" "ntpserver"这些都可以匹配住

Python: 字符串搜索和匹配,re.compile() 编译正则表达式字符串,然后使用match() , findall() 或者finditer() 等方法

1. 使用find()方法

>>> text = ‘yeah, but no, but yeah, but no, but yeah‘

>>> text.find(‘no‘)
10

2. 使用re.match()

对于复杂的匹配需要使用正则表达式和re 模块。为了解释正则表达式的基本原理,假设想匹配数字格式的日期字符串比如11/27/2012 ,可以这样做:
>>> text1 = ‘11/27/2012‘
>>> text2 = ‘Nov 27, 2012‘
>>>
>>> import re
>>> # Simple matching: \d+ means match one or more digits
>>> if re.match(r‘\d+/\d+/\d+‘, text1):
... print(‘yes‘)
... else:
... print(‘no‘)
...
yes
>>> if re.match(r‘\d+/\d+/\d+‘, text2):
... print(‘yes‘)
... else:
... print(‘no‘)
...
no

3.将字符串预编译re.compile(),再match()

如果想使用同一个模式去做多次匹配,应该先将模式字符串预编译为模式对象。比如:
>>> datepat = re.compile(r‘\d+/\d+/\d+‘)
>>> if datepat.match(text1):
... print(‘yes‘)
... else:
... print(‘no‘)
...
yes
>>> if datepat.match(text2):

... print(‘yes‘)
... else:
... print(‘no‘)
...
no

4.使用findall()方法

match() 总是从字符串开始去匹配,如果你想查找字符串任意部分的模式出现位置,使用findall() 方法去代替。比如:
>>> text = ‘Today is 11/27/2012. PyCon starts 3/13/2013.‘
>>> datepat.findall(text)
[‘11/27/2012‘, ‘3/13/2013‘]

5. .group()方法去捕获分组


在定义正则式的时候,通常会利用括号去捕获分组。比如:
>>> datepat = re.compile(r‘(\d+)/(\d+)/(\d+)‘)
捕捕获分组可以使得后面的处理更加简单,因为可以分别将每个组的内容提取出来。
比如:
>>> m = datepat.match(‘11/27/2012‘)
>>> m
<_sre.SRE_Match object at 0x1005d2750>
>>> # Extract the contents of each group
>>> m.group(0)
‘11/27/2012‘
>>> m.group(1)
‘11‘
>>> m.group(2)
‘27‘
>>> m.group(3)
‘2012‘
>>> m.groups()
(‘11‘, ‘27‘, ‘2012‘)
>>> month, day, year = m.groups()

 >>> text
‘Today is 11/27/2012. PyCon starts 3/13/2013.‘
>>> datepat.findall(text)
[(‘11‘, ‘27‘, ‘2012‘), (‘3‘, ‘13‘, ‘2013‘)]
>>> for month, day, year in datepat.findall(text):
... print(‘{}-{}-{}‘.format(year, month, day))
...
2012-11-27
2013-3-13

6. 迭代方式返回finditer()

findall() 方法会搜索文本并以列表形式返回所有的匹配。如果你想以迭代方式返

>>> for m in datepat.finditer(text):
... print(m.groups())
...
(‘11‘, ‘27‘, ‘2012‘)
(‘3‘, ‘13‘, ‘2013‘)

核心步骤就是先使用re.compile() 编译正则表达式字符串,然后使用match() , findall() 或者finditer() 等方法。

7. 精确匹配

如果你想精确匹配,确保你的正则表达式以$ 结尾,就像这么这样:
>>> datepat = re.compile(r‘(\d+)/(\d+)/(\d+)$‘)
>>> datepat.match(‘11/27/2012abcdef‘)
>>> datepat.match(‘11/27/2012‘)
<_sre.SRE_Match object at 0x1005d2750>
>>>

8.简单的文本匹配/搜索

最后,如果你仅仅是做一次简单的文本匹配/搜索操作的话,可以略过编译部分,直接使用re 模块级别的函数。比如:
>>> re.findall(r‘(\d+)/(\d+)/(\d+)‘, text)
[(‘11‘, ‘27‘, ‘2012‘), (‘3‘, ‘13‘, ‘2013‘)]
>>>
但是需要注意的是,如果你打算做大量的匹配和搜索操作的话,最好先编译正则表达式,然后再重复使用它。模块级别的函数会将最近编译过的模式缓存起来,因此并会消耗太多的性能,但是如果使用预编译模式的话,将会减少查找和一些额外的处理损耗

 












































































以上是关于Qt编程 treeWidge->findItems (),只能找到根节点,子节点找不到,怎么解决?或者用啥方法找到子节点?的主要内容,如果未能解决你的问题,请参考以下文章

findit 1

Python: 字符串搜索和匹配,re.compile() 编译正则表达式字符串,然后使用match() , findall() 或者finditer() 等方法

QT 编程,关于QTableWidgetItem的问题

qt编程,两个QString的值呼唤。

为啥使用正则表达式 finditer() 而不是 findall()

findit WriteUp