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

  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 视图
    • 但是,我从另一个线程中发送信号(带数据)出来,在主线程创建模型填充数据还是不行,一样会崩溃,可能是数据被释放了
    • 好吧,直接在主程序中更新数据,程序就好了
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VC控件派生类对象内在膨胀主要指的是在使用VC控件派生类对象时,它的内部数据结构会随着功能的增加而变得更加复杂和庞大。 首先,由于VC控件派生类对象通常需要承载大量的属性和方法,它的内部数据结构会包含与这些属性和方法相关的成员变量和函数。随着功能的增加,这些成员变量和函数会变得越来越多,从而导致对象的内部数据结构变得庞大。 其次,VC控件派生类对象通常需要处理多种用户交互行为和事件,比如鼠标点击、键盘输入等。为了实现这些功能,派生类对象的内部数据结构会包含与用户交互相关的成员变量和函数。随着功能的增加,这些成员变量和函数的数量也会增加,导致对象的内部数据结构变得更加复杂。 此外,VC控件派生类对象还需要维护界面的布局和显示等相关信息。为了实现这些功能,派生类对象的内部数据结构会包含与界面相关的成员变量和函数。随着功能的增加,这些成员变量和函数的数量也会增加,从而使对象的内部数据结构变得更加庞大和复杂。 因此,VC控件派生类对象内在膨胀是不可避免的。为了减少内在膨胀的影响,我们可以合理设计对象的数据结构,尽量避免冗余和重复的数据成员和函数,同时使用继承和多态等面向对象的特性来提高代码的重用性和可维护性。此外,对于不常用的功能,可以考虑延迟加载或动态加载的方式,以减少对象内部数据结构的膨胀。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值