2015-07-22 3 views
2

В моем приложении я создаю HTML-файл, который я хочу открыть, нажав на кнопку. Так что мой файл с именем, например:Как использовать QDesktopServices :: openUrl с URL-адресом «file:», содержащим «#»?

QString file = "F:/the_path/to_the_/generated_html_file.html"; 

В Windows я изменить его на:

file = "file:///F:/the_path/to_the_/generated_html_file.html"; 

, так что я могу открыть его с помощью:

QDesktopServices::openUrl(QUrl(file)); 

и он открывается в браузер по умолчанию.

Но когда в пути или имени файла присутствует символ #, он больше не работает, и кажется, что URL-адрес усечен сразу после #.

Например, если я имя файла generated#_html_file.html, я получаю сообщение об ошибке:

ShellExecute 'F:/the_path/to_the_/generated' failed (error 2). 

Почему это происходит, и как я могу избежать этого?

ответ

8

В URL-адресе # является символом, который ограничивает идентификатор фрагмента из местоположения ресурса. Чтобы ссылаться на URL-адрес file: с литералом #, он должен быть экранирован (как %23).

Ссылка: RFC 1738:

Символ «#» является небезопасным и всегда должны быть закодированы, поскольку он используется в World Wide Web и в других системах, чтобы разграничивать URL из фрагмента/который может следовать за ним.

Как отметил SteveTJS, статический метод QUrl::fromLocalFile() предназначен для этой цели, так что вы можете написать

QDesktopServices::openUrl(QUrl::fromLocalFile(file)); 

вместо

QDesktopServices::openUrl(QUrl(file)); 

Это будет

  1. Подготовьте file: идентификатора протокола и // пустого имя хост
  2. Преобразовать родной разделитель пути к / (если отличается)
  3. Encode любых не безопасные символами для URL.
+0

В самом деле, я отправил свой ответ в то же время. Функция QUrl :: fromLocalFile (...) выполняет работу. – SteveTJS

+0

@Steve - совершенно верно, я не использую 'QUrl' очень, поэтому я забыл об этом. Я поддержал ваш ответ и добавлю заметку к моему. –

4

Я просто нашел решение:

QString file = "F:/the_path/to_the_/generated#_html_file.html"; 
QUrl url = QUrl::fromLocalFile(file); 
// gives url="file:///F:/the_path/to_the_/generated%23_html_file.html"; 
QDesktopServices::openUrl(url); //works 
+0

Ах да - 'fromLocalFile()' существует для такого типа преобразования. Однако нет необходимости в копировании 'QUrl (url)'? –

+0

@TobySpeight Нет необходимости в QUrl (url), поскольку параметр url уже хорош. – SteveTJS