gpt4 book ai didi

c++ - 调用 setItemWidget 时崩溃

转载 作者:行者123 更新时间:2023-11-30 05:36:11 24 4
gpt4 key购买 nike

我正在使用 QTreeWidget 并在 QTreeWidget 中为 QTreeWidgetItem 设置一个小部件。它工作正常,但当我第二次执行相同操作时,应用程序崩溃了。

以下工作正常。

QTreeWidget* treewidget = new QTreeWidget();
QTreeWidgetItem* item0 = new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item0")));
treewidget->insertTopLevelItem(0,item0);
QSlider* slider0 = new QSlider();
treewidget->setItemWidget(item0, 0, slider0);

但是如果我再次添加最后一行,它在运行应用程序时会崩溃。

下面的崩溃了。

QTreeWidget* treewidget = new QTreeWidget();
QTreeWidgetItem* item0 = new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item0")));
treewidget->insertTopLevelItem(0,item0);
QSlider* slider0 = new QSlider();
treewidget->setItemWidget(item0, 0, slider0);
treewidget->setItemWidget(item0, 0, slider0); // Intentionally added to simulate the issue

以上是显示问题的示例,但在我的应用程序中,基于某些事件,我删除了树形小部件项目并稍后添加。当我设置项目小部件时(在稍后添加项目之后),我遇到了崩溃。

我想不通为什么。有任何想法吗?仅供引用,我使用的是 Qt 5.3.2 MSVC 2010,32 位。

最佳答案

treewidget->setItemWidget(item0, 0, slider0);
treewidget->setItemWidget(item0, 0, slider0);// Intentionally added to simulate the issue

我看Qt代码(4.x):

void QTreeWidget::setItemWidget(QTreeWidgetItem *item, int column, QWidget *widget)
{
Q_D(QTreeWidget);
QAbstractItemView::setIndexWidget(d->index(item, column), widget);
}

QAbstractItemView::setIndexWidget:

void QAbstractItemView::setIndexWidget(const QModelIndex &index, QWidget *widget)
{
Q_D(QAbstractItemView);
if (!d->isIndexValid(index))
return;
if (QWidget *oldWidget = indexWidget(index)) {
d->persistent.remove(oldWidget);
d->removeEditor(oldWidget);
oldWidget->deleteLater();
}

所以如果你添加 slider0 两次,那么在第一次调用时它被添加了,在几秒钟内调用 Qt 调用 deleteLater,然后添加它,确定这是您想要的吗?

关于c++ - 调用 setItemWidget 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33626808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com