如何在QTableView中item被选中时,使其表头字体不变粗

经常在使用QTableView时选中item,会同时使表头出现字体加粗的高亮状态,像这样:

的确不大好看,解决这个问题的方法:

ui.tableView->horizontalHeader()->setHighlightSections(false);

是不是好看多了呢。

QList<QString> tableHeader; // 表头 QStandardItemModel *model; // 表格数据模型// 初始化表格 void SpecsWidget::initTabel() { tableHeader.append("编号"); tableHeader.append("名称"); tableHeader.append("重量上限"); tableHeader.append("重量下限"); tableHeader.append("断面宽度上限"); tableHeader.append("断面宽度下限"); tableHeader.append("外径上限"); tableHeader.append("外径下限"); tableHeader.append("内径上限"); tableHeader.append("内径下限"); tableHeader.append("内口宽度"); // 创建模型 model = new QStandardItemModel(99, tableHeader.size()); ui->tableView->setModel(model); for (int i = 0; i < tableHeader.size(); ++i) { QStandardItem *item = new QStandardItem(tableHeader[i]); item->setTextAlignment(Qt::AlignCenter); // 居中对齐 model->setItem(0, i, item); } // 表格设置 ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); // 设置为可编辑 // 设置字体像素大小 QFont font = ui->tableView->font(); font.setPixelSize(20); ui->tableView->setFont(font); ui->tableView->setAlternatingRowColors(true); // 隔行变色 ui->tableView->verticalHeader()->setVisible(false); // 隐藏行号 ui->tableView->horizontalHeader()->setVisible(false); // 隐藏列号 ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 宽度自动 ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); // 设置选择行为为选中整行 ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection); // 设置选择模式为单选 connect(ui->tableView, &QTableView::clicked, this, &::SpecsWidget::slotTableSelected); }是否会有内存相关潜在问题
最新发布
03-14
<think>嗯,用户问的是这段代码是否存在内存相关的问题。让我仔细看一下代码。 首先,用户定义了一个QList<QString> tableHeader,用来存储表头数据,然后在initTabel方法里添加各个表头项。这部分应该没问题,QString和QList管理自己的内存,需要手动释放。 接下来是QStandardItemModel *model,在初始化用new创建了一个模型,行数是99,列数是表头的数量。然后设置给tableView。这里需要注意的是,model是用new创建的,但没有看到delete的地方。如果这个类(SpecsWidget)在析构的候没有释放model,就会导致内存泄漏。所以用户需要确认在析构函数中是否有delete model;或者是否设置了父对象让Qt自动管理。 然后循环创建QStandardItem,每个item都是new出来的,并设置到model的第0行。这里的问题是,QStandardItemModel的setItem方法会取得item的所有权,所以理论上需要手动释放,应该会有泄漏。过需要确认是否正确设置了所有item,尤其是在循环中是否正确处理了所有列。 然后是tableView的各种设置,这部分应该没问题,主要是UI的设置,会涉及内存问题。 最后有一个连接点击信号的槽函数,连接正常,没有内存问题。 潜在的问题可能有: 1. model没有正确释放:如果SpecsWidget的析构函数中没有删除model,或者model没有父对象,会导致内存泄漏。需要检查是否有正确的析构处理。 2. 初始化了99行的模型,但只设置了第0行的数据,其他98行都是空的。虽然影响内存,但可能导致显示问题或者后续操作的错误。 3. 表头设置在第0行,而通常表头应该用setHorizontalHeaderLabels来设置,这样更规范,而且需要手动创建QStandardItem。用户现在的做法可能把表头当成了数据行,导致显示上的混乱。 4. 内存泄漏的风险:虽然QStandardItem会被model接管,但如果在后续代码中替换了model而没有删除旧的,就会泄漏。比如再次调用initTabel,之前的model没有被删除。 另外,用户可能没有注意到,当tableView被销毁,如果model没有父对象,可能需要手动删除。或者应该将model的父对象设置为ui->tableView,这样在tableView销毁自动删除model。 总结起来,主要的内存问题是model的释放问题,以及潜在的重复创建model导致泄漏。需要确保在析构函数中正确释放,并且在初始化检查是否已经存在model,避免重复创建。</think>该代码存在以下几个内存相关潜在问题需要特别注意: $\textcolor{red}{【高危问题】}$ 1. **模型对象泄漏** ```cpp model = new QStandardItemModel(...); // 每次调用都会创建新对象 ``` - 未检查现有模型指针是否已初始化 - 重复调用会导致前一个模型对象泄漏 - $\textcolor{blue}{建议}$:在创建前添加`if(model) delete model;` 2. **表项未复用** ```cpp for(...) { QStandardItem *item = new QStandardItem(...); // 每次循环都new model->setItem(0, i, item); // 未清理原有item } ``` - 重复调用会导致第0行的原有QStandardItem对象泄漏 - $\textcolor{blue}{建议}$:使用`model->takeItem(0,i)`获取旧item后删除 $\textcolor{orange}{【优化建议】}$ 3. **表头实现方式当** ```cpp // 当前方式(非常规实现) model->setItem(0, i, new QStandardItem(...)); // 推荐方式(自动内存管理) model->setHorizontalHeaderLabels(tableHeader); ``` - 使用标准接口可避免手动管理表头项内存 4. **初始化行数冗余** ```cpp new QStandardItemModel(99, ...) // 预创建99行 ``` - 空行会占用必要的内存 - $\textcolor{blue}{建议}$:初始化为0行,动态添加数据行 $\textcolor{green}{【防御性编程建议】}$ 5. **生命周期管理** ```cpp // 应在析构函数添加 SpecsWidget::~SpecsWidget() { delete model; // 显式释放 // 或使用智能指针: // std::unique_ptr<QStandardItemModel> model; } ``` 6. **字体对象优化** ```cpp QFont font = ui->tableView->font(); // 创建临副本 font.setPixelSize(20); ui->tableView->setFont(font); // 触发字体对象复制 ``` - 可改为直接修改控件的默认字体: ```cpp ui->tableView->font().setPixelSize(20); // 减少对象拷贝 ``` **修正方案示例**: ```cpp void SpecsWidget::initTabel() { // 安全删除旧模型 if(model) { delete model; model = nullptr; } // 创建新模型(推荐设置父对象自动管理) model = new QStandardItemModel(0, tableHeader.size(), this); // 父对象自动管理 // 正确设置表头 model->setHorizontalHeaderLabels(tableHeader); // 后续设置保持变... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值