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的信号连接时并没有找到对应的参数信号连接就有问题。