Portál AbcLinuxu, 7. května 2025 17:13
mFileBoxWidget::mFileBoxWidget(QWidget *parent) :
QTableView(parent)
,model(new QFileSystemModel())
{
this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
this->setShowGrid(false);
this->verticalHeader()->setVisible(false);
this->installEventFilter(this);
model->setReadOnly(true);
this->setModel(model);
this->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch );
this->setColumnWidth(1,70);
this->setColumnWidth(2,70);
this->setColumnWidth(3,110);
this->setRootIndex(model->setRootPath("C://"));
this->setSelectionMode(QAbstractItemView::SingleSelection);
this->setSelectionBehavior(QAbstractItemView::SelectRows);
//this->selectRow(0); //Does not work - goto first row
//this->setCurrentIndes(Index); //Does not work - goto index x=0 y=0
}
Vyzkoušel jsem již všechno.
a) tento kód je tvořen jako přetížení qwidget. Zkusil jsem to přepsat tak, že přímo založím mainwindow, do něj vložím qtableview a pak přidám QFileSystemModel
b) Myslel jsem že problém je v názvu model (takže jsem jej přejmenoval na myModel)
c) Myslel jsem že problém je v tom že akrivuju view před model. Takže jsem zajistil aby byl model aktivovaný dříve.
d) Myslel jsem že problém je ve verzi QT (používám 5.0). Otestoval jsem to v 4.8, 5.0, 5.1, všude stejné.
Problém je přesně v tom, že kursor i přes pokus jej nastavit končí vždy kde se mu zamane. Navíc pokud začnu procházet podadresáře, časem se program úplně zhroutí na chybu:
Microsoft Visual C++ Runtime Library --------------------------- This application has requested the Runtime to terminate it in an unusual way.Zdá se jako by byl kursor v nestandardní poloze, a při pokusu řídit jej šipkou dolů/nahoru spadne na tuto chybu. Pokud použiji myš, program nespadne, ale kursor je samozřejmě pokaždé někde víte kde...
Řešení dotazu:
Tak v "postup sestavování" mám na prvním místě qmake:
qmake.exe D:\home\all\develop\qt5\mManager\mManager.pro -r -spec win32-g++ "CONFIG+=debug" "CONFIG+=declarative_debug" "CONFIG+=qml_debug"
a na druéhém místě ming32
this->setCurrentIndex(model->index(0, 0));nebo
this->setCurrentIndex("/ceste/k/souboru/ktery/je/jako/prvni");V té ukázce není definována proměnná Index, takže těžko z toho říct, co tam vlastně dáváš. Ty pády jsou pravděpodobně tím, že to pak nastaví index na nějaký neplatný a když to k tomu přistoupí, tak to spadne. Pomocí debuggeru se dá docela snadno podívat co to tam dává.
No samosebou ze v indexu mam (0,0) . Obe uvadene varianty jsem zkousel. Vsechny varianty jsem zkousel, proste podle mne je chyba v QFileSystemModelu.
Si to klidne vyzkousejte, Udelejte obycejne mainwindow, do nej dejte jedno qtableview a do qtableview priradte model qfilesystemmodel.
Pokud cestu nastavite jinak nez pres m_tableView->setRootIndex(myModel->setRootPath(QDir::homePath())); proste se vam kursor na prvni radek nepodari dostat.
Nechapu to... bud je chyba v modelu a nebo delam neco blbe, ale nechapu co.connect(model, SIGNAL(directoryLoaded(QString)), this, SLOT(onLoaded())); void MainWindow::onLoaded() { QModelIndex index = model->index(model->rootPath()); view->setCurrentIndex(index.child(0, index.column())); }
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.