QTableview 隐藏单元格内控件无效的原因

news2024/9/20 6:27:55

QTableview 隐藏单元格内控件无效的原因

背景:

在QTableview的单元格中创建多个QComboBox,当某条件成立时,隐藏特定单元格中的QComboBox,使得该单元格为空。

DEMO:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QStandardItemModel>
#include <QMainWindow>

#include <QComboBox>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    void init();
    void changeData();

private:
    QStandardItemModel *mpDataModel;    ///< 表格数据模型

    QList<QComboBox*> mComboList;

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    init();
    changeData();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::init()
{
    mpDataModel = new QStandardItemModel;

    mpDataModel->setRowCount(10 );
    mpDataModel->setColumnCount(1);

    ui->tableView->setModel(mpDataModel);

    QStringList strList;
    strList<<"1"<<"2";

    for(int i=0; i<10; i++)
    {
        QComboBox *combo = new QComboBox(this);
        combo->addItems(strList);

        mComboList.append(combo);

        QModelIndex index = mpDataModel->index(i, 0);
        ui->tableView->setIndexWidget(index, combo);
    }
}

void MainWindow::changeData()
{
        //第一种方式
//    int row1 = 1;
//    QWidget *widget = ui->tableView->indexWidget(mpDataModel->index(row1,0));
//    QComboBox *combo = dynamic_cast<QComboBox*>(widget);
//    if(combo != nullptr)
//    {
//        combo->setVisible(false);
//    }

    //第二种方式
//    widget->hide();

    //第三种方式
//    mComboList.at(row)->setVisible(false);

    //第四种方式
    int row2 = 1;
    ui->tableView->setIndexWidget(mpDataModel->index(row2,0),nullptr);

}

demo中创建了一个简单的主窗口,包含一个表格视图 (QTableView)。表格视图有 10 行和 1 列,每个单元格都包含一个下拉列表 (QComboBox)。

init() 函数设置了表格视图,创建一个包含两个选项 (“1” 和 “2”) 的下拉列表 (QComboBox),并将其添加到表格视图的每个单元格中。最后,将每个 QComboBox 对象添加到 mComboList 向量中。

changeData()试图隐藏表格视图中的某个特定单元格内的 QComboBox。

运行结果:除了第四种方式,其余方式隐藏无效。

分析原因:

<帮助手册>

在这里插入图片描述

<源代码:qabstractitemview.cpp>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YcEfhX0U-1681821716291)(C:\Users\Administrator\AppData\Roaming\marktext\images\2023-04-07-17-22-35-image.png)]

探讨setIndexWidget函数的作用:

如果在放入新控件时,当前单元格存在旧控件,那么d->persistent.remove(oldWidget);会将旧控件从persistent 集合中移除,防止内存泄漏,同时确保旧控件不再与模型索引关联。除此之外,会将其从编辑器列表中移除,并取消对它的事件过滤,deleteLater将其安排在稍后删除。

排查隐藏失败的原因:

在demo中:

1、该下拉列表框已经被正确添加到了视图中,目标隐藏位置确实存在QComboBox控件:

语句:

qDebug() << ui->tableView->indexWidget(mpDataModel->index(row1,0));

输出:在这里插入图片描述

2、控件的visible属性没有在其他代码部分重新设置为true

3、控件没有被其他控件遮挡

4、控件所在的父控件没有设置setVisible(false)

5、强制视图重新绘制后也无法隐藏

语句:

ui->tableView->viewport()->update();

6、控件的可见性属性确实被设置为false

语句:

bool isVisible = combo->testAttribute(Qt::WA_WState_Visible);
qDebug() << "Is visible: " << isVisible;

输出:在这里插入图片描述

合理推测隐藏失败原因:

在tableview被创建时,单元格存在默认的控件:在放入下拉框前打印

语句:

for(int row=0; row<10;row++)
{
    qDebug() << ui->tableView->indexWidget(mpDataModel->index(row,0));
}

输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yHbw8l8p-1681821716292)(C:\Users\Administrator\AppData\Roaming\marktext\images\2023-04-18-20-37-54-image.png)]

