Using QTableView/QStyledItemDelegate Issue w/closeAndCommitEditor() coredump
-
Qt5
I am using an example straight out the book 'Advanced Qt Programming'Have a cell in QTableView that when 'double click' generates
a QLineEdit widget where I override the QStyledItemDelegate::createEditor(),
setEditorData(), setModelData() functions. Everything is working fine. However,
the 'core dump' situations arises when the user types in something that is
not allowed ( i.e. certain text words are reserved ) - So I need to notify
the user with a QMessageBox() that this text is reserved. I am not sure
why this is causing the problem:Here is the code excerpts to show what I am doing:
The core dump occurs in the function closeAndCommitEditorLE()
which is called when the user hits Return in the QLineEdit editor.It only occurs after a call to issueDuplicateNameWarning() is called
which popups a QMessageBox() warning. I am using exec() to keep things
simple here. When the user clicks on OK the exec() call returns
and my next step is to call: emit closeEditor(pLineEdit). It is
here that the core dump occurs. I have no clue as to why. The stacktrace
is not very clear on what is occurring at this point. I can provide the stacktrace if
anyone would like to see it.I have been looking at this and debugging for several days and still not sure
why what i am doing is causing such problems. Any feedback, comments or advice
would be much appreciated.QWidget *DeviceObjectItemDelegate::createEditor(
QWidget *parent,
const QStyleOptionViewItem & option,
const QModelIndex & index ) const
{
if ( index.column() == S_DEV_OBJ_NAME )
{
QLineEdit pEditor = new QLineEdit(parent);
/ If the user presses Return or Enter, we take this as confirmation- of their edit.
*/
connect( pEditor, &QLineEdit::returnPressed,
this, &DeviceObjectItemDelegate::closeAndCommitEditorLE) ;
return pEditor;
}
else
{
return QStyledItemDelegate::createEditor( parent, option, index );
}
}
void DeviceObjectItemDelegate::setEditorData(
QWidget *editor,
const QModelIndex & index ) const
{
else if ( index.column() == S_DEV_OBJ_NAME )
{
QString deviceName = index.model()->data(index).toString();
QLineEdit *pLineEdit = qobject_cast<QLineEdit *>(editor);
pLineEdit->setText( deviceName);
}
else
{
QStyledItemDelegate::setEditorData( editor, index );
}
}void DeviceObjectItemDelegate::setModelData(
QWidget *editor,
QAbstractItemModel *model,
const QModelIndex & index ) const
{
if ( index.column() == S_DEV_OBJ_NAME )
{
QLineEdit *pLineEdit = qobject_cast<QLineEdit *>(editor);
printf( "setModelData[%s]\n", pLineEdit->text().toStdString().c_str() );
model->setData( index, pLineEdit->text() );
}
else
{
QStyledItemDelegate::setModelData( editor, model, index );
}
}void DeviceObjectItemDelegate:: closeAndCommitEditorLE()
{
QLineEdit pLineEdit = qobject_cast<QLineEdit>(sender() );
QString Name = pLineEdit->text();
m_pLineEditor = pLineEdit;bool bIsDuplicate = m_pDuplicateDeviceNames->doesNameAlreadyExist(m_deviceType ,
m_tableType, Name );if ( bIsDuplicate)
{
/* Name already exists - alert the user */
issueDuplicateNameWarning( Name );
/ ERROR OCCURS WHEN THE NEXT LINE IS EXECUTED /
emit closeEditor( pLineEdit);
emit clearOkToUpdateFlag();
return;
}setFlag( true );
emit commitData( pLineEdit);
emit closeEditor( pLineEdit);
emit clearOkToUpdateFlag();
}void DeviceObjectItemDelegate:: issueDuplicateNameWarning(
const QString & Name )
{
QMessageBox msgBox;
msgBox.setIcon(QMessageBox::Warning);
msgBox.setWindowTitle("Device Type Name - Duplicate" );
msgBox.setText("Duplicate Device Type Names are NOT allowed!");
msgBox.setInformativeText(tr("The Device Type Name [%1] is already in use.").arg(Name));
msgBox.exec();
} - of their edit.
-
Qt5
I am using an example straight out the book 'Advanced Qt Programming'Have a cell in QTableView that when 'double click' generates
a QLineEdit widget where I override the QStyledItemDelegate::createEditor(),
setEditorData(), setModelData() functions. Everything is working fine. However,
the 'core dump' situations arises when the user types in something that is
not allowed ( i.e. certain text words are reserved ) - So I need to notify
the user with a QMessageBox() that this text is reserved. I am not sure
why this is causing the problem:Here is the code excerpts to show what I am doing:
The core dump occurs in the function closeAndCommitEditorLE()
which is called when the user hits Return in the QLineEdit editor.It only occurs after a call to issueDuplicateNameWarning() is called
which popups a QMessageBox() warning. I am using exec() to keep things
simple here. When the user clicks on OK the exec() call returns
and my next step is to call: emit closeEditor(pLineEdit). It is
here that the core dump occurs. I have no clue as to why. The stacktrace
is not very clear on what is occurring at this point. I can provide the stacktrace if
anyone would like to see it.I have been looking at this and debugging for several days and still not sure
why what i am doing is causing such problems. Any feedback, comments or advice
would be much appreciated.QWidget *DeviceObjectItemDelegate::createEditor(
QWidget *parent,
const QStyleOptionViewItem & option,
const QModelIndex & index ) const
{
if ( index.column() == S_DEV_OBJ_NAME )
{
QLineEdit pEditor = new QLineEdit(parent);
/ If the user presses Return or Enter, we take this as confirmation- of their edit.
*/
connect( pEditor, &QLineEdit::returnPressed,
this, &DeviceObjectItemDelegate::closeAndCommitEditorLE) ;
return pEditor;
}
else
{
return QStyledItemDelegate::createEditor( parent, option, index );
}
}
void DeviceObjectItemDelegate::setEditorData(
QWidget *editor,
const QModelIndex & index ) const
{
else if ( index.column() == S_DEV_OBJ_NAME )
{
QString deviceName = index.model()->data(index).toString();
QLineEdit *pLineEdit = qobject_cast<QLineEdit *>(editor);
pLineEdit->setText( deviceName);
}
else
{
QStyledItemDelegate::setEditorData( editor, index );
}
}void DeviceObjectItemDelegate::setModelData(
QWidget *editor,
QAbstractItemModel *model,
const QModelIndex & index ) const
{
if ( index.column() == S_DEV_OBJ_NAME )
{
QLineEdit *pLineEdit = qobject_cast<QLineEdit *>(editor);
printf( "setModelData[%s]\n", pLineEdit->text().toStdString().c_str() );
model->setData( index, pLineEdit->text() );
}
else
{
QStyledItemDelegate::setModelData( editor, model, index );
}
}void DeviceObjectItemDelegate:: closeAndCommitEditorLE()
{
QLineEdit pLineEdit = qobject_cast<QLineEdit>(sender() );
QString Name = pLineEdit->text();
m_pLineEditor = pLineEdit;bool bIsDuplicate = m_pDuplicateDeviceNames->doesNameAlreadyExist(m_deviceType ,
m_tableType, Name );if ( bIsDuplicate)
{
/* Name already exists - alert the user */
issueDuplicateNameWarning( Name );
/ ERROR OCCURS WHEN THE NEXT LINE IS EXECUTED /
emit closeEditor( pLineEdit);
emit clearOkToUpdateFlag();
return;
}setFlag( true );
emit commitData( pLineEdit);
emit closeEditor( pLineEdit);
emit clearOkToUpdateFlag();
}void DeviceObjectItemDelegate:: issueDuplicateNameWarning(
const QString & Name )
{
QMessageBox msgBox;
msgBox.setIcon(QMessageBox::Warning);
msgBox.setWindowTitle("Device Type Name - Duplicate" );
msgBox.setText("Duplicate Device Type Names are NOT allowed!");
msgBox.setInformativeText(tr("The Device Type Name [%1] is already in use.").arg(Name));
msgBox.exec();
}@ShawnZ said in Using QTableView/QStyledItemDelegate Issue w/closeAndCommitEditor() coredump:
I can provide the stacktrace if
anyone would like to see it.Yes please. It might contain more information useful for the hardcores here :)
- of their edit.
-
If you comment call to issueDuplicateNameWarning, does it still crash?
if not, do not call it there, you could use timer single shot instead to initiate call to the slot when event loop become idle.