QT使用QComboBox时,下拉列表能正常显示,但点开下拉列表后崩溃在wincore.cpp中CallWindowProc处,显示读取冲突。求解

在QT项目中新建的对话框,其中QListWidget中插入item,item采用网格布局。在另外的mfc项目中调用该对话框

插入combobox行函数如下:
void qBmEditTypeDlg::insertComboBoxListItem(const QString& strName, const QStringList& strFamilyList, int nSel)
{
QWidget *wContainer = new QWidget(m_ui->listWidget);
QGridLayout *hLayout = new QGridLayout(wContainer);
hLayout->setHorizontalSpacing(0);
hLayout->setColumnStretch(0, 1);//设置列位置比值
hLayout->setColumnStretch(1, 1);
qBmBsParamValue paramv;
QLabel paramLabel = new QLabel(strName, wContainer);
paramLabel->setStyleSheet("QLabel{border-top:0px;border-right:1px dotted black;border-bottom:0px ;border-left:0px ;}");
QComboBox
valueLabel = new QComboBox(wContainer);
valueLabel->setStyleSheet("QComboBox { min-height: 20px; min-width: 60px;border-width:0; border-style:outset; }"
"QComboBox QAbstractItemView::item { min-height: 15px; min-width: 60px; }");//设置下拉框子项高度

valueLabel->addItems(strFamilyList);//此位置如果不添加,则不报错!!!但是添加也能正常显示

hLayout->addWidget(paramLabel, 0, 0);
hLayout->addWidget(valueLabel, 0, 1);
hLayout->setContentsMargins(0, 0, 0, 0);

QListWidgetItem *alarmItem = new QListWidgetItem(m_ui->listWidget);
QSize size = alarmItem->sizeHint();
alarmItem->setSizeHint(QSize(size.width(), 22));
m_ui->listWidget->setItemWidget(alarmItem, wContainer);

}
报错位置:

img

考虑可能是下拉框消息机制问题,并且如果不设置下拉框内容,或不点击combobox所在行,都不会报错。

你奔溃的原因不在这里,因为看不到你的代码。所以给你个解决思路
下拉框当点击qcombobox的项时,会触发信号

img


这三个都有可能触发,具体可以看下到底是触发哪一个信号。
然后到对应的槽函数中去查看到底做了什么事情。导致奔溃

通常的原因是槽函数中引用了非法的对象。
处理的方法:
(1)仔细检查槽函数中的对象,有没有非法引用。通常检查不出来,不是没有问题,而是自己看不出来。
(2)那就用这个笨方法:把槽函数的内容全部注释掉,只留一句 print 之类,看看能否报错。
如果不报错,说明问题确实出在槽函数内。那就一段一段注释,看看在哪里会保错。
通常来说,很快就能发现问题,才恍然大悟——“原来是这里的问题”

看到大家的的思路了,已经排除过槽函数问题,单纯保留显示,无响应操作也会导致崩溃。并且尝试过ui界面直接添加或者用代码添加的方式创建qComboBox,目前大致思路是点击后消息传递机制是否会有需要明确添加的指定内容,或者导致windows中消息回调函数读取崩溃是否是内存方面存在错误,传递的消息生命周期结束。

3.10
已经解决,确定是内存泄露引发的消息回调冲突问题。对话框类指针创建后会有某些情况导致还未手动释放就return掉,导致内存泄漏,并且该指针依然会触发消息,导致在windows dll中的消息回调函数仍然获取该野指针的消息响应,造成读取冲突。