QStyledItemDelegate 派生类自定义控件,遇到的程序崩溃问题

文章描述了一名开发者在使用QTreeView时遇到的问题,即在自定义Editor中创建表格并在跨线程回调中填充数据时,程序崩溃。问题在于Model-View在不同线程间的同步问题,尽管尝试了多种解决方案,最终发现应在主线程中创建和更新数据以避免崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值