Я делаю то, что говорится в теме, в системе без клавиатуры / мыши, поэтому мне нужно сделать эту работу "из кода".Когда я изменяю RootIndex QListView, я хочу выделить первую строку.
Вот 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, если я правильно установил индексы.Я перечитываю Qtdocs в Model / View, QListView и QFileSystemModel, но хотел опубликовать это на тот случай, если кто-то поймет, что происходит.