gpt4 book ai didi

c++ - 接受单个文件或单个目录的 QFileDialog

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:22 25 4
gpt4 key购买 nike

是否可以显示一个 QFileDialog,用户可以在其中选择文件或目录?

QFileDialog::getOpenFileName() 只接受文件,而 QFileDialog::getExistingDirectory() 只接受目录,但我需要显示一个可以接受文件的对话框文件或目录(这对我的程序有意义)。 QFileDialog::Options 没有任何希望。

最佳答案

QFileDialog 目前不支持这个。我认为这里的主要问题是 FileMode不是 Q_FLAGS并且这些值也不是 2 的幂,因此,您无法通过编写此代码来解决此问题。

setFileMode(QFileDialog::Directory|QFileDialog::ExistingFiles)

要解决这个问题,您需要进行一些操作,例如:

  • 覆盖打开按钮的点击操作。

  • 正确获取文件和目录的“ TreeView ”索引。

我在下面的尝试演示了前者,但我并没有真正解决第二个问题,因为这似乎涉及对选择模型的更多调整。

main.cpp

#include <QFileDialog>
#include <QApplication>
#include <QWidget>
#include <QTreeWidget>
#include <QPushButton>
#include <QStringList>
#include <QModelIndex>
#include <QDir>
#include <QDebug>

class FileDialog : public QFileDialog
{
Q_OBJECT
public:
explicit FileDialog(QWidget *parent = Q_NULLPTR)
: QFileDialog(parent)
{
setOption(QFileDialog::DontUseNativeDialog);
setFileMode(QFileDialog::Directory);
// setFileMode(QFileDialog::ExistingFiles);
for (auto *pushButton : findChildren<QPushButton*>()) {
qDebug() << pushButton->text();
if (pushButton->text() == "&Open" || pushButton->text() == "&Choose") {
openButton = pushButton;
break;
}
}
disconnect(openButton, SIGNAL(clicked(bool)));
connect(openButton, &QPushButton::clicked, this, &FileDialog::openClicked);
treeView = findChild<QTreeView*>();
}

QStringList selected() const
{
return selectedFilePaths;
}

public slots:
void openClicked()
{
selectedFilePaths.clear();
qDebug() << treeView->selectionModel()->selection();
for (const auto& modelIndex : treeView->selectionModel()->selectedIndexes()) {
qDebug() << modelIndex.column();
if (modelIndex.column() == 0)
selectedFilePaths.append(directory().absolutePath() + modelIndex.data().toString());
}
emit filesSelected(selectedFilePaths);
hide();
qDebug() << selectedFilePaths;
}

private:
QTreeView *treeView;
QPushButton *openButton;
QStringList selectedFilePaths;
};

#include "main.moc"

int main(int argc, char **argv)
{
QApplication application(argc, argv);
FileDialog fileDialog;
fileDialog.show();
return application.exec();
}

主程序

TEMPLATE = app
TARGET = main
QT += widgets
CONFIG += c++11
SOURCES += main.cpp

构建并运行

qmake && make && ./main

关于c++ - 接受单个文件或单个目录的 QFileDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27520304/

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