《Qt入门 (十)--QTableview 多线程操作model问题记录》

背景

在使用Qtableview 读写数据库时,因为操作数据文件在子线程操作,但是显示却在主线程,又想实现实时刷新数据的显示效果,这中间遇到几个问题记录一下。

一、在主线程中设置QStandardItemModel

    m_model = new QStandardItemModel();

    m_model->setHorizontalHeaderItem(KEY_NAME,new QStandardItem("按键名"));
    m_model->setHorizontalHeaderItem(KEY_DATA,new QStandardItem("值"));
    m_model->setHorizontalHeaderItem(ASIXID,new QStandardItem("轴号"));
    m_model->setHorizontalHeaderItem(ASIXData,new QStandardItem("轴值"));
    //设置表格属性
    ui->tabviewShowBtn->setModel(m_model);

在主线程里操作model,就可以达到QTableView立马变更视图的操作,
每次变更数据只需要变更model 的数据即可

二、在子线程操作model、主线程显示

同样在初始化界面时 定义个全局的model
获取这个model绑定到tableview上

    m_model = &CSingleton::getInstance()->m_tablemodel;
    ui->tableView->setModel(m_model);

在子线程里实时刷新model的数据

 /*******************************************************************
 ** 函数名:      on_threadInit
 ** 函数描述:    线程初始化
 ** 参数:       Name:进程名字
 ** 返回:QString
 ********************************************************************/
 void CtlP3DSimConnet:: on_threadInit(void)
 {
     m_sqlite = new Sqlite("1111.s3db");
     m_sqltabmdl  = &CSingleton::getInstance()->m_tablemodel;
     QString filter = "isread = 'Y'";
     m_sqlite->find2StandMdl("P3DSimConnect", filter,m_sqltabmdl);
 }
 
 //子线程一个定时器定时刷新model的值
 QStandardItemModel* model = m_sqltabmdl;
 for (int i = 0; i < model->rowCount(); i++){
       ::memcpy(&data, pMemry, 4);//内存拷贝对应的指针长度
       model->setData(model->index(i, 4), data);
       pMemry++;
 }

使用时发现出现以下报错,排查了好久,发现信号连接什么的都没什么问题。
后面才发现,原来Qt的model 会发出一个datachange 的信号

如果都在主线程操作这个信号没什么问题
挪动到子线程,就会出现下面的警告

这时候就需要手动注册以下对应的参数

qRegisterMetaTypeQt::Orientation(“Qt::Orientation”);//QSqlTableModel
qRegisterMetaType<QVector>(“QVector”);//QStandardItemModel

(Make sure 'QVector<int>' is registered using qRegisterMetaType().)
QObject::connect: Cannot queue arguments of type 'QVector<int>'

出现警告会导致 QTableview 刷新时会一卡一卡的,虽然你已经定义了全局的model,datachange的信号连接时并没有找到对应的参数信号连接就有问题。
在这里插入图片描述

  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值