QSortFilterProxyModel, QFileSystemModel & HeapCrash inklusiv
Verfasst: 1. September 2014 15:22
Hi fleißige Helfer,
ich habe fogendes Problem.
Aufgrund eines Kundenwunsches sollen Mitarbeiter nur Dateien aus einem ganz bestimmten Verzeichnis auswählen können.
Die Dateien müssen aus mind 1Buchstab+(.dot)+cvs bestehen.
Da der FileDialog das nicht so ganz bewerkstelligt wollte ich den "Umweg" über ein QFileSystemModel , inkl eines QSortFilterProxyModel.
Hier erstmal der Code:
im Klassenkonstruktor
der angesprungene Slot:
Dialog nur fix provisorisch reingebaut zum testen.
Problem a)
Mein Filter scheint so nicht zu funzen(RegExp ist aber richtig, an Online-Testern ausgetestet).
Mit QRegExp ist der Tree leer, ohne sind die Laufwerksbuchstaben drin. In dem Path ist mit 100% Sicherheit eine *.csv Datei drin.
Problem b)
Wenn die Klasse beendet wird, fliegen logischerweise die Member mit raus. Das führt immer zu einem Heap-Fehler. Dort scheinen noch updates gestartet zu werden aber währenddessen fliegt das ganze QTreeWidget weg.
Auszug aus dem Debugger:
Kann ev wer helfen?
Vielen Dank bereits im Voraus.
ich habe fogendes Problem.
Aufgrund eines Kundenwunsches sollen Mitarbeiter nur Dateien aus einem ganz bestimmten Verzeichnis auswählen können.
Die Dateien müssen aus mind 1Buchstab+(.dot)+cvs bestehen.
Da der FileDialog das nicht so ganz bewerkstelligt wollte ich den "Umweg" über ein QFileSystemModel , inkl eines QSortFilterProxyModel.
Hier erstmal der Code:
im Klassenkonstruktor
Code: Alles auswählen
//m_fileModel im .h definiert als QFileSystemModel m_fileModel;
O_VERIFY(connect(&m_fileModel,SIGNAL(directoryLoaded(const QString &)),this,SLOT(installFileProxyModel(const QString &))));
m_fileModel.setFilter(QDir::Files);
m_fileModel.setRootPath(path);
Dialog nur fix provisorisch reingebaut zum testen.
Code: Alles auswählen
void OArticleManagement::installFileProxyModel(const QString & path) {
//m_fileProxyModel in .h definiert als std::shared_ptr<QSortFilterProxyModel> m_fileProxyModel;
m_fileProxyModel.reset(new QSortFilterProxyModel(nullptr));
m_fileProxyModel->setSourceModel(&m_fileModel);
m_fileProxyModel->setFilterRegExp(QRegExp("^.+\.(?:[cC][sS][vV])$"));//mind 1 Buchstabe und .csv(Groß-Kleinschreibung egal)
m_fileProxyModel->setDynamicSortFilter(true);
//tree in .h definiert als QTreeView tree
tree.setModel(m_fileProxyModel.get());
tree.setSortingEnabled(true);
tree.setAnimated(false);
tree.setIndentation(20);
tree.setRootIndex(m_fileProxyModel->mapFromSource(m_fileModel.index(path)));
tree.header()->setResizeMode(QHeaderView::ResizeToContents);
mainLayout.addWidget(&tree,0,0);
dialog.setLayout(&mainLayout);
dialog.exec();
}
Mein Filter scheint so nicht zu funzen(RegExp ist aber richtig, an Online-Testern ausgetestet).
Mit QRegExp ist der Tree leer, ohne sind die Laufwerksbuchstaben drin. In dem Path ist mit 100% Sicherheit eine *.csv Datei drin.
Problem b)
Wenn die Klasse beendet wird, fliegen logischerweise die Member mit raus. Das führt immer zu einem Heap-Fehler. Dort scheinen noch updates gestartet zu werden aber währenddessen fliegt das ganze QTreeWidget weg.
Auszug aus dem Debugger:
Code: Alles auswählen
> msvcr100d.dll!operator delete(void * pUserData) Line 52 + 0x51 bytes C++
QtGuid4.dll!QTreeView::`vector deleting destructor'() + 0x5e bytes C++
QtCored4.dll!QObjectPrivate::deleteChildren() Line 1935 + 0x24 bytes C++
QtGuid4.dll!QWidget::~QWidget() Line 1682 C++
QtGuid4.dll!QDialog::~QDialog() Line 329 + 0xf bytes C++
editor_oetikerD.dll!otto::OArticleManagement::~OArticleManagement() Line 29 + 0x1c bytes C++
Vielen Dank bereits im Voraus.