Я подготовил Dockerfile для создания образа Docker моего Приложение Qt. Для запуска приложения я использую X - я разрешаю доступ к X-серверу (xhost +local:root), затем использую следующую команду для его запуска:
docker run -it --env = "DISPLAY" --env = "QT_X11_NO_MITSHM=1" \
--volume = "/tmp/.X11-unix:/tmp/.X11-unix:rw" mindforger:latest mindforger
Проблема в том, что некоторые элементы пользовательского интерфейса Qt (пункты меню, диалоговые окна, ...) отображаются пустым черным цветом (случайным образом) - проверьте снимок экрана ниже:
Я использую Ubuntu 16.04.5 с Docker 18.06 и Qt 5.01.
@Rama, к сожалению, я не смог найти ни обходного пути, ни решения. Если вы их найдете, дайте мне знать.
Но почему? Почему докер? В любом случае. Другие приложения нормально показывают? Как и некоторые стандартные приложения Gnome/KDE. Я настоятельно рекомендую использовать что-то новее, чем Qt 5.0.1. Это был крайне глючный выпуск. И он очень старый.





У меня была такая же проблема, и я не мог решить ее формально. Но мы нашли альтернативный обходной путь, чтобы не отображать ошибку:
В нашем случае у нас есть четыре QComboBox в окне. Наша проблема заключалась в том, что после запуска приложения второе (иногда первое) поле со списком, которое вы щелкнули, отображало черное всплывающее окно. Итак, мы инициализировали окно двумя фиктивными полями со списком, вызвали метод showPopup, а затем скрыли всплывающие окна и поля со списком. Таким образом, пользователь не может заметить ошибку. Надеюсь, вы сможете сделать что-то подобное со своим приложением.
В моем случае (приложение Qt5) я решил эту проблему, добавив параметр --shm-size 128M, установка /dev/shm:/dev/shm тоже должна работать.
У меня была такая же проблема, и я нашел это решение, который вам нужно запустить после запуска контейнера докеров. После запуска конкретного контейнера докеров выполните следующую команду в контейнере докеров.
export QT_GRAPHICSSYSTEM = "native"
Как только это будет вставлено и выполнено в сеансе докер-терминала, запустите желаемое приложение QT, и эта проблема с черным ящиком должна исчезнуть. Вы даже можете вставить этот параметр в .bashrc вашего докера, если не хотите запускать его каждый раз вручную.
Ни одно из опубликованных решений не решило ту же проблему, с которой я столкнулся. Однако это исправило: QT_GRAPHICSSYSTEM = растр
Неважно. Это, кажется, немного решает проблему. Это недетерминировано. Выполняет некоторые раскрывающиеся списки, но не другие, и зависит от экземпляра приложения.
Я столкнулся с этой проблемой, пытаясь получить Google Планета Земля Про будет работать в Docker - несколько диалоговых окон и несколько меню были бы черным на черном или случайными пикселями.
Эта конкретная проблема с графикой была решена путем добавления --ipc host к команде create (или run).
Вот дистиллированная команда create, которую я использовал; Мне не нужно было отключать или настраивать shm (и ни одно из предложенных мной предложений shm не помогло):
docker create \
--ipc host \
-e DISPLAY -e XAUTHORITY \
-h "$HOSTNAME" \
-u "$(id -u):$(id -g)" \
--device /dev/dri/card0 \
-v /dev/dri/card0:/dev/dri/card0 \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v "$XAUTHORITY:$XAUTHORITY" \
my-qt-app
Небольшая поломка:
--ipc host - вот что исправили "черные меню / диалоги"-v "$XAUTHORITY:$XAUTHORITY", -v /tmp/.X11-unix:/tmp/.X11-unix и -e XAUTHORITY / -e DISPLAY, или приложение не запускается и жалуется на то, что не обнаруживает сервер отображения и полный сбой без -v $XAUTHORITY:XAUTHORITY-v /dev/card0:/dev/card0 (в моем сценарии я считаю, что они несколько наивно используют findfind /dev/dri -maxdepth 1 -type c) требуется, чтобы избежать ошибок Mesa, однако приложение все еще работает (плохо).-u ... Моя реализация «скрывает» докер от пользователя, поэтому он создает контейнер как пользователь, настраивает его с контейнерной «фальшивой» версией своей учетной записи пользователя и использует ее для запуска приложения, которое контейнер докера настроен для использования. когда он его запускает. ... избегая корневых приложений с графическим интерфейсом.
Привет @ martin-dvorak, удалось ли тебе решить проблему? Меня действительно интересует этот вопрос. Любой обходной путь будет полезен.