不好意思,我也不是神,以下方法是我自己弄出来的,应该没有问题:
QReadWriteLock m_lock; // 锁view用的,否则多个任务同时更新会出错的
void ContentWidget::ShowTasks()
{
m_lock.lockForWrite(); // 临界区
// 这里只根据现成的数据进行显示,不对数据内容现场生成和管理。否则就无法做到让别处修改数据,然后让这里显示了。
// 先清除所有table里的任务,然后根据内存中的数据m_showlist进行添加
SystemGlobal::m_tableview->clear(); // 清除显示而已
SystemGlobal::m_tabledata->clear(); // 真正清除view的数据
// m_showlist.clear(); // view 以前不写这句也可以正确显示,说明真实数据怎么样不重要,只看addRow时的view数据
// 读入间接数据,每次都更新model数据
// connect(this, SIGNAL(addSucc(QStringList)), SystemGlobal::m_tableview, SLOT(addRow(QStringList)));
// 每次现场准备数据效率低,也不便于修改,因此要提前准备好数据,这里直接添加
for (int i=0; i<m_showlist.count(); i++) {
QStringList sss = m_showlist.at(i);
qDebug() << sss;
SystemGlobal::m_tableview->addRow(sss); // good 加入行,会自动显示
//emit addRow(sss);
}
m_lock.unlock();
// 读完数据以后要显示,最好不要发什么信号,直接调用update函数
//SystemGlobal::m_tableview->model->setModalDatas(list);
//table_view->setColumnWidth(0,35); // good 还真是放在这里才起作用。得至少有一行内容,才会起作用
}
其中
ContentWidget是主线程UI里的一个界面类,
SystemGlobal::m_tableview就是你的view,我把它设置为一个全局指针了。
SystemGlobal::m_tabledata就是你的真正数据,其类型是 QList< QStringList > grid_data_list;(根据我的需要,但一般都是这种类型吧,因为我使用的TableView),我把它设置为一个全局指针了。
另外,更新界面时,我认为要上锁(我这里会有多线程更新UI的情况),所以要加上m_lock.lockForWrite();
以上是整体显示所有数据在tableview里,另外还有UpdateTask的情况,就是只更新某一行,这里暂时就不贴了,因为虽然运行良好,但我自己都还有一点疑问。