gpt4 book ai didi

c++ - QFileDialog : force file name

转载 作者:行者123 更新时间:2023-12-02 10:13:31 24 4
gpt4 key购买 nike

我想创建一个 QFileDialog设置为 QFileDialog::AnyFile其中文件名是固定的(但位置可以更改)。
到目前为止,我发现了问题 QFileDialog - Saving a file with specified file name ,没有回答。
有直接选择目录的伪答案,这是我迄今为止在我的项目中所做的。然而,通过人们测试该程序,发现这令人困惑,因此不是一个可接受的答案。
到目前为止,我尝试的是导出 QFileDialog然后强制执行,但我不知道该尝试什么了。当点击不同的文件时,我设法通过对适当的信号使用react来重置文件名:

FixedFileDialog::FixedFileDialog(QWidget* parent) : QFileDialog(parent)
{
connect(this, SIGNAL(currentUrlChanged(const QString&)), this, SLOT(current_changed(const QString&)));
}

void FixedFileDialog::current_changed(const QString&)
{
selectFile(_filename);
}
( _filename 是一开始就设置的成员。)
到目前为止,这有效,但它不会阻止用户在行编辑中输入不同的名称。而且我还没有发现在这种情况下发出的任何信号。
另一个尝试是试图访问 QLineEdit小部件本身禁用它,但我不知道如何。我试过
QLineEdit* line_edit = dialog.d_func()->lineEdit();
( dialog 属于派生类。)
这不起作用,因为 d_func()QFileDialog 中是私有(private)的.
有人有其他想法该怎么做吗?

最佳答案

我必须承认,我想到的是一个肮脏的黑客。另一方面,OP对我来说似乎有些绝望。所以,我把它贴出来(带着一些疑问)。
由于OP的声明,我提出了我的想法:

QLineEdit* line_edit = dialog.d_func()->lineEdit();

(With dialog being of the derived class.)

This does not work, as d_func() is private in QFileDialog.


d_func()是私有(private)的,Qt 小部件提供了一种后门,因为它们的所有权管理可以被利用:
每个 QObject提供其子项的列表。所以,这个子树的简单遍历应该通过 QLineEdit in quest(这是我在 Qt 5.13 中的 QFileDialog 当前实现中唯一的一个)。
这是我在示例中尝试的:
/ Qt header:
#include <QtWidgets>

QLineEdit* findFirstQLineEdit(QWidget *pQWidget)
{
//qDebug() << "Inspect" << pQWidget;
const QObjectList pQObjs = pQWidget->children();
for (QObject *pQObj : pQObjs) {
if (QLineEdit *pQLineEdit = dynamic_cast<QLineEdit*>(pQObj)) {
qDebug() << "Found:" << pQLineEdit;
return pQLineEdit;
} else if (QWidget *pQWidget = dynamic_cast<QWidget*>(pQObj)) {
if (QLineEdit *pQLineEdit = findFirstQLineEdit(pQWidget)) {
return pQLineEdit;
}
}
}
return nullptr;
}

// main application
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// setup GUI
QFileDialog qFileDlg(nullptr,
QString::fromUtf8("Choose Dir. to Save File"),
QDir::currentPath());
qFileDlg.show();
// manipulate the file name input
qFileDlg.selectFile("CMakeLists.txt");
QLineEdit *const pQEdit = findFirstQLineEdit(&qFileDlg);
pQEdit->setReadOnly(true);
// runtime loop
return app.exec();
}
输出:
snapshot of testQFileDialogQLineEditReadOnly
文件名行编辑器是只读的。不允许编辑或删除,但仍可以从外部复制和更改内容。 (对于这种情况,OP 似乎已经找到了另一种解决方案。)
注:
我的第一个想法是调用 findFirstQLineEdit()在从 QFileDialog 派生的类的构造函数中.这没有用!调试输出证明 QFileDialog建成后没有 child 。我得出的结论是 QFileDialog 的 child 稍后创建——但肯定必须在 show() 之后创建.
要将这个 hack 嵌入到派生类中,在 QFileDialog::showEvent() 的覆盖中进行操作可能就足够了。 . (我没有测试它。)

关于c++ - QFileDialog : force file name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62693736/

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