Вопрос или проблема
Приложения Qt работают из WSL, размещенного в терминале, но не из оконного WSL.
Я пытаюсь запустить приложение Qt, такое как xeyes
, на WSL2 с Ubuntu 20.04 на Windows 11. Когда я запускаю его (xeyes, или Wireshark, или программное обеспечение, созданное Qt в моей компании), у меня возникает ошибка: Error: Can't open display: :0
.
В зависимости от программного обеспечения ошибка может быть детализирована следующим образом:
user@PC:~$ wireshark
qt.qpa.xcb: не удалось подключиться к дисплею: :0
qt.qpa.plugin: Не удалось загрузить плагин платформы Qt "xcb" в "" , хотя он был найден
Для наглядности я начну строки кода следующим образом:
C:\Users\me> foo
— это терминал Windows (CMD)bash-5.0$ fight
— это WSL, вызванный из терминала (в том же окне)user@PC:~$
— это WSL, запущенный из Windows 11, с рабочего стола, в отдельном окне. Это должно быть совершенно таким же, но, видимо, не так…
Странно то, что я могу запустить их, если запускаю WSL2 из CMD. Но не в моей основной установке WSL, той, которую я запускаю из ярлыка на своем рабочем столе Windows.
Существует множество вопросов по этой теме: Здесь, здесь, здесь. Никакие из решений не работают для моей системы. Я пришел к выводу, что при запуске WSL меняет сетевую конфигурацию.
Как воспроизвести
Если я открою терминал (командная строка Windows) и запущу WSL оттуда, это сработает:
C:\Users\me> wsl ~ -e bash --norc --noprofile
bash-5.0$ xeyes # --> xeyes работает
Но если я открою WSL непосредственно из Windows, это не работает.
user@PC:~$ xeyes
Ошибка: Не удается открыть дисплей: :0
И странно, что как только я открыл WSL2, я не могу снова запустить приложение из WSL, запущенного из CMD.
C:\Users\me> wsl ~ -e bash --norc --noprofile
bash-5.0$ xeyes
Ошибка: Не удается открыть дисплей: :0
Мой вывод: что-то в WSL2 изменило сетевые настройки при запуске.
Возможные идеи
Я пытался изменить переменную DISPLAY
.
user@PC:~$ export DISPLAY=0.0.0.0
–> та же ошибкаuser@PC:~$ export DISPLAY=0.0.0.0:0
–> работает несколько минут, затем та же ошибкаuser@PC:~$ export DISPLAY=10.0.0.3
(локальный IP) –> та же ошибкаuser@PC:~$ export DISPLAY=10.0.0.3:0
–> работает несколько минут, затем та же ошибкаuser@PC:~$ export DISPLAY=[route]
установленный по умолчанию маршрут –> та же ошибка
Во всех случаях проблема, вероятно, не в DISPLAY
, потому что у него одно и то же значение по умолчанию как в CMD, так и в WSL2.
WSL с рабочего стола Windows:
user@PC:~$ echo $DISPLAY
–> :0
WSL из терминала:
C:\Users\me> wsl ~ -e bash --norc --noprofile
bash-5.0$ echo $DISPLAY
bash-5.0$ :0
Я думал, может быть, WSL с рабочего стола изменяет сетевые настройки. Но и ifconfig
, и ip route show
возвращают точно такие же параметры. У меня также нет ничего в .bashrc, что могло бы их изменить, по крайней мере, я так думаю.
Я на Windows 10, WSL2 на Ubuntu.
Попробуйте следующее:
export QT_QPA_PLATFORM="xcb"
sudo apt install libxcb-xinerama0 libqt5x11extras5
основано на комментарии на github:
sudo rm -r /tmp/.X11-unix
ln -s /mnt/wslg/.X11-unix /tmp/.X11-unix
Ответ или решение
Ошибка запуска Qt-приложений в WSL2: Решение проблемы с подключением к дисплею
Введение
Запуск графических приложений на Windows Subsystem for Linux (WSL2) иногда вызывает трудности, особенно когда речь идет о Qt-программах. Пользователи, такие как вы, могут столкнуться с ошибками, связанными с подключением к дисплею. В данном руководстве мы постараемся проанализировать вашу проблему и предложить более детальные решения.
Описание проблемы
Вы упоминаете, что при запуске приложения Qt, такого как xeyes
, на WSL2 Ubuntu 20.04, вы получаете следующую ошибку:
Error: Can't open display: :0
qt.qpa.xcb: could not connect to display: :0
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found
Эта проблема возникает, когда приложение не может подключиться к выставленному дисплею, что, как предположительно, связано с настройками вашего окружения.
Анализ ситуации
Судя по вашему описанию, приложение работает нормально, если вы запускаете WSL2 через командную строку (CMD), но не работает при запуске напрямую из Windows. Это может быть связано с тем, как WSL управляет переменной окружения DISPLAY
и сетевыми настройками в зависимости от способа запуска.
-
Переменная окружения
DISPLAY
: При подключении к графическому интерфейсу X11 приложение ожидает, что переменнаяDISPLAY
будет указывать на правильный адрес сервера X. В случае WSL2, по умолчаниюDISPLAY=:0
, что может быть неправильным. -
Сетевые настройки: Возможно, при запуске WSL напрямую из Windows, происходят изменения в сетевых настройках, которые влияют на подключение к X-приложениям.
Решения
-
Корректировка переменной
DISPLAY
:
Попробуйте изменить значение переменнойDISPLAY
, чтобы указать IP-адрес вашей системы:export DISPLAY=$(ip route | grep -oP '(?<=src )(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'):0
После этого повторите запуск
xeyes
. -
Удаление и создание символической ссылки:
Убедитесь, что каталоги Unix для X11 настроены правильно:sudo rm -r /tmp/.X11-unix ln -s /mnt/wslg/.X11-unix /tmp/.X11-unix
-
Установка необходимых библиотек:
Иногда решение проблемы может заключаться в отсутствии библиотек:sudo apt install libxcb-xinerama0 libqt5x11extras5 export QT_QPA_PLATFORM="xcb"
-
Использование WSLg:
Убедитесь, что ваш WSL2 использует графический интерфейс WSLg. Это облегчит задачу запуска графических приложений и устранит необходимость в настройке DISPLAY. Убедитесь, что в вашей системе установлена последняя версия WSLg. -
Изменение настроек термина:
Если проблема сохраняется, попробуйте использовать другие терминалы, такие как Windows Terminal или другие эмуляторы терминала, чтобы устранить возможные проблемы с конфигурацией.
Заключение
Проблемы с графическими приложениями в WSL2 могут быть сложными, но, следуя приведенным выше рекомендациям, вы сможете устранить большинство ошибок, связанных с подключением к дисплею. Оставайтесь в курсе обновлений WSL и документации, чтобы быть вовремя осведомленным о новых функциях и исправлениях. Если приведенные шаги не помогли, рекомендую обратиться в сообщество разработчиков WSL или поддерживающие форумы для дальнейшей помощи.