gpt4 book ai didi

Qt:使用 QListView 和 QFileSystemModel 浏览文件系统。如何突出显示文件夹中的第一项?

转载 作者:行者123 更新时间:2023-12-03 03:45:42 31 4
gpt4 key购买 nike

我正在没有键盘/鼠标的系统上执行该主题所说的操作,因此我需要“通过代码”来完成这项工作。当我更改 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 仍然可以工作。我怀疑我误解了如何使用此模型/ View ,但不知道是什么。

编辑:创建了一个更简单的示例,其中提到了@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) ,然后设置 View 以使用模型时,如果我正确设置索引, View 应该能够在 rp 的所有子文件夹中移动。我将重读有关模型/ View 、QListView 和 QFileSystemModel 的 Qtdocs,但想发布此内容以防有人理解发生了什么。

最佳答案

我从 here 得到了一些帮助这些是我的结论:

为了使 QFileSystemModel 正常工作,GUI 事件循环需要运行。我猜您因此添加了 QTimer::singleShot(...) 行?然而,你只给了它2秒钟。来自 QFileSystemModel 的文档:

Calls to rowCount() will return 0 until the model populates a directory.

这意味着在构建主窗口之后,您有 2 秒的时间来构建其他所有内容,启动 GUI 事件循环,然后让 QFileSystemModel 填充目录。失败的目录是否很大?我猜是这样。

您可以尝试的是给计时器更长的时间间隔。更好的解决方案可能是创建一个快捷方式来选择列表中的第一项,如下所示:

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

LightUpFirst 函数执行选择。希望有帮助!

关于Qt:使用 QListView 和 QFileSystemModel 浏览文件系统。如何突出显示文件夹中的第一项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7016877/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com