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

    @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
    Диалоги стали открываться без проблем. По крайней мере пока.
    Ответ написан
    Комментировать