msvcr80d.dll!_CrtIsValidHeapPointer(const void * pUserData=0x00ca9ad8) Line 2072 C++
msvcr80d.dll!_free_dbg_nolock(void * pUserData=0x00ca9ad8, int nBlockUse=1) Line 1279 + 0x9 bytes C++
msvcr80d.dll!_free_dbg(void * pUserData=0x00ca9ad8, int nBlockUse=1) Line 1220 + 0xd bytes C++
msvcr80d.dll!operator delete(void * pUserData=0x00ca9ad8) Line 54 + 0x10 bytes C++
WolfTable.exe!QModelIndex::`scalar deleting destructor'() + 0x46 bytes C++
WolfTable.exe!QList<QModelIndex>::node_destruct(QList<QModelIndex>::Node * from=0x00cbb354, QList<QModelIndex>::Node * to=0x00cbb354) Line 343 + 0x3e bytes C++
WolfTable.exe!QList<QModelIndex>::free(QListData::Data * data=0x00cbb340) Line 537 C++
WolfTable.exe!QList<QModelIndex>::~QList<QModelIndex>() Line 511 C++
> WolfTable.exe!MyTable::selectionChanged(const QItemSelection & selected={...}, const QItemSelection & deselected={...}) Line 98 + 0xf bytes C++
Beim Destruieren von mList gibt es einen Segmentation Fault (d.h. die Methode selectionChanged() wird vom Stack genommen). Eigentlich kann ich mir gar nicht vorstellen was da falsch sein soll.
Ist das ein QT Bug? Ich verwende die Version 4.4.0.
Christof
Zuletzt geändert von nasahl am 22. Dezember 2008 17:01, insgesamt 1-mal geändert.
Ob es ein Qt Bug ist, bin ich mir nicht sicher, aber wie ich in diesem Thread geschrieben hat, hängt es evtl. mit deinen Compilereinstellungen zusammen.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Mal abgesehen davon, dass VisualStudio den Parameter -Weffc++ nicht kennt, höchstens /W4 und scheinbar auch /Wall,... wärst Du so nett zu erklären warum dich das nicht wundert? Und was genau man beim Compiler "richtig" einstellen soll? Aus den 383 Warnungen die in den Qt und STL Headern in meinem Minimaltest gefunden wurden, konnte ich auf die schnelle nicht herauslesen warum der Destructor von QModelIndexList nen Absturz verursacht.
Um das Thema abzuschliessen habe ich mir einen Workaround geschrieben der meine Bedürfnisse erfüllt.
Ich habe eine Table mit SelectionMode QAbstractItemView::ContiguousSelection.
Für diesen Fall gibt es nur einen QTableWidgetSelectionRange als Selektionsrange. Diesen kann man auch händisch ermitteln:
QTableWidgetSelectionRange getSingleSelection()
{
static const int sNotSelected = -1;
int rowMax = rowCount();
int colMax = columnCount();
int row, col, startRow, startCol, endRow, endCol;
startRow = startCol = endRow = endCol = sNotSelected;
QAbstractItemModel* pModel = model();
for (row = 0; row < rowMax; ++row)
{
for (col = 0; col < colMax; ++col)
{
QModelIndex index = pModel->index(row, col, rootIndex());
if (selectionModel()->isSelected(index))
{
// Wir haben den Startpunkt des Selektionsrechtecks gefunden
startRow = row;
startCol = col;
break;
}
}
if (startRow > sNotSelected)
break;
}
if (startRow == sNotSelected)
return QTableWidgetSelectionRange(); // Wir haben keine Selektion gefunden !
// Erst suchen wir der Reihe nach ...
for (row = startRow+1; row < rowMax; ++row)
{
QModelIndex index = pModel->index(row, startCol, rootIndex());
if (!selectionModel()->isSelected(index))
{
break;
}
}
endRow = row-1;
// ... und dann der Spalte nach
for (col = startCol+1; col < colMax; ++col)
{
QModelIndex index = pModel->index(startRow, col, rootIndex());
if (!selectionModel()->isSelected(index))
{
break;
}
}
endCol = col-1;
return QTableWidgetSelectionRange(startRow, startCol, endRow, endCol);
}
Elegant (und performant) ist das wohl nicht - aber wenigstens funktionierts.