c++ 在qt中QFileDialog的setsuffix在linux中不起作用,怎么解决?

sr4lhrrt  于 2023-02-14  发布在  Linux
关注(0)|答案(2)|浏览(183)

我正在为我的qt应用程序创建一个保存对话框,一切正常,但是如果没有在文件名后面添加文件扩展名,即使选择了过滤器,它也不会自动保存为文件扩展名。
我知道我需要设置一个defaultsuffix选项,但是即使我这样做了,如果没有给出扩展名,它仍然不会自动添加。
我发现了其他几个类似的问题,我读到它在windows下可以工作,但在linux发行版上可能会失败。如果是这样,有简单的解决方案吗?因为现在,我没有一个工作的解决方案...

void MainWindow::on_actionSave_Chart_As_triggered()
{
    QFileDialog *fileDialog = new QFileDialog;
    fileDialog->setDefaultSuffix("files (*);;AstroQt aqt (*.aqt)");
    QString fileName = fileDialog->getSaveFileName(this, "Save Radix", ui->label_2->text() +".aqt", "AstroQT(*.aqt)");

    qDebug() << " save file name " << fileName << endl;

    QFile file(fileName);
    if (!file.open(QFile::WriteOnly | QFile::Text)) {
        QMessageBox::warning(this, "Warning", "Cannot save file: " + file.errorString());
        return;
    }

    setWindowTitle(fileName);

    QTextStream out(&file);
    QString text = "text that will be saved...";

    out << text;
    file.close();
}

编辑:在尝试了多种解决方案之后,似乎没有一个能起作用。但我想应该起作用。不然为什么还有aftersuffix函数...?目前我手动解决了这个问题。但我对它不满意,应该有更好的解决方案/解释。

// add extension if none is found.
if(!fileName.endsWith(".aqt"))
   fileName.append(".aqt");
7vux5j2d

7vux5j2d1#

如果你使用静态方法getSaveFileName,事情似乎可以正常工作:

#include <QFileDialog>
#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QString fileName = QFileDialog::getSaveFileName(
        nullptr, QObject::tr("Save File"),
        "teste.aqt",
        QObject::tr("AstroQt (*.aqt)"));

    qDebug() << " save file name " << fileName << endl;
    return app.exec();
}

如果我键入不带扩展名的内容,我会得到带扩展名的正确文件名。

dy1byipe

dy1byipe2#

如果你看一下QFileDialog文档,你会发现getSaveFileName()是一个静态函数。正因为如此,这个方法无法访问使用setDefaultSuffix()的类的示例的成员。因此,无论你在fileDialog->setDefaultSuffix(...)中设置什么,都与getSaveFileName()函数的功能无关。
为了让它工作,你必须直接从示例运行对话框。你应该这样做:

QFileDialog fileDialog(this, "Choose file to save");
fileDialog.setDefaultSuffix("json");
fileDialog.setNameFilter("json-files (*.json)");
fileDialog.exec();

QFile f(fileDialog.selectedFiles().first());
QFileInfo fileInfo(f);
QString FILE_NAME(fileInfo.fileName());

相关问题