ChatGPT解决这个技术问题 Extra ChatGPT

Qt。获取 QString 的一部分

当我知道必要的索引时,我想从另一个 QString 获取 QString。例如:主字符串:“这是一个字符串”。我想从前 5 个符号创建新的 QString 并获得 "This"
输入: 第一个和最后一个字符数。
输出: 新的QString

如何创建它?

PS 不仅是前几个字母,还有从行的中间,例如从 5 到 8。


α
αλεχολυτ

如果您不需要修改子字符串,则可以使用 QStringRefQStringRef 类是现有 QString 的只读包装器,它引用现有字符串中的子字符串。这比创建一个新的 QString 对象来包含子字符串提供了更好的性能。例如

QString myString("This is a string");
QStringRef subString(&myString, 5, 2); // subString contains "is"

如果您确实需要修改子字符串,那么 left()mid()right() 将满足您的需求...

QString myString("This is a string");
QString subString = myString.mid(5,2); // subString contains "is"
subString.append("n't"); // subString contains "isn't"

在您的第二个示例中,您可以执行以下操作: QStringRef subString = myString.midRef(5,2);
请注意,使用 QStringRef 是一种具有额外复杂性的优化。除非您正在执行繁重的字符串操作,并且您实际上会从优化中受益(在大多数情况下,您不会),否则使用 QString 会更安全、更简单。
但是当我想将 qlabel 用作文本时,我必须将其转换为 QString?或者有没有办法直接使用QStringRef?
@this.lau_ 我记得 Java 子字符串在默认情况下都是这样工作的,但后来在看到一些大字符串的小子字符串阻止大字符串被垃圾收集的情况后,他们摆脱了这种行为。
@Andy,在Qt中行为略有不同 - QStringRef 引用的 QString 可能会被删除,在这种情况下 QStringRef 变得无效。这就是为什么额外的复杂性通常是不值得的。引用文档:We suggest that you only use this class in stable code where profiling has clearly identified that performance improvements can be made by replacing standard string operations with the optimized substring handling provided by this class.
l
laurent

使用 left 函数:

QString yourString = "This is a string";
QString leftSide = yourString.left(5);
qDebug() << leftSide; // output "This "

如果您想要更多控制权,还可以查看 mid()