Qt 应用程序可从终端托管的 WSL 运行,但不能从窗口 WSL 运行。
我正在尝试在 Windows 11 上安装有 Ubuntu 20.04 的 WSL2 上运行 Qt 应用程序(例如)。xeyes
当我启动它(xeyes、Wireshark 或我公司开发的 Qt 软件)时,出现错误:Error: Can't open display: :0
。
根据软件的不同,错误可以详细如下:
user@PC:~$ wireshark
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
为了清晰易读,我将以如下方式开始代码行:
C:\Users\me> foo
是 Windows 终端 (CMD)bash-5.0$ fight
是从终端调用 WSL 吗(在同一个窗口中)user@PC:~$
WSL 是否从 Windows 11 桌面的单独窗口中启动。它应该是完全相同的事情,但显然不是……
奇怪的是如果我从 CMD 启动 WSL2,就可以运行这些。但不在我的主 WSL 安装中,它是我从 Windows 桌面上的快捷方式启动的。
关于这个话题有很多疑问:这里,这里,这里。这些解决方案都不适用于我的系统。我的结论是,在启动时,WSL 会更改网络配置。
如何重现
如果我打开终端(Windows 命令邀请)并从那里启动 WSL,它就可以工作:
C:\Users\me> wsl ~ -e bash --norc --noprofile
bash-5.0$ xeyes # --> xeyes work
但是如果我打开 WSL直接地在 Windows 中,它不起作用。
user@PC:~$ xeyes
Error: Can't open display: :0
奇怪的是,一旦我打开 WSL2,我无法再次从 CMD 托管的 WSL 启动该应用程序。
C:\Users\me> wsl ~ -e bash --norc --noprofile
bash-5.0$ xeyes
Error: Can't open display: :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 中具有相同的默认值。
Windows 桌面上的 WSL:
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 中也没有任何可以修改它们的内容,至少我是这么认为的。
答案1
我在 Windows 10 上,在 Ubuntu 上使用 WSL2。
尝试以下操作
export QT_QPA_PLATFORM="xcb"
sudo apt install libxcb-xinerama0 libqt5x11extras5