QTableView表格中出现多余的Checkbox

本文介绍了一个关于QTableView在使用时出现每个单元格内有无法点击的多余复选框的问题,并提供了通过修正data函数来解决此问题的具体方法。

转载时请注明出处和作者联系方式
作者联系方式:Lutx (80437#zj.com)

 

最近使用QTableView/QAbstractItemModel编写一个界面表格时遇到一个想起来很奇怪的事情, 就是在许多单元格中都有一个多余的复选框(Checkbox)显示, 点击无反应, 如下图显示.

 

 

就这个问题折腾了很久, 最后利用google在国外的一个网站上[http://stackoverflow.com/questions/2396744/qtableview-has-unwanted-checkboxes-in-every-cell]找到答案, 原来是Model类中data函数的问题.

 

原来的代码是:

 

QVariant MyModel::data ( const QModelIndex & index, int role ) const
{
    switch(index.column())
    {
    case 0 :
        return "Visible";
    case 1:
        return "description";
    case 2:
        return "value";
    case 3:
        return "unit";
    case 4:
    default:
        break;
    }

    return QVariant();
}

 

而正确的代码应该是在开始加上

 

if (role!=Qt::DisplayRole)

  return QVariant();

 

也就是说在前一种写法中, 不管role为什么值, 都返回同样的结果, 这样会导致但role==Qt::CheckStateRole时, 返回值引起Qt显示错误. 

 

所以在重载这个函数是不应该忽略role参数的作用!!


<think>我们正在讨论的是Qt框架中QTableViewQTableWidget的一个方法调用:verticalHeader()->setVisible(false); 这个调用用于设置表格的垂直表头(行头)不可见。 在Qt中,QTableViewQTableWidget都有一个垂直表头(vertical header)和一个水平表头(horizontal header)。垂直表头通常显示行号,水平表头显示列标题。 有时,为了界面美观或节省空间,我们可能希望隐藏垂直表头(即不显示行号)。 代码含义: verticalHeader():获取表格的垂直表头对象(QHeaderView类型)。 setVisible(false):设置该表头不可见。 使用场景举例: 1. 当表格的行号不需要显示给用户看时,可以隐藏垂直表头。 2. 在需要最大化表格显示区域,或者设计紧凑的界面布局时,隐藏垂直表头可以节省空间。 3. 如果表格的行是通过其他方式标识(比如第一列已经有唯一标识符),那么垂直表头就显得多余,可以隐藏。 示例代码(使用QTableWidget): QTableWidget *table = new QTableWidget(this); table->setRowCount(5); table->setColumnCount(3); // 隐藏垂直表头(行头) table->verticalHeader()->setVisible(false); 同样,也可以隐藏水平表头:table->horizontalHeader()->setVisible(false); 注意:这个设置不会影响表格的数据,只是隐藏了表头的显示。 </think> 在Qt框架中,`verticalHeader()->setVisible(false);` 代码用于控制表格组件中垂直表头(行表头)的可见性。以下是详细解析: ### 代码含义 - **`verticalHeader()`** 获取表格的垂直表头对象(即左侧显示行序号的区域)。 - **`setVisible(false)`** 设置该对象为不可见状态,即隐藏行表头。 ### 使用场景 1. **简化界面布局** 当表格行序号对用户无意义时(如仅展示数据无需定位行号),隐藏行表头可节省空间。 *示例*:学生成绩表仅需显示姓名和分数,无需行序号。 ```cpp QTableWidget* table = new QTableWidget(this); table->setRowCount(10); table->setColumnCount(2); table->verticalHeader()->setVisible(false); // 隐藏行表头 ``` 2. **自定义表头设计** 需完全自定义行表头样式时(如添加图标或复杂控件),先隐藏默认表头再添加自定义组件。 *示例*:在表格左侧嵌入复选框控件: ```cpp table->verticalHeader()->setVisible(false); for(int i=0; i<rowCount; i++) { QCheckBox* checkBox = new QCheckBox(table); table->setIndexWidget(table->model()->index(i, 0), checkBox); } ``` 3. **紧凑型数据展示** 在空间受限的界面(如嵌入式设备或弹窗),隐藏表头可最大化数据区域。 *场景*:仪表盘嵌入式屏幕中的实时监控表格。 ### 注意事项 - **关联操作**: 隐藏行表头不影响水平表头(列表头),需单独设置 `horizontalHeader()->setVisible(false)` 隐藏列表头。 - **布局影响**: 表头隐藏后,表格内容区域会自动扩展填充原表头空间。 - **适用组件**: 适用于 `QTableView`、`QTableWidget` 及其子类。 --- ### 相关问题 1. Qt中如何同时隐藏表格的行表头和列表头? 2. `QTableView` 和 `QTableWidget` 在表头操作上有何区别? 3. 如何为Qt表格的垂直表头添加自定义排序功能? 4. 隐藏表头后如何通过代码获取表格当前行号?
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值