【问题标题】:QFileDialog unicode directory not availableQFileDialog unicode 目录不可用
【发布时间】:2017-03-08 19:47:49
【问题描述】:

我正在尝试使用 QFileDialog 获取文件路径,编译正常,但是当我从应用程序打开对话框时,会弹出此窗口:

路径中似乎缺少字母“á”。

即使我尝试通过快速访问打开桌面,它也会弹出(顺便说一句。我使用的是 windows 10 64 位)

Qt 版本:5.7.0

编译器:Microsoft Visual C++ 编译器 14.0 (amd64)

有人可以帮我解决吗?

这是我的代码:

// Header:
#include <QMainWindow>
#include <QLineEdit>
#include <QFileDialog>

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actionOpen_triggered()
{
    QString file = QFileDialog::getOpenFileName(this, tr("Open ui file"), "c://", tr("Qt UI Files (*.ui)"));
    ui->lineEdit->setText(file);
}

【问题讨论】:

  • 我刚刚创建了一个目录QAdrián 并测试了我的一个Qt 应用程序是否能够加载该文件。它做了。我可以做一个小示例应用程序。
  • 谢谢,但我什至无法使用对话框打开路径中包含 unicode 字符的任何目录。我猜问题出在某些系统设置或类似的东西上。
  • 请用一个完整的例子进行演示,并说明您使用的是什么Qt版本,以及使用什么编译器。
  • 这里有完整的应用程序,与Qt creator @KubaOber 生成的默认应用程序基本相同
  • @AdriánKálazi 我对QFileDialog::getOpenFileName() 中使用的本机文件对话框有点怀疑。 (我记得大多数win32 API函数有两种风格-一种带有字符,一种带有宽字符。在您的情况下,第一种风格可能由于á的编码错误或丢失而失败。)您是否尝试使用选项QFileDialog::DontUseNativeDialog ?

标签: c++ qt unicode qfiledialog


【解决方案1】:

我同意您最后的说法,即您的系统设置中的某些内容可能有问题。

我使用以下小示例应用程序进行测试:

// standard C++ header:
#include <iostream>
#include <string>

// Qt header:
#include <QApplication>
#include <QFileDialog>
#include <QGridLayout>
#include <QGroupBox>
#include <QLabel>
#include <QLineEdit>
#include <QMainWindow>
#include <QPushButton>

using namespace std;

int main(int argc, char **argv)
{
  cout << QT_VERSION_STR << endl;
  // main application
#undef qApp // undef macro qApp out of the way
  QApplication qApp(argc, argv);
  // setup GUI
  QMainWindow qWin;
  QGroupBox qBox;
  QGridLayout qGrid;
  QPushButton qBtn(QString::fromLatin1("File Dialog"));
  qGrid.addWidget(&qBtn, 0, 0, 1, 2);
  QLabel qLbl(QString::fromLatin1("File:"));
  qGrid.addWidget(&qLbl, 1, 0);
  QLineEdit qTxt;
  qGrid.addWidget(&qTxt, 1, 1);
  qBox.setLayout(&qGrid);
  qWin.setCentralWidget(&qBox);
  qWin.show();
  // install signal handlers
  QObject::connect(&qBtn, &QPushButton::clicked,
    [&qTxt](bool) {
#if 0 // how I do it usually...
    string file = QFileDialog::getOpenFileName(&qTxt,
      QString::fromUtf8("Open File"),
      QString(),
      QString::fromUtf8("Text File (*.txt);;All Files (*)")
      ).toUtf8();
    qTxt.setText(QString::fromUtf8(file.c_str()));
#else // using QString only...
    QString file = QFileDialog::getOpenFileName(&qTxt,
      QString::fromUtf8("Open File"),
      QString(),
      QString::fromUtf8("Text File (*.txt);;All Files (*)")
      );
    qTxt.setText(file);
#endif
    });
  return qApp.exec();
}

我在 Windows 10(64 位)上使用 VS2013,Qt 版本 5.6 编译了这个。

我在我的软件中使用std::string UTF-8 编码。 (因此,字符串可以在不依赖于 Qt 或任何其他 GUI 的库中使用。)但是,我对 QString 进行了相同的测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多