Как уставновить 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 шт):

Автор решения: Pak Uula

Если вам ещё актуально.

Я бы запускал в 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.

→ Ссылка