修改 QFileDialog::getOpenFileName 有一个额外的下拉
Posted
技术标签:
【中文标题】修改 QFileDialog::getOpenFileName 有一个额外的下拉【英文标题】:Modifying QFileDialog::getOpenFileName to have an additional drop down 【发布时间】:2012-03-14 17:50:59 【问题描述】:我是一名学生程序员,使用 Qt 为我的公司构建阅读器表。该阅读器既是编辑器又是转换器。它读入一个 .i 文件,允许对文本文档进行表格编辑,然后输出一个 .scf 文件,该文件本质上是一个分隔值文件,堆叠在带有标题的图例下。我离题了...基本上导入的文件格式很难扫描和读取(几乎不可能)所以我想要修改打开的文件 preBuilt QFileDialog 以在选择旧文件类型时包含一个额外的下拉列表来声明他们的模板标题。
当用户选择 .i 扩展文件(选项 2 文件类型)时,我想启用一个额外的下拉菜单以允许用户选择它是哪种类型的 .i 文件(选择模板)。这样我就不必处理天知道有多少小时试图找出一种方法将所有标题索引到每种不同类型的表中。目前我的 importFile 函数使用以下方法调用对话框:
QString fileLocation = QFileDialog::getOpenFileName(this,("Open File"), "", ("Simulation Configuration File(*.scf);;Input Files(*.prp *.sze *.i *.I *.tab *.inp *.tbl)")); //launches File Selector
我一直在参考QFileDialog Documentation 试图找到我需要的解决方案,但无济于事。感谢您阅读我的帖子,并提前感谢您对此提供的任何指导。
2012 年 3 月 16 日更新; 首先,我要感谢 Masci 对此事的最初支持。下面是我收到的错误的连接语句。
//Declared data type
QFileDialog openFile;
QComboBox comboBoxTemplateSelector;
connect(openFile, SIGNAL(currentChanged(const &QString)), this, SLOT(checkTemplateSelected()));
openFile.layout()->addWidget(comboBoxTemplateSelector);
我还注意到它不喜欢我将 QComboBox 添加到修改后的对话框布局的方式(这是第二个错误)。我真的希望我只是在这里做一些愚蠢的事情,这是一项容易克服的任务。
针对 tmpearce 的评论,这是我的标头代码;
#include <QWidget>
namespace Ui
class ReaderTable;
class ReaderTable : public QWidget
Q_OBJECT
public:
explicit ReaderTable(QWidget *parent = 0);
~ReaderTable();
public slots:
void checkTemplateSelected();
void importFile();
void saveFile();
private:
Ui::ReaderTable *ui;
;
感谢您的阅读,并提前感谢您为本次挑战做出的任何贡献!
【问题讨论】:
您是否有理由不能只检查返回的QString
,并在必要时弹出第二个带有下拉菜单的对话框?这将(可能)比尝试修改 QFileDialog 以获得额外的功能更直接。
好吧,如果您想在文件对话框打开时执行此操作,请查看QFileDialog::fileSelected
信号。这将要求您不要使用静态函数getOpenFileName
- 相反,自己创建一个对话框并将此信号连接到一个插槽,您可以从中弹出带有下拉菜单的自定义对话框(如果选择了该文件类型),每次点击一个项目时都会发生这种情况。
你的第二个错误是因为你需要给组合框一个指针:addWidget(&comboBoxTemplateSelector)
如果您没有在public slots:
下定义目标函数,如果您没有在类定义中包含Q_OBJECT
宏,或者如果您没有运行,则可能会发生第一个错误moc
工具。
看起来你混淆了值和指针参数,并且把 &
也放在了参数的错误位置。
【参考方案1】:
实例化一个 QFileDialog(不要调用 getOpenFileName 静态方法),访问它的布局并向它添加一个禁用的 QComboBox。
// mydialog_ and cb_ could be private fields inside MyClass
mydialog_ = new QFileDialog;
cb_ = new QComboBox;
cb_->setEnabled(false);
connect(mydialog, SIGNAL(currentChanged(const QString&)), this, SLOT(checkFilter(const QString&)));
mydialog_->layout()->addWidget(cb_);
if (mydialog_->exec() == QDialog::Accepted)
QString selectedFile = mydialog_->selectedFiles()[0];
QString cbSelection = cb_->currentText();
插槽将类似于:
void MyClass::checkFilter(const QString& filter)
cb_->setEnabled(filter == "what_you_want");
从 exec() 对话框返回,您可以检索选定的文件和 cb_ 当前选择。 请注意,您可以在对话框底部添加比简单 QComboBox 更复杂的内容,以处理 gui 装饰。
实际上,我不太喜欢这种方法(但这正是您要求的 :-)。我会做一个这样的简单对话框:
仅当所选文件符合您的条件时才启用组合。 “浏览”按钮可以调用QFileDialog中的getOpenFileMethod静态方法。
【讨论】:
我喜欢这个解决方案;它是否有效取决于布局是否以令人愉悦的方式处理额外的组合框(或完整的小部件),以及如何强制用户实际选择其中一个选项。这就是我建议子类化的原因,但这也许可以发挥作用。 @tmpearce 同意。我尝试了 PyQt,在对话框中附加了一个简单的 QLabel,我认为需要做一些工作来对齐,无论如何“取消”和“打开”按钮都会保留在添加的小部件上方。 连接语句有问题;我理解这个概念,但我不确定我是否在呼吁正确的事情。另一个奇怪的事件是 SIGNAL 字段没有填充任何类型的智能感知,这让我想知道信号是如何在这里传递的。我试过:connect(openFile, SIGNAL(openFile.filterSelected("Input Files(*.prp *.sze *.i *.I *.tab *.inp *.tbl)")), this, SLOT(checkTemplateSelected() ));和连接(openFile,SIGNAL(currentChanged(const &QString)),这个,SLOT(checkTemplateSelected()));这里有什么建议吗? 正确的连接是:connect(openFile, SIGNAL(currentChanged(const &QString)), this, SLOT(checkTemplateSelected()));什么错误?【参考方案2】:您可以通过此信号处理项目选择:void QFileDialog::fileSelected ( const QString & file )
然后它发生了,用你想要的类型调用setFilter
。
对不起,如果我不明白你的任务。
【讨论】:
以上是关于修改 QFileDialog::getOpenFileName 有一个额外的下拉的主要内容,如果未能解决你的问题,请参考以下文章