キーボード/マウスのないシステムでトピックが言うことをしているので、「コードから」これを機能させる必要があります。QListView の RootIndex を変更すると、最初の行を強調表示したいと思います。
これは、私が作成した小さなテストプロジェクトの mainwindow.cpp です。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QEvent>
#include <QKeyEvent>
#include <QDebug>
#include <QTimer>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
model = new QFileSystemModel;
model->setRootPath("/Users/anders/Downloads/Browser");
listView = new QListView;
listView->setModel(model);
listView->show();
QTimer::singleShot(2000, this, SLOT(LightItUp1()));
}
void MainWindow::LightItUp1()
{
qDebug("LightItUp1");
listView->setRootIndex(model->index("/Users/anders/Downloads"));
listView->setCurrentIndex(model->index(0, 0, listView->rootIndex()));
QTimer::singleShot(2000, this, SLOT(LightItUp2()));
}
void MainWindow::LightItUp2()
{
qDebug("LightItUp2");
listView->setRootIndex(model->index("/Users/anders/Downloads/Browser"));
listView->setCurrentIndex(model->index(0, 0, listView->rootIndex()));
QTimer::singleShot(2000, this, SLOT(LightItUp3()));
}
void MainWindow::LightItUp3()
{
qDebug("LightItUp3");
listView->setRootIndex(model->index("/Users/anders/Downloads"));
listView->setCurrentIndex(model->index(0, 0, listView->rootIndex()));
QTimer::singleShot(2000, this, SLOT(LightItUp4()));
}
void MainWindow::LightItUp4()
{
QString p = "/Users/anders/Downloads/Mail";
listView->setRootIndex(model->index(p));
listView->setCurrentIndex(model->index(0, 0, listView->rootIndex()));
}
MainWindow::~MainWindow()
{
delete listView;
delete model;
delete ui;
}
この例では、LightItUp 1 ~ 3 は希望どおりに機能しますが、LightItUp4 はそうではありません。2 と 4 のフォルダを入れ替えると、どちらもやりたいことを実行できませんが、1 と 3 はまだ機能します。このモデル/ビューの使用方法について何か誤解していると思われますが、何がわかりません。
編集: エラー チェック @buck を使用して、より簡単な例を作成しました。ソースコードのコメントを参照してください。
const QString rp = "/home/anders/src/";
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
model = new QFileSystemModel;
model->setRootPath(rp); //using model->setRootPath(rp + "/trunk") instead works
listView = new QListView;
listView->setModel(model);
listView->show();
QTimer::singleShot(2000, this, SLOT(LightItUp1()));
}
void MainWindow::LightItUp1()
{
qDebug("LightItUp1");
QModelIndex p = model->index(rp + "/trunk");
if (!p.isValid()) {
qDebug("index not valid\n");
return;
}
//model->setRootPath(rp + "/trunk") here does not make it work
listView->setRootIndex(p);
listView->setCurrentIndex(model->index(0, 0, p));
}
モデルで setRootPath(rp) を実行し、モデルを使用するようにビューを設定すると、インデックスを正しく設定すれば、ビューは rp のすべてのサブフォルダー内を移動できるはずだと思いました。Model/View、QListView、QFileSystemModel の Qtdocs を読み直しますが、誰かが何が起こっているのかを理解している場合に備えて投稿したいと思います。