实现需求

我在项目中实现截取串口端口的功能,端口内容是

COM12 #Silicon Labs CP210x USB to UART Bridge 这种格式的,通过#隔开,中间还有空白字符.

需要拿到COM12的端口号.

函数说明

QT中,能实现上面的的方法有很多,其中最简单的的就是通过QString的section方法来实现.

section函数

1
QString QString::section ( QChar sep, int start, int end = -1, SectionFlags flags = SectionDefault ) const

start, end含义

start、end并非原字符串的索引,而是切分字符串后得到的字符串数组的索引。

例如:

“forename,middlename,surname,phone"按’,‘进行切分后,得到4个元素的字符串数组

1
list = {"forname", "middlename", "surname", "phone"} 

索引分别为0,1,2,3

  • 当start = 0, end = 0时,返回forname
  • 当start = 0, end = 1时,返回forname,middlename
  • 当start = 0, end = 2时,返回forname,middlename,surname
  • 当start = 0, end = 3时,返回forname,middlename,surname,phone
  • 当start = 1, end = 0时,返回middlename
  • 当start = 1, end = 1时,返回middlename,surname
  • 当start = 2, end = 2时,返回surname
  • 当start = 2, end = 3时,返回surname,phone

这个函数把字符串看成是几个块,这些块由 sep 分隔,start 和 end 指定块号,end 默认为 –1 ,返回的是[ start, end ]内的块组成的字符串,如果 start 和 end 都是负数,那么将从字符串的后面往前面数,返回 [ -end, –start ]内的块组成的字符串。

SectionFlags含义

是一些标记,如SectionSkipEmpty表示如果两个分隔符之间是空串,那么就会跳过。 具体由如下:

1
2
3
4
5
6
7
    enum SectionFlag {
        SectionDefault             = 0x00,
        SectionSkipEmpty           = 0x01,
        SectionIncludeLeadingSep   = 0x02,
        SectionIncludeTrailingSep  = 0x04,
        SectionCaseInsensitiveSeps = 0x08
    };

与split函数的区别

QString::section 可用来分隔字符串,与QString::split区别是:前者可只取指定范围的字符串内容,后者返回的是切分后的结果列表,包含所有切分结果字符串。

实例代码

1
2
3
4
     //串口端口不为空
        QString portName=strPortName.section('#',0,0).trimmed();//获取#号前面的端口号

        qDebug() << portName;

输入:

1
COM12 #Silicon Labs CP210x USB to UART Bridge

输出:

1
COM12