@alexey_abramov

Разработка на Qt в KDE — не работают стандартные диалоговые окна, почему?

Здравствуйте!
Разрабатываю приложение на QT. В нем вызываются стандартные диалоговые окна вида
QFileDialog::getExistingDirectory(0, "Directory Dialog", "");

Приложение работает прекрасно на Windows, Linux(в Unity, MATE, XFCE, LXDE).
Однако, я работаю с KDE. И тут при вызове диалогового окна начинают творится странные вещи. Окно и вся программа полностью зависают при вызове диалога.
Вот что пишет output:
При запуске приложения
kf5.kiconthemes: "Theme tree: (Breeze)"

А вот что происходит при первом выводе диалогового окна.
QInotifyFileSystemWatcherEngine::addPaths: inotify_add_watch failed: No such file or directory
kf5.kservice.sycoca: Trying to open ksycoca from "/home/aa/.cache/ksycoca5"

Пробывал любые примеры сделать - все тоже самое. Почему так в KDE? Необходима ли какая-то точная настройка.
Гуглил, проблемы были такие же лишь при разработке под Android.
p.s. Еще такой глюк. Нажали на какую-то кнопку в своем диалоговом окне, сразу выводится ошибка:
load glyph failed err=6 face=0x9c85c10, glyph=964

И в этом окне неожиданно обрывается обработка всех сигналов.
Просьба помочь с проблемой, думал что на KDE вообще никаких проблем с Qt не должно быть. Однако получилось наоборот - на всех популярных интерфейсах рабочего стола под Linux все работает прекрасно как и должно быть, но в KDE все как-то не стабильно.
Пробывать переустанавливать QT без всяких аддонов, не помогло.
  • Вопрос задан
  • 612 просмотров
Пригласить эксперта
Ответы на вопрос 1
@EliseyP
Возможно Вам поможет этот опыт - уже несколько лет после обновления Qt в KDE у некоторых приложений стали появляться проблемы с открытием каталогов/файлов. Решить (пока по крайней мере) удалось только сейчас.

В некоторых qt приложениях при запуске файлового диалога происходит зависание и проблема с отображением non-latin utf имен.

Одно из решений: запуск с темой gtk2. Например:
export QT_QPA_PLATFORMTHEME=gtk2; sqlitebrowser
Можно прописать в .bashrc alias:
alias sqlitebrowser="(export QT_QPA_PLATFORMTHEME=gtk2; sqlitebrowser)"

Другое решение (если пишем сами или есть исходники) использовать опцию QFileDialog.DontUseNativeDialog:
на PyQt5: .setOption(QFileDialog.DontUseNativeDialog)

UPD: проблема не исчезала во многих случаях (при этом у другого пользователя на этом же хосте все работало без проблем).

strace показывает, что приложения, использующие QFileDialog пытаются открывать файлы конфигурации:

access("/home/user/.config/QtProject.conf", F_OK) = 0
access("/home/user/.config/kdedefaults/QtProject.conf", F_OK) = -1 ENOENT (Нет такого файла или каталога)
access("/etc/xdg/QtProject.conf", F_OK) = -1 ENOENT (Нет такого файла или каталога)
access("/usr/share/desktop-base/kf5-settings/QtProject.conf", F_OK) = -1 ENOENT (Нет такого файла или каталога)

в моем случае для пользователя user файл /home/user/.config/QtProject.conf имел размер ~500Mb

далее шли попытки проверки каталогов
stat("/", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
access("/", R_OK) = 0
access("/", W_OK) = -1 EACCES (Отказано в доступе)
access("/", X_OK) = 0
stat("//home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
access("//home", R_OK) = 0
access("//home", W_OK) = -1 EACCES (Отказано в доступе)
access("//home", X_OK) = 0
stat("//home/user", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0
access("//home/user", R_OK) = 0
access("//home/user", W_OK) = 0
access("//home/user", X_OK) = 0
stat("//home/user/tmp", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0
access("//home/user/tmp", R_OK) = 0
access("//home/user/tmp", W_OK) = 0
access("//home/user/tmp", X_OK) = 0
access("//home/user/\303\203\302\203\303\202\302\203\303\203\302\202\303\202\302\203\303\203\302\203\303\202\302\202\303\203\302\202\303\202\302\203\303\203\302\203\303\202\302\203\303\203\302\202\303\202\302\202\303\203\302\203\303\202\302\202\303\203\302\202\303 ..... 03\203\302"..., F_OK) = -1 ENAMETOOLONG (Слишком длинное имя файла)

Внутри ... - ОЧЕНЬ длинная последовательность (\303\203\302\203\303\202\302). Это либо имя одного из каталогов в домашем каталоге,
либо каталог из списка history (recent), либо "точки доступа" KDE.
В strace log: есть строка:
write(16, "[FileDialog]\nhistory=file:///hom"..., 658) = 658

При этом, если все же дождаться зависший диалог открытия каталогов, то можно увидеть non-latin имена каталогов как неверно декодированные.
Сама эта последовательность декодируется python (отрывок строки)
b'\303\203\302\203\303\202\302\203\303\203\302\202\303\202\302\203\303\203\302\203\303\202\302\202\303\203\302\202\303\202\302\203\303\203\302\203\303\202\302\203\303\203\302\202\303\202\302\202\303\203\302\203\303\202\302\202\303\203\302\202\303\202\302\203\303\203\302\203\303\202\302\203\303\203\302\202\303\202\302\203\303\203\302\203\303\202\302\202\303\203\302\202\303\202\302\202\303\203\302\203\303\202\302\203\303\203\302\202\303\202\302\202\303\203\302\203\303\202\302\202\303\203\302\202\303\202\302\203\303\203\302\203\303\202\302\203\303\203\302\202\303\202\302\203\303\203\302\203\303\202\302\202\303\203\302\202\303\202\302\203\303\203\302\203\303\202\302\203\303\203\302\202\303\202\302\202\303\203\302\203\303\202\302\202\303\203\302\202\303\202\302\202\303\203\302\203\303\202\302\203\303\203\302\202\303\202\302\203\303\203\302\203\303\202'.decode('utf-8')
как
'Ã\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x82Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x83Ã\x83Â\x82Ã\x82Â\x83Ã\x83Â\x83Ã\x82Â\x82Ã\x83Â\x82Ã\x82Â\x82Ã\x83Â\x83Ã\x82Â\x83Ã\x83Â'
Вся строка не декодируется - пишет ошибку
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc2 in position 4082: unexpected end of data

ИТОГОВОЕ РЕШЕНИЕ (на данный момент) - удалить файл home/user/.config/QtProject.conf
Диалоги стали открываться без проблем. По крайней мере пока.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы