Как уставновить Qt4.4 и PyQt4.4 в Ubuntu 22.04?
Возникла необходимость заиметь в системе Python 2.7 и Qt4.4 и PyQt4.4. Питон со скрипом поставился, а вот с Qt возникли проблемы.
По идее все просто - добавить репозиторий и скачать с него, как написано здесь https://launchpad.net/~rock-core/+archive/ubuntu/qt4
Однако, проблема в том, что этот репозиторий, похоже, давно уже мертв. Когда я делаю sudo add-apt-repository ppa:rock-core/qt4
, я получаю в ответ
Err:5 https://ppa.launchpadcontent.net/rock-core/qt4/ubuntu jammy Release
404 Not Found [IP: 185.125.190.80 443]
Если сделать sudo apt update
, то будет сообщение
E: The repository 'https://ppa.launchpadcontent.net/rock-core/qt4/ubuntu jammy Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
Как пишут здесь https://askubuntu.com/questions/732985/force-update-from-unsigned-repository это решается добавлением [trusted=yes]
в /etc/apt/sources.list
, но проблема в том, что в этом файле нет строки с нужным репозиторием, куда можно было бы это прописать.
Какое может быть решение у данной проблемы? Как все-таки установить Qt4.4 и PyQt4.4?
Ответы (1 шт):
Если вам ещё актуально.
Я бы запускал в docker.
В дебиан-10 (aka buster) есть пакет python-qt4. Это самая свежая версия дебиана с Qt4. Все последующие только с Qt5. Поэтому образ я собрал на базе debian:buster-slim
. Вот Dockerfile:
FROM debian:buster-slim
RUN apt update
RUN apt install python-qt4 python-opengl python-qt4-gl -y
WORKDIR /app
Здесь помимо pyqt4 я ставлю OpenGL, чтобы работали GL-виджеты из PyQt.
Сборка:
docker build -t pqt .
Получился образ с именем pqt
Теперь скрипт для запуска скриптов в контейнере. Я назвал его pqt.sh
# Собрать образ `pqt`, если его нет.
if [ -z "$(docker image ls --format '{{.Repository}}' pqt)" ]; then
docker build -t pqt . || { echo "Build failed, exiting" > /dev/stderr; exit 1; }
fi
# запустить скрипт из текущего каталога
docker run --rm \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /mnt/wslg:/mnt/wslg \
-e DISPLAY \
-e WAYLAND_DISPLAY \
-e XDG_RUNTIME_DIR \
-e PULSE_SERVER \
--user $(id -u):$(id -g) \
-v .:/app pqt /usr/bin/python2 "$@"
Этот сценарий должен запускаться в текущем каталоге, так как именно .
монтируется в контейнер в каталог /app
Конейнер запускается от имени текущего пользователя, чтобы сгенерированные файлы были не от рута, а от пользователя.
Вот этот блок пробрасывает в контейнер соединение с сервером X11 из хоста.
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /mnt/wslg:/mnt/wslg \
-e DISPLAY \
-e WAYLAND_DISPLAY \
-e XDG_RUNTIME_DIR \
-e PULSE_SERVER \
Для проверки нашел простой скрипт
#!/usr/bin/python2
import sys
from PyQt4 import QtGui
# Test file creation
with open("test.txt", 'w') as f:
f.write('hello!')
app = QtGui.QApplication(sys.argv)
widget = QtGui.QWidget()
widget.resize(250, 150)
widget.setWindowTitle('simple')
widget.show()
sys.exit(app.exec_())
Скрипт создаёт в рабочем каталоге файл test.txt
для проверки, что файлы создаются от имени пользователя, и открывает окошко без всего.
./pqt.sh ./simple.py
Пример виджета, который рисует желтый треугольник средствами OpenGL:
#/usr/bin/python2
from OpenGL.GL import *
from OpenGL.GLU import *
from PyQt4 import QtGui
from PyQt4.QtOpenGL import *
class MainWindow(QtGui.QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.widget = glWidget(self)
self.button = QtGui.QPushButton('Test', self)
mainLayout = QtGui.QHBoxLayout()
mainLayout.addWidget(self.widget)
mainLayout.addWidget(self.button)
self.setLayout(mainLayout)
class glWidget(QGLWidget):
def __init__(self, parent):
QGLWidget.__init__(self, parent)
self.setMinimumSize(640, 480)
def paintGL(self):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
glTranslatef(-2.5, 0.5, -6.0)
glColor3f( 1.0, 1.5, 0.0 )
glPolygonMode(GL_FRONT, GL_FILL)
glBegin(GL_TRIANGLES)
glVertex3f(2.0,-1.2,0.0)
glVertex3f(2.6,0.0,0.0)
glVertex3f(2.9,-1.2,0.0)
glEnd()
glFlush()
def initializeGL(self):
glClearDepth(1.0)
glDepthFunc(GL_LESS)
glEnable(GL_DEPTH_TEST)
glShadeModel(GL_SMOOTH)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45.0,1.33,0.1, 100.0)
glMatrixMode(GL_MODELVIEW)
if __name__ == '__main__':
app = QtGui.QApplication(['Yo'])
window = MainWindow()
window.show()
app.exec_()
Тоже работает:
./pqt.sh ./glsimple.sh
Все тесты проведены в Ubuntu22 + WSL2 + Docker Desktop. В качестве X-сервера использовался встроенный WSLg.