我们使用setIndexWidget时,将新控件代替了旧控件,此时旧控件已经从视图中移除。如果我们删除或隐藏新控件,该单元格中没有可以显示的控件,也许这样导致了删除或隐藏失败,保留原视图显示。

欢迎一起讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/432536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Redis】Redis键(key)

常用命令 常用案例 keys * 查看当前库所有的key 127.0.0.1:6379> keys * 1) "k1"exists key 判断某个key是否存在&#xff0c;存在几个则返回几&#xff0c;不存在则返回0 127.0.0.1:6379> exists k1 (integer) 1 127.0.0.1:6379> exists k2 (integer)…

西工大电子实习单片机-7+1亮灯编程C语言代码分享

电子实习是西工大大多数学生绕不开的一门实习课程。单片机是电子实习课程中较为重要的一部分&#xff0c;需要上两次。我们在单片机编程时在西工大电脑机房老系统上往往由于大一学习的C语言忘得一干二净而无从下手。流水灯成了流水账。 废话不多说&#xff0c;仅供参考。71是指…

分享5款办公效率工具|让你早点下班

如果每天你的工作都很多&#xff0c;做不完需要加班怎么办? 不知道你会不会加班&#xff0c;但是我肯定不会&#xff0c;因为我知道哪些高效率的办公工具&#xff0c;可以帮助我早点下班&#xff0c;今天来给大家分享一下。 1.FlowUs FlowUs 是一款为个人和团队打造的新一代生…

Netty通信技术进阶二

Netty核心组件 1. Bootstrap2 Channel3. EventLoopGroup 和 EventLoop3.1 eventLoopThreads 是多少&#xff1f; 4. ChannelHandler & ChannelHandlerContext & ChannelPipeline4.1 复用Handler4.2 ChannelInboundHandlerAdapter or SimpleChannelInboundHandler 5. By…

Linux系统之部署ZFile在线网盘服务

Linux系统之部署ZFile在线网盘服务 一、ZFile介绍1.ZFile简介2.ZFile特点 二、本地环境介绍1.本次实践说明2.本地环境规划 三、安装环境依赖1.安装java2.检查java版本 四、下载ZFile软件1.创建安装部署目录2.声明安装路径3.下载ZFile软件包4.解压ZFile软件包5.授权启动停止脚本…

FOC专题--环路PID算法拆分分析

foc中&#xff0c;其实foc算法并不是最难理解的&#xff0c;反而是在其中使用的PID算法&#xff0c;之前我只会套用别人的代码&#xff0c;但并不理解其中的各参数含义&#xff0c;导致在实际调整PI参数的时候&#xff0c;很难调到合适的值。 在实际理解什么是PID算法以及各参数…

【C++引用 】

目录 前言一、引用的概念二、使用引用时注意事项三、引用的使用场景及优势四、常引用、引用的权限五、引用和指针的区别 前言 相信大家应该在网上看过这样的段子。 大家都知道鲁迅原名周树人&#xff0c;浙江绍兴人。"鲁迅"是"周树人"的别名或者说是笔名…

TCP版本的 echo server 和 echo client

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言Tcp的api展示服务端客户端存在的问题解决问题服务端和客户端的大致流程 前言 上一篇文章我们介绍了UCP的客户端与服务器的一个简单实例,这篇我们简单的来介绍T…

111.【金橘社区1.0】

金橘社区1.0版本 (一)、SpringBoot整合SpringSecurity1.导入依赖2.数据库3.登入表单4. 添加配置类 SecurityConfig5.接口实现类 CkqnUserServiceImpl6.前端认证问题 (二)、SpringBoot整合Ajax1.登入表单2. JavaScript (三)、SpringBoot整合editor.md1.编写页面(1).前端页面(2).…

Windows安装RedisJSON(无需编译)

文章目录 Windows安装RedisJSON下载解压配置文件启动服务启动客户端 Windows安装RedisJSON 下载 打开网址 https://github.com/zkteco-home/RedisJson。 在网页的右上角&#xff0c;点击“Code”按钮&#xff0c;然后选择“Download ZIP”以下载最新版本的RedisJSON。 网盘 …

C6678-控制GPIO输入/输出

