5

キーボード/マウスのないシステムでトピックが言うことをしているので、「コードから」これを機能させる必要があります。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 を読み直しますが、誰かが何が起こっているのかを理解している場合に備えて投稿したいと思います。

4

2 に答える 2

2

ここからいくつかの助けがありましたが、これらが私の結論です:

QFileSystemModel が正しく機能するためには、GUI イベント ループが実行されている必要があります。このために行を追加したと思いますQTimer::singleShot(...)か?ただし、2秒しか与えませんでした。QFileSystemModelのドキュメントから:

モデルがディレクトリに入力するまで、rowCount() を呼び出すと 0 が返されます。

これは、MainWindow が構築された後、他のすべてが構築され、GUI イベント ループが開始され、QFileSystemModel がディレクトリに入力されるまでに 2 秒かかることを意味します。これが失敗しているディレクトリは大きいですか? 私はそう推測しています。

あなたが試すことができるのは、タイマーの間隔を長くすることです。より良い解決策は、次のようにリストの最初のものを選択するショートカットを作成することです。

QShortcut* sh = new QShortcut(QKeySequence("Ctrl+1"), this);
connect(sh, SIGNAL(activated()), this, SLOT(LightUpFirst()));

LightUpFirst 関数が選択を行います。それが役立つことを願っています!

于 2011-08-11T15:40:22.340 に答える
2

私は今それが働いていると思います。リストの rootIndex を変更した後、モデルが機能するまで待つ必要があります。モデルから directoryLoaded 信号を取得するまで、新しいディレクトリに currentIndex を設定しません。ハイライトが機能するようになりました。モデルからのデータはソートされていないため、結局、row=0 & col=0 はリストの最初の項目ではありませんが、それは別のトピックです :)

編集:今夜これをもう少しいじって、最後の仕上げを追加しました。

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);

    list = new QListView;
    list->setModel(model);
    list->show();

    connect(model,
            SIGNAL(directoryLoaded(QString)),
            this,
            SLOT(model_directoryLoaded(QString)));

    QTimer::singleShot(2000, this, SLOT(changeRoot()));
}

void MainWindow::model_directoryLoaded(QString path)
{
    qDebug() << "loaded" << path;
    model->sort(0, Qt::AscendingOrder);
    list->setCurrentIndex(model->index(0, 0, list->rootIndex()));
}

void MainWindow::changeRoot()
{
    qDebug() << "changeRoot";
    model->setRootPath(rp + "/trunk");
    list->setRootIndex(model->index(rp + "/trunk"));
}

MainWindow::~MainWindow()
{
    delete list;
    delete model;
    delete ui;
}
于 2011-08-12T08:02:12.350 に答える