I created a GUI app using pyqt5 and opencv. The app works fine without activating the virtual env but when I activate the virtual env and run the app it shows this error:
QObject::moveToThread: Current thread (0x125b2f0) is not the object's thread (0x189e780). Cannot move to target thread (0x125b2f0) qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "/home/deepak/Desktop/SampleApp/lib/python3.9/site-packages/cv2/qt/plugins" even though it was found. This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. Available platform plugins are: xcb, eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl. Aborted
I tried running an example pyqt5 code (without importing opencv) and another code (only using opencv) both worked fine in the virtual env.
Operating System: Parrot OS 4.11
Python Version: 3.9.2
The problem is that the version of Qt with which opencv was compiled is not similar to the one used by PyQt5 causing a conflict.
A possible solution is to indicate to use the Qt plugins used by PyQt5.
import os from pathlib import Path import PyQt5 from PyQt5.QtWidgets import QWidget # others imports import cv2 os.environ["QT_QPA_PLATFORM_PLUGIN_PATH"] = os.fspath( Path(PyQt5.__file__).resolve().parent / "Qt5" / "plugins" ) # ...
import os from pathlib import Path import PySide2 from PySide2.QtWidgets import QWidget # others imports import cv2 os.environ["QT_QPA_PLATFORM_PLUGIN_PATH"] = os.fspath( Path(PySide2.__file__).resolve().parent / "Qt" / "plugins" ) # ...
A better option is to use QLibraryInfo to get the plugins folder path:
import os from PyQt5.QtCore import QLibraryInfo # from PySide2.QtCore import QLibraryInfo import cv2 os.environ["QT_QPA_PLATFORM_PLUGIN_PATH"] = QLibraryInfo.location( QLibraryInfo.PluginsPath )
Answered By – eyllanesc