行动->习惯->性格->命运

 

播下一个行动,你将收获一种习惯;

播下一种习惯,你将收获一种性格;

播下一种性格,你将收获一种命运。

                          ---威廉·詹姆斯       

 

void MainWindow::InitTableView() { // 创建模型 (22行 = 20数据行 + 2表头行,15列) ViewModel = new QStandardItemModel(22, 15, this); // 设置二级表头数据 // 确保第一行所有列都有item(包括空白单元格) for (int col = 0; col < 15; ++col) { // 创建所有单元格的item QStandardItem *item = new QStandardItem(); ViewModel->setItem(0, col, item); // 只在特定列设置文本 if (col == 7) { item->setText(QStringLiteral("磐石")); } else if (col == 10) { item->setText(QStringLiteral("本地")); } } // 合并表头单元格 ui->MainTableView->setSpan(0,0,2,1); ui->MainTableView->setSpan(0,1,2,1); ui->MainTableView->setSpan(0,2,2,1); ui->MainTableView->setSpan(0,3,2,1); ui->MainTableView->setSpan(0,4,2,1); ui->MainTableView->setSpan(0,5,2,1); ui->MainTableView->setSpan(0,6,2,1); ui->MainTableView->setSpan(0,13,2,1); ui->MainTableView->setSpan(0,14,2,1); ui->MainTableView->setSpan(0, 7, 1, 3); // 第一组 (8-10列) ui->MainTableView->setSpan(0, 10, 1, 3); // 第二组 (11-13列) // 第二行表头(各列标题) ViewModel->setItem(0, 0, new QStandardItem(QStringLiteral("序号"))); ViewModel->setItem(0, 1, new QStandardItem(QStringLiteral("图号"))); ViewModel->setItem(0, 2, new QStandardItem(QStringLiteral("图纸版本"))); ViewModel->setItem(0, 3, new QStandardItem(QStringLiteral("零部件名称"))); ViewModel->setItem(0, 4, new QStandardItem(QStringLiteral("特性编码"))); ViewModel->setItem(0, 5, new QStandardItem(QStringLiteral("名称"))); ViewModel->setItem(0, 6, new QStandardItem(QStringLiteral("特性状态"))); ViewModel->setItem(1, 7, new QStandardItem(QStringLiteral("类别"))); ViewModel->setItem(1, 8, new QStandardItem(QStringLiteral("规格"))); ViewModel->setItem(1, 9, new QStandardItem(QStringLiteral("图纸位置"))); ViewModel->setItem(1, 10, new QStandardItem(QStringLiteral("类别"))); ViewModel->setItem(1, 11, new QStandardItem(QStringLiteral("规格"))); ViewModel->setItem(1, 12, new QStandardItem(QStringLiteral("图纸位置"))); ViewModel->setItem(0, 13, new QStandardItem(QStringLiteral("同步状态"))); ViewModel->setItem(0, 14, new QStandardItem(QStringLiteral("操作"))); // 添加表格视图 ui->MainTableView->setModel(ViewModel); // 隐藏默认表头 ui->MainTableView->horizontalHeader()->setVisible(false); ui->MainTableView->verticalHeader()->setVisible(false); // 合并表头单元格 ui->MainTableView->setSpan(0,0,2,1); ui->MainTableView->setSpan(0, 7, 1, 3); // 第一组 (8-10列) ui->MainTableView->setSpan(0, 10, 1, 3); // 第二组 (11-13列) // 设置统一的行高(25像素) const int rowHeight = 25; for (int row = 0; row < 22; ++row) { ui->MainTableView->setRowHeight(row, rowHeight); } // 设置表头样式 - 确保所有表头单元格都设置为灰色背景且不可编辑 for (int row = 0; row < 2; ++row) { // 处理前两行(表头行) for (int col = 0; col < 15; ++col) { if (QStandardItem *item = ViewModel->item(row, col)) { // 设置文本居中对齐 item->setTextAlignment(Qt::AlignCenter); // 设置灰色背景 if (row == 0) { item->setBackground(QBrush(QColor(240, 240, 240))); // 深灰色 } else { item->setBackground(QBrush(QColor(240, 240, 240))); // 中灰色 } // 设置为不可编辑 item->setFlags(item->flags() & ~Qt::ItemIsEditable); // 设置为不可选择 item->setFlags(item->flags() & ~Qt::ItemIsSelectable); } } } //设置列宽 ui->MainTableView->setColumnWidth(0, 60); // 序号 ui->MainTableView->setColumnWidth(1, 160); // 图号 ui->MainTableView->setColumnWidth(2, 70); // 图纸版本 ui->MainTableView->setColumnWidth(3, 90); // 零部件名称 ui->MainTableView->setColumnWidth(4, 70); // 特性编码 ui->MainTableView->setColumnWidth(5, 180); // 名称 ui->MainTableView->setColumnWidth(6, 70); // 特性状态 ui->MainTableView->setColumnWidth(7, 90); // 类别 ui->MainTableView->setColumnWidth(8, 180); // 规格 ui->MainTableView->setColumnWidth(9, 90); // 图纸位置 ui->MainTableView->setColumnWidth(10, 70); // 类别 ui->MainTableView->setColumnWidth(11, 180); // 规格 ui->MainTableView->setColumnWidth(12, 90); // 图纸位置 ui->MainTableView->setColumnWidth(13, 70); // 同步状态 ui->MainTableView->setColumnWidth(14, 90); // 操作 // 设置圆点与三角形 ui->ConsistencyRadioLabel->setText(QStringLiteral( "<html>" "<span style='color: green;'>●</span>" // 绿色圆点 " 一致" // 默认颜色的文本 "</html>")); ui->ConsistencyRadioLabel->setText(QStringLiteral( "<html>" "<span style='color: green;'>●</span>" // 绿色圆点 " 一致" // 默认颜色的文本 "</html>")); // 设置圆点与三角形 "▲ 上三角形 (U+25B2)\n" KeyFeatureLabel ui->NonConsistencyRadioLabel->setText(QStringLiteral( "<html>" "<span style='color: red;'>●</span>" // 红色圆点 " 不一致" // 默认颜色的文本 "</html>")); ui->KeyFeatureLabel->setText(QStringLiteral( "<html>" "<span style='color: black;'>▲</span>" // 黑色三角 " 关键特性" // 默认颜色的文本 "</html>")); ui->KeyFeatureLabel_1->setText(QStringLiteral( "<html>" "<span style='color: none;'>△</span>" // 无色三角 " 重要特性" // 默认颜色的文本 "</html>")); QString BtnStyle = QStringLiteral("QPushButton {" "border: 2px solid #a0a0a0;" // 设置边框颜色 "border-style: outset;" // 设置为凸起样式 "padding: 5px;" // 设置内边距 "}" "QPushButton:pressed {" "border-style: inset;" // 按下时边框变为凹陷 "}"); ui->LoadBtn->setStyleSheet(BtnStyle); ui->RefreshBtn->setStyleSheet(BtnStyle); ui->ReleaseBtn->setStyleSheet(BtnStyle); ui->ReviewBtn->setStyleSheet(BtnStyle); ui->SaveBtn->setStyleSheet(BtnStyle); ui->UpdateBtn->setStyleSheet(BtnStyle); ui->UploadBtn->setStyleSheet(BtnStyle); ui->jumpToRockBtn->setStyleSheet(BtnStyle); }在这个程序里设置上下滚轮滚动时,水平表头不动,数据行动
08-13
<think>我们使用双QTableView的方案:一个用于显示表头(只显示表头行,隐藏其他行),另一个用于显示数据(隐藏表头)。 由于用户代码中已经有一个tableView(名为MainTableView),我们需要再创建一个专门用于显示表头的tableView(headerView)。 然后,将这两个tableView垂直排列,并确保它们水平滚动同步。 修改步骤: 1. 在MainWindow类中添加一个QTableView*成员变量(例如headerTableView)用于显示表头。 2. 在InitTableView函数中,创建这个headerTableView,并设置其只显示前两行(表头行),隐藏其他行。 3. 将headerTableView放置在MainTableView的上方,并确保它们水平滚动同步。 4. 调整headerTableView的样式,使其看起来和表头一致,并且不可编辑、不可选择。 5. 隐藏MainTableView的默认水平表头(因为我们已经用headerTableView代替了)。 注意:用户代码中已经隐藏了默认的水平表头和垂直表头,所以我们只需要处理自定义表头部分。 具体修改如下:</think>针对您提供的代码,我将在 `InitTableView()` 函数中实现固定表头效果,使垂直滚动时水平表头保持不动。以下是修改后的完整实现: ```cpp void MainWindow::InitTableView() { // 创建模型 (22行 = 20数据行 + 2表头行,15列) ViewModel = new QStandardItemModel(22, 15, this); // ... [省略原有表头设置代码,保持原有逻辑不变] ... // 添加表格视图 ui->MainTableView->setModel(ViewModel); // 隐藏默认表头 ui->MainTableView->horizontalHeader()->setVisible(false); ui->MainTableView->verticalHeader()->setVisible(false); // 创建固定表头的容器 QWidget* headerContainer = new QWidget(); QVBoxLayout* headerLayout = new QVBoxLayout(headerContainer); headerLayout->setContentsMargins(0, 0, 0, 0); headerLayout->setSpacing(0); // 创建表头视图 (只显示前两行作为表头) QTableView* headerView = new QTableView(); headerView->setModel(ViewModel); headerView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); headerView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); headerView->setFocusPolicy(Qt::NoFocus); headerView->verticalHeader()->setVisible(false); headerView->setSelectionMode(QAbstractItemView::NoSelection); headerView->setEditTriggers(QAbstractItemView::NoEditTriggers); // 设置表头视图只显示前两行 headerView->setFixedHeight(ui->MainTableView->rowHeight(0) + ui->MainTableView->rowHeight(1)); for (int row = 2; row < ViewModel->rowCount(); ++row) { headerView->setRowHidden(row, true); } // 设置列宽与主表同步 for (int col = 0; col < 15; ++col) { headerView->setColumnWidth(col, ui->MainTableView->columnWidth(col)); } // 添加表头视图到容器 headerLayout->addWidget(headerView); // 将表头容器添加到主布局(假设主布局为verticalLayout) ui->verticalLayout->insertWidget(0, headerContainer); // 调整索引位置到合适位置 // 同步水平滚动 connect(ui->MainTableView->horizontalScrollBar(), &QScrollBar::valueChanged, headerView->horizontalScrollBar(), &QScrollBar::setValue); connect(headerView->horizontalScrollBar(), &QScrollBar::valueChanged, ui->MainTableView->horizontalScrollBar(), &QScrollBar::setValue); // ... [省略原有样式设置代码,保持原有逻辑不变] ... // 设置主表格视图的垂直表头不可见(已在前面设置) // 确保主表格不显示表头行 for (int row = 0; row < 2; ++row) { ui->MainTableView->setRowHidden(row, true); } } ``` ### 关键修改说明: 1. **双视图结构**: - 创建独立的 `headerView` 专门显示表头(前两行) - 主表格 `MainTableView` 隐藏表头行(第0-1行) 2. **同步机制**: ```cpp // 双向同步水平滚动 connect(ui->MainTableView->horizontalScrollBar(), &QScrollBar::valueChanged, headerView->horizontalScrollBar(), &QScrollBar::setValue); connect(headerView->horizontalScrollBar(), &QScrollBar::valueChanged, ui->MainTableView->horizontalScrollBar(), &QScrollBar::setValue); ``` 3. **表头视图配置**: - 固定高度:`rowHeight(0) + rowHeight(1)` - 禁用滚动条和交互功能 - 同步所有列宽 ```cpp headerView->setFixedHeight(ui->MainTableView->rowHeight(0) + ui->MainTableView->rowHeight(1)); for (int col = 0; col < 15; ++col) { headerView->setColumnWidth(col, ui->MainTableView->columnWidth(col)); } ``` 4. **布局调整**: - 表头容器插入到主布局顶部 - 使用 `insertWidget(0, headerContainer)` 确保表头显示在表格上方 5. **主表格调整**: ```cpp // 隐藏主表格的表头行 for (int row = 0; row < 2; ++row) { ui->MainTableView->setRowHidden(row, true); } ``` ### 注意事项: 1. 确保 `headerContainer` 被添加到正确的父布局(示例中使用 `verticalLayout`) 2. 如果表格高度动态变化,需重写 `resizeEvent` 同步表头高度 3. 在数据更新后调用 `headerView->reset()` 刷新表头显示 4. 如果使用自定义委托,需同时设置给两个视图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值