C6678-控制GPIO输入/输出 术语寄存器起始地址原理输入输出测试中断功能原理中断原理框图芯片中断控制器原理框图内核中断控制器原理框图中断路由架构一级中断表二级中断表CIC0二级中断CIC1二级中断CIC2二级中断CIC3 中断演示代码参考资料 术语 NMI&#xff1a; 不可屏蔽中断CI…

6、在vscode上利用cmake创建第一个简单C++程序

文章目录 &#xff08;1&#xff09;前期准备工作&#xff1a;即安装对应的环境1&#xff09;在vscode上安装插件&#xff1a;C/C、Cmake、CMake tools2&#xff09;安装Cmake环境&#xff08;这是在前面博客提到的已经安装好gcc等环境的前提下进行的&#xff09; &#xff08;…

Springboot基础学习之(二十二):异步任务和邮件任务

方向一&#xff1a;高效学习方法分享 我认为学习的最好的办法就是做笔记:本人特别喜欢在网上学习一些课堂外的知识&#xff0c;但是如果你没有及时的复习&#xff0c;要想找到自己想要的知识该怎么办呢&#xff1f;对&#xff0c;就是做笔记我在csdn这个app发的所有内容都是笔记…

Android UI布局优化之include、merge与ViewStub标签的巧用方法

前言 在开发中UI布局是我们都会遇到的问题&#xff0c;随着UI越来越多&#xff0c;布局的重复性、复杂度也会随之增长。 相信大家经常听到include、merge、ViewStub这样的标签&#xff0c;官方也提到这三种布局可用于布局的优化。今天就介绍下这三种布局的使用&#xff0c;记…

SRv6项目实践(一):环境与工具介绍

在一切开始之前&#xff0c;首先介绍一下我们要做什么&#xff0c;做这个要有什么基础&#xff0c;以及实现的环境 1&#xff0c;实验目标与实验基础 我们要在图下图所示的拓扑中&#xff0c;完成在如以下拓扑所示的网络中&#xff0c;配合ONOS实现基本的L2L3转发以及SRv6&am…

港联证券|券商再迎利好!这一比例大幅下调,释放300亿资金

券商利好接二连三。 4月10日&#xff0c;即日起下调证券公司转融通保证金份额。资信优质的公司&#xff0c;保证金份额由20%下调至5%&#xff1b;资信杰出的公司&#xff0c;由20%下调至10%&#xff1b;其余公司由25%下调至15%。中证金融预计&#xff0c;保证金份额下调后&…

Linux系统之tomcat的安装方法

Linux系统之tomcat的安装方法一、tomcat介绍1.tomcat简介2.tomcat官网二、本次环境规划三、安装jdk1.下载jdk包2.安装jdk3.检查jdk版本四、安装tomcat1.下载tomcat2.解压tomcat软件包3.设置环境变量4.查看tomcat版本五、启动tomcat1.启动tomcat服务2.检查tomcat服务状态3.访问t…

原来情感可以这样影响用户体验设计

&#x1f525;情绪的基本情况 Emotion&#xff1a;即刻的生理反应&#xff0c; Feeling&#xff1a;物理的或者心理上的&#xff0c;是emotion经过思考后的 Mood&#xff1a;持续时间更长&#xff0c;是一种状态&#xff0c;受到很多因素影响&#xff08;天气、睡眠&#x…

92-TCP三次握手及TCP四次挥手

TCP三次握手及TCP四次挥手1.tcp三次握手(1)tcp的特点(2)tcp三次握手发生在什么阶段(3)tcp协议报头(4)tcp三次握手的流程2.tcp四次挥手(1)tcp四次挥手发生在什么阶段(2)tcp四次挥手的流程(3)能不能将服务器发端发送的ACK和FIN放在一起发送呢1.tcp三次握手 (1)tcp的特点 TCP 协…

十六、市场活动:查看市场活动明细(二)

功能需求 点击市场活动名称链接,跳转到明细页面,查看市场活动明细 -市场活动的基本信息 -市场活动下所有的备注信息 功能分析 流程图 代码实现 一、ActivityRemarkMapper 1.ActivityRemarkMapper接口 /*** 根据市场活动id查询备注*/List<ActivityRemark> selectActivi…