Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/40: Рейтинг темы: голосов - 40, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 32

PyQt5 и OpenGL

28.11.2018, 20:18. Показов 8372. Ответов 10

Студворк — интернет-сервис помощи студентам
Добрый день, уважаемые программисты! Я делаю интерфейс в pyqt5, мне необходимо сделать отрисовку объектов - сфер в OpenGL (в Qt я добавила QOpenGLWidget и использую его).
Я создала 2 класса - для самого интерфейса и для OpenGL виджета:
class ExampleApp(QtWidgets.QMainWindow, ui_for_particles.Ui_MainWindow, QtOpenGL.QGLWidget) и
class glWidget(QtWidgets.QOpenGLWidget) соответственно.
В ExampleApp я создаю объект self.gl_Widget_ = glWidget(self.openGLWidget). Мне необходимо считать из интерфейса введенные пользователем данные и передать их в объект self.gl_Widget_. Подскажите, как это можно сделать, или лучше для всего этого использовать один класс?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.11.2018, 20:18
Ответы с готовыми решениями:

Все методы и атрибуты PyQt5.QtGui PyQt5.Qtwdigets и QtCore
На официальной документации модуля я не нашёл все методы и атрибуты PyQt5. может дадите источник со всем этим добром??? Буду вам очень...

Unable to import 'PyQt5' / No module named 'PyQt5' /
Здравствуйте. Имеется Ubuntu 18.04. Хочу использовать pyside2. Установил PyQt5. :~$ pip install PyQt5 Defaulting to user...

PyQt5 Error while finding module specification for 'PyQt5.uic.pyuic' (ModuleNotFoundError: No module named 'PyQt
В общем поставил pyqt5 и python3.7 пишу в консоль python -m PyQt5.uic.pyuic Выдает ошибку Error while finding module specification for...

10
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
28.11.2018, 20:24
а чем стандартные примеры не подходят?
https://github.com/baoboa/pyqt... grabber.py
0
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 32
28.11.2018, 20:27  [ТС]
Да, я запускала пример отсюда
https://github.com/baoboa/pyqt... hellogl.py

проблема в том - как из MainWindow (окно интерфейса) передать параметры в класс GLWidget(QOpenGLWidget)
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
28.11.2018, 20:43
1. где вы там увидели QMainWindow?
2.в данном примере как раз расписана передача событий
Python
1
2
3
4
5
6
        self.xSlider.valueChanged.connect(self.glWidget.setXRotation)
        self.glWidget.xRotationChanged.connect(self.xSlider.setValue)
        self.ySlider.valueChanged.connect(self.glWidget.setYRotation)
        self.glWidget.yRotationChanged.connect(self.ySlider.setValue)
        self.zSlider.valueChanged.connect(self.glWidget.setZRotation)
        self.glWidget.zRotationChanged.connect(self.zSlider.setValue)
0
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 32
28.11.2018, 23:00  [ТС]
Но там же создается 3 объекта прямо в этом классе class GLWidget(QOpenGLWidget)
Python
1
2
3
self.xSlider = self.createSlider()
self.ySlider = self.createSlider()
self.zSlider = self.createSlider()
а мне надо другое

У меня есть класс sphere_ - в его параметры входят радиус, цвет, координаты. Я считываю из интерфейса данные, завожу соответствующий объект (в классе, где происходит инициализация интерфейса, наследуемом от QtWidgets.QMainWindow. В ссылке, которую я кидала выше - это класс class Window(QWidget))
Python
1
self.sphere_1 = sphere_(coordinates,color,rad)
И мне надо этот объект отрисовать в классе glWidget. Как это сделать
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
29.11.2018, 07:13
покажите свой код, что не получается
Цитата Сообщение от klmnopr Посмотреть сообщение
И мне надо этот объект отрисовать в классе glWidget. Как это сделать
передайте их параметрами

Добавлено через 11 минут
https://habr.com/post/132674/
0
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 32
29.11.2018, 18:46  [ТС]
У меня 2 класса
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class ExampleApp(QtWidgets.QMainWindow, ui_for_particles.Ui_MainWindow, QtOpenGL.QGLWidget):
    
    def __init__(self):
        self.gl_Widget_ = glWidget(self.openGLWidget)
 
    def add_object(self):
        print('add_obj')
        coordinates = Coord(float(self.x_crd.text()),float(self.y_crd.text()),float(self.z_crd.text()))
        speed = Speed(float(self.speed_u.text()),float(self.speed_v.text()),float(self.speed_w.text()))
        S = Sphere(coordinates,speed,self.mass,self.col_.getRgbF()) #создаю сферу по параметрам, считанным из интерфейса
        
def main():
    app = QtWidgets.QApplication(sys.argv)  # Новый экземпляр QApplication
    window = ExampleApp()  # Создаём объект класса ExampleApp
    window.show()  # Показываем окно
    app.exec_()  # и запускаем приложение
    
if __name__ == '__main__':  # Если мы запускаем файл напрямую, а не импортируем
    main()  # то запускаем функцию main()
и класс для виджета

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
class glWidget(QtWidgets.QOpenGLWidget):
 
    def __init__(self, parent, objct):
        super(glWidget, self).__init__(parent)
        ...
    def initializeGL(self):
        #код
 
    def paintGL(self):
        print('paintGL')
        gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
        gl.glLoadIdentity()
        #код
Внимание, вопрос: как передать из класса ExampleApp в класс glWidget объект типа Sphere?
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
29.11.2018, 20:06
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout,QOpenGLWidget)
import OpenGL.GL as gl
from OpenGL import GLU as glu
 
