- 简单创建一个表格: QTreeView
m_propertiesTreeView = new QTreeView;
- 在自定义派生类中重载模型创建、填充数据、模型更新等方法
class ccPropertiesTreeDelegate : public QStyledItemDelegate
{
Q_OBJECT
......
virtual QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index ) const;
virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
virtual void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const;
virtual void setEditorData(QWidget *editor, const QModelIndex &index) const;
......
}
- 给表格绑定模型及QStyledItemDelegate派生的属性代理类
QStandardItemModel* m_propertiesModel = new QStandardItemModel(0, 2);
ccPropertiesTreeDelegate m_ccPropDelegate = new ccPropertiesTreeDelegate(m_propertiesModel, m_propertiesTreeView);
m_propertiesTreeView->setItemDelegate(m_ccPropDelegate);
m_propertiesTreeView->setModel(m_propertiesModel);
- 问题来了
每当创建完自定义 Editor ,程序就崩溃了,主要表现为两个现象:
- 直接崩溃,vs 下面显示:0x00007FFC18C253AC (KernelBase.dll)处(位于 xxxxTool.exe 中)引发的异常: 0x000006BA: RPC 服务器不可用
- 本来应当显示在表格中的控件,弹出来显示,并且卡死
- 代码排查: 反复排查,并未发现任何问题,并且这个代码在其他工程中也应用了,没有问题;并且尝试了各种改进方法,各种博客的方法,均无效。
- 真正的问题所在
经过令人崩溃的3天排查后,在不断尝试新方案测试的过程中,发现了问题:
- 在另一个线程内部调用回调函数来创建表格并填充数据,从而导致了这个问题。所以,不能跨线程创建 Model-View 视图
- 但是,我从另一个线程中发送信号(带数据)出来,在主线程创建模型填充数据还是不行,一样会崩溃,可能是数据被释放了
- 好吧,直接在主程序中更新数据,程序就好了