关于QString的一些使用记录

本文介绍了使用Qt进行界面设计的方法,包括页面初始化、信号槽连接等,并展示了如何通过Qt进行文件对话框的选择及文件列表的填充。同时,文中还涉及了正则表达式的应用以解析特定格式的字符串。
例子1

//初始化demo的窗口,以后要用,请将demopage重写 QList<CPageBase*> t_list; for(int i=0;i<12;i++) CPageDemo *p_demo = new CPageDemo(this); QString str = QString("Page %1").arg(i+1); p_demo->setPageName(str); p_demo->setButtonProperty(":/on_widgets/Resources/communication.png",str); m_pageMap.insert(p_demo->p_pageButton,p_demo); connect(p_demo->p_pageButton,SIGNAL(released()),this,SLOT(slotChangePage())); p_stacked->addWidget(p_demo); t_list.append(p_demo); }

    //转换成功返回"Y"否则返回"N"
    QString result_str = result?QString("%1").arg("Y"):QString("%1").arg("N");
    QTableWidgetItem *result_item = new QTableWidgetItem(result_str);
    ui->file_list->setItem(row_idx, 1, result_item);
例子2
QStringList files = QFileDialog::getOpenFileNames( thistr("选择文件"), ".""CPP Files (*.h *.cpp ) | Text Files (*.txt) | All Files (*.*)"); if(files.isEmpty()) returnfill_items(files); ui->file_list->resizeColumnsToContents();例子3QString fileName = rx.cap().remove("title mb-bg\" title=").remove(">"); 
rx.setPattern("<div class=\"cut_intro\" style=\"overflow:hidden;\">[^<]{1,1000}<"); rx.indexIn(str); QString fileInfo = rx.cap(0).remove("<div class=\"cut_intro\" style=\"overflow:hidden;\">").remove("<"); 
rx.setPattern("<div class=\"wraper-info\">.{1,1000}<ul class=\"tags-share\">"); rx.indexIn(str); QString content = rx.cap().remove("<div class=\"wraper-info\">").remove("<ul class=\"tags-share\">"); 
QString send = QString("<li>资源名: ") + fileName+"</li>" + QString("<li>资源简介:") + fileInfo+"</li>" + content; send.remove('\n'); 
rx.setPattern("http://download.net/index.php/source/do_download/[^\"]{1,100}\""); rx.indexIn(str); 
QString postUrl = rx.cap().remove("\""); 
例子3
//使用自定义的setlog函数 CHelp::setLog(QString("好吧,出现验证码了,您手动输入吧!!"));void CHelp::setLog(const QString content){ // 加锁 QMutexLocker locker(&m_Mutex); // 输出的日志前面添加时间QString str; QDateTime dateTime = QDateTime::currentDateTime(); str = dateTime.toString("hh:mm::s ");g_pLineEdit->append(str + content); // 产生随机数qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); QString rand = "http://download.net/index.php/rest/tools/validcode/source_ip_validate/10.";
例子4
lab_UserInfo->setText(QString("欢迎您: %1 您当前分: %2 分").arg(m_Account).arg(m_nIntegral));

例子5
p.start("cmd");
p.waitForStarted(); p.write(QString("date %1-%2-%3\n").arg(year).arg(month).arg(day).toLatin1()); p.closeWriteChannel(); p.waitForFinished(1000); p.close();QString cmd = QString("date%1%2%3%4%5.%6").arg(month).arg(day).arg(hour).arg(min).arg(year).arg(sec); system(cmd.toLatin1()); system("hwclock -w")
### QString 的源码分析与实现原理 QString 是 Qt 框架中用于表示和操作 Unicode 字符串的核心类之一。其设计在性能和内存管理上做了大量优化,尤其体现在其内部数据结构和引用计数机制上。 QString 的内部数据结构基于 `QTypedArrayData`,而 `QTypedArrayData` 继承自 `QArrayData`。这种继承结构使得 QString 能够高效地管理字符串内容和内存分配。`QArrayData` 中包含一个 `QtPrivate::RefCount` 类型的成员变量 `ref`,用于记录当前字符串数据块的引用次数。这种机制是实现 Copy On Write(写时复制)的关键[^1]。 #### Copy On Write(写时复制) 写时复制是一种优化技术,多个 QString 实例可以共享同一块内存中的字符串数据,只有在某个实例尝试修改数据时才会触发深拷贝操作。这种机制显著减少了不必要的内存复制,提高了程序性能。 例如,当两个 QString 实例指向同一字符串数据时: ```cpp QString a = "hello"; QString b = a; // 此时不会复制数据,仅增加引用计数 ``` 只有在 `b` 或 `a` 被修改时,才会触发复制操作: ```cpp b[0] = 'H'; // 此时才复制数据,生成独立副本 ``` #### 内存管理与数据布局 QString 的数据存储在堆内存中,其内部结构由 `QTypedArrayData` 管理。`QTypedArrayData` 是一个模板类,用于存储字符类型(通常是 `QChar`)的数组。`QArrayData` 中除了 `ref` 成员外,还包含 `size`(字符串长度)、`alloc`(分配大小)等字段,用于描述字符串数据块的元信息。 QString 的字符数据存储在 `QTypedArrayData` 的尾部,即字符数组紧跟在结构体之后。这种“柔性数组”设计减少了内存碎片,提高了访问效率。 #### 字符串构造与操作 QString 提供了丰富的字符串操作接口,包括拼接、截取、替换、查找等。这些操作在底层都基于 `QTypedArrayData` 的内存管理机制。例如,拼接操作会检查当前字符串是否可以修改(即引用计数是否为 1),若可以修改则直接扩展内存;否则会复制数据并分配新内存。 ```cpp QString s1 = "Hello"; s1 += " World"; // 如果 s1 的引用计数为 1,则直接扩展内存 ``` #### 性能优化与线程安全 由于 QString 使用了引用计数和写时复制机制,其在多线程环境下的行为需要特别注意。虽然 QString 本身不是线程安全的,但其内部的引用计数操作是原子的,确保了多个线程共享同一个字符串数据时不会出现数据竞争问题。然而,若多个线程同时修改同一个 QString 实例,则需要额外的同步机制。 #### 小字符串优化 对于非常短的字符串,QString 也支持“小字符串优化”(Small String Optimization, SSO),即将字符串直接存储在对象内部,避免堆内存分配。这在某些实现中通过在 `QString` 类中嵌入一个小型字符数组实现。 --- ### 相关代码示例 以下是一个简单的 QString 使用示例,展示了其内部机制的体现: ```cpp #include <QString> #include <QDebug> int main() { QString a = "Qt is great"; QString b = a; // 引用计数增加,不复制数据 qDebug() << "Before modification:"; qDebug() << "a:" << a; qDebug() << "b:" << b; b[0] = 'Q'; // 修改 b,触发写时复制 qDebug() << "After modification:"; qDebug() << "a:" << a; // a 保持不变 qDebug() << "b:" << b; // b 已修改 } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值