class Window(QWidget):
 
    def __init__(self):
        super(Window, self).__init__()
        self.glWidget = GLWidget()
        mainLayout = QGridLayout(self)
        mainLayout.setContentsMargins(0,0,0,0)
        mainLayout.addWidget(self.glWidget)
        self.setWindowTitle("Hello GL")
 
class GLWidget(QOpenGLWidget):
 
    def __init__(self, parent=None):
        super().__init__(parent)
        
    def initializeGL(self):
        gl.glClearColor(0, 0, 0, 0);
        gl.glShadeModel(gl.GL_SMOOTH);
        gl.glEnable(gl.GL_COLOR_MATERIAL);
        gl.glEnable(gl.GL_LIGHTING);
        ambientLight=[ 0.2, 0.2, 0.2, 1.0 ];
        diffuseLight=[ 0.5, 0.5, 0.5, 1.0 ];
        lightPos=[ 100, 100, 100, 0 ];
        gl.glLightfv(gl.GL_LIGHT0, gl.GL_AMBIENT, ambientLight);
        gl.glLightfv(gl.GL_LIGHT0, gl.GL_DIFFUSE, diffuseLight);
        gl.glLightfv(gl.GL_LIGHT0, gl.GL_POSITION, lightPos);
        gl.glEnable(gl.GL_LIGHT0);
        gl.glColorMaterial(gl.GL_FRONT_AND_BACK, gl.GL_AMBIENT_AND_DIFFUSE)
 
    def paintGL(self):
        gl.glClear( gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT );
        gl.glColor3f(1.0, 2.0, 1.0);
        gl.glMatrixMode(gl.GL_MODELVIEW);
        gl.glPushMatrix();
        gl.glTranslatef(0.3,0.3,0.0);
        qobj = glu.gluNewQuadric();
        glu.gluQuadricOrientation(qobj, glu.GLU_OUTSIDE);
        glu.gluSphere(qobj, 0.67, 100, 100);
        gl.glPopMatrix();
 
 
    def resizeGL(self, width, height):
        side = min(width, height)
        if side < 0: return
        gl.glViewport((width - side) // 2, (height - side) // 2, side, side)
        gl.glMatrixMode(gl.GL_PROJECTION)
        gl.glLoadIdentity()
        gl.glScale(height/width, 1.0, 1.0);
        gl.glMatrixMode(gl.GL_MODELVIEW);
 
 
if __name__ == '__main__':
 
    app = QApplication([])
    w = Window()
    w.resize(400,400)
    w.show()
    app.exec_()
0
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 32
30.11.2018, 00:52  [ТС]
Это вообще что? Вы читали мой вопрос? У меня есть класс Sphere, мне именно надо создать объект этого класса и передать его
Python
1
2
3
4
5
6
7
class Sphere:
    def __init__(self, position,  m, color):
        self.x = position.x
        self.y = position.y
        self.z = position.z
        self.color = color 
        self.position = position
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
30.11.2018, 08:41
вам же писали - через парвметры
Python
1
 a = A(p1,p2,p3)
0
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 32
30.11.2018, 19:50  [ТС]
вроде разобралась
в классе
Python
1
2
3
4
5
class glWidget(QtWidgets.QOpenGLWidget):
    def __init__(self, parent, sphere):
        super(glWidget, self).__init__(parent)
        self.sp = sphere
        ...
и дальше использую self.sp внутри класса glWidget
я просто думала, что при передаче объекта надо как-то указывать тип объекта, как в плюсах, оказывается не надо, все сам понял
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.11.2018, 19:50
Помогаю со студенческими работами здесь

Perl + OpenGL Как избавиться от повторного подключения библиотеки OpenGL в модулях
Доброго времени суток! Сегодня решил заняться программированием на языке Perl, используя библиотеку OpenGL :D Возникли вопросы: ...

Какая значительная разница между OpenGL ES 2.0 и OpenGL 3.3 при использовании в Qt
Привет всем! У меня видеокарта имеет поддержку 3.1 версию OpenGL, обновить хочу её с помощью установщика драйвера. У меня такой вопрос:...

Создаю игру с научным уколоном на C++/opengl. Как подключить openGL и добиться кроссплатформенности
Я читал про opengl - для его инициализации нужно создавать windows - окно. Для linux видимо инициализация происходить по другому. как мне...

Чем отличаются готовые сборки Qt под Win + MSVC с OpenGL и без OpenGL?
Ну вопрос собственно в том, что мне не очень понятно, что же в сборке кьюте без опен джел имеется вместо него? Тоесть понятно, что в сборке...

OpenGL Ваша текущая конфигурация рабочего стола не поддерживает OpenGL Аппаратное ускорение.
всем здрасте ) скачал opengl extensions viewer решил проверить драйверы на видео карту.В разделе программы Repot мне посыпалось куча...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru