@auditor
Разработчик

Некорректная компиляция Qt приложения в msvc2015?

Компиляция проходит нормально, однако во время работы программы возникла следующая ошибка:
92e83e3ce63f45998ce9014d1357815b.pngИмя папки пользователя, если оно написано кириллицей, отображается кракозябрами и программа не находит папку пользователя.

Входные данные:
ОС Windows 7
Qt 5.6
Компилятор msvc2015 (32bit/64bit)


В процессе поиска решения проблемы выяснил, что помимо этой ошибки так же с кракозябрами отображаются пути QStandardPaths, а так же в "int main(int argc, char *argv[])", если argv содержит путь на передаваемый внешне файл и он лежит в папке пользователя, то он так же отображается кракозябрами.

Протестировав на отдельном проекте выяснил, что при компиляции в MinGW этой проблемы не возникает, однако в проекте используется webenginewidgets, потому компилятор MinGW не подходит. Однако отсюда видно, что проблема в компиляторе msvc2015, определить которую мне не удалось!

Пробовал:
  • Переустанавливать Qt
  • Переустанавливать Visual Studio

результат тот же.

Дополнительные данные/результаты:
  • Другие приложения написанные на Qt (не мной) на моём компьютере работают нормально.
  • В самом приложении кириллица отображается корректно, никаких проблем нет.
  • При компиляции relise версии тоже самое.
  • В последствии выяснил, что папка с кракозябрами создаётся в системе(при этом ошибка остаётся), но если её удалить, то появляются новые ошибки уже в компиляторе:465f29655275470eafdfcbd9dfbbcc17.png
  • Прогуглив массу русско- и англо- язычных ресурсов нашёл лишь пару упоминаний этой проблемы и ни одного решения. Максимум рекомендации использовать MinGW, что мне не подходит.


Предполагаю, что, возможно, ответа нет потому, что решение слишком банально, однако увы мне не удалось выяснить причину самостоятельно.
Возможно у MSVC проблемы с кодировкой UTF8? Тогда как её разрешить...

Заранее благодарен всем, кто предложит способы решения моей проблемы.

Дополнительно код программы с проблемой:
файл test.pro
TEMPLATE = app

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11

TARGET = test

SOURCES += main.cpp

Файл main.cpp
#include <QApplication>
#include <QString>
#include <QMessageBox>
#include <QFileDialog>
#include <QStandardPaths>

using namespace std;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    /*первый тест проблемы*/
    QString file=QFileDialog::getOpenFileName(0,"Select file",QString(getenv("PROGRAMFILES")),"(*.exe)");

    /*второй тест проблемы*/
    QString addin_path = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
    QMessageBox msgBox;
    msgBox.setIcon(QMessageBox::Warning);
    msgBox.setWindowFlags(Qt::CustomizeWindowHint);
    msgBox.setWindowTitle("Information");
    msgBox.setText(addin_path);
    msgBox.exec();
    return a.exec();
}

Результаты работы этой программы:
первый пример проблемы
f814112e95e4480d96f6efefd535f934.pngвторой пример проблемы
9ce91e5b6af7454d810e623357d31707.png
  • Вопрос задан
  • 1775 просмотров
Пригласить эксперта
Ответы на вопрос 3
Rou1997
@Rou1997
Помимо MinGW, можно использовать MSVC другой версии.
Ответ написан
@auditor Автор вопроса
Разработчик
Проблема решена в каком-то смысле. По сути её и не было...

Дело в том, что если запускать программу не сразу из Qt, а после компиляции запустить самостоятельно в системе, то программа вполне нормально работает.
Получается ошибка конечно есть, но это не ошибка компилятора, а всё же ошибка Qt. И главное с ней вполне можно жить, достаточно сменить имя пользователя на англоязычное на компе на котором идёт разработка.

Однако, хотелось бы всё же разобраться в причинах ошибки. По прежнему жду ваших предложений!
Ответ написан
@koronabora
Человек
MSVC Qt plugin необходимо установить и в нем пути прописать.

А еще, если им собирать 32 битное приложение в 64 битной системе, где 64 битный QT первый в Path, то windeployqt будет копировать 64 битные библиотеки в 32 битное приложение. Приходится ручками наполнять первый раз.

С 64 битным приложением нет проблем.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы