Portál AbcLinuxu, 14. listopadu 2025 00:05
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...
.
Pohybovat se v seznamu chci jako v klasickém souborovém manažeru, tedy enter dovnitř adresáře či spustit soubor, backspace o úroveň výš. To funguje dobře (tedy zde problém nehledám), pouze se nenastavuje ten šílený krusor tam kam má, tedy po vstupu do nějaké cesty nejlépe vždy na první řádek.
Ř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()));
}
. Dík moc za radu. Testnu to a dám vědět jak jsem dopadnul.
.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.