Мне нужно добавить графику (геометрию) в виджет OpenGL в форме PyQt5.
Здесь у меня есть пример, где у меня есть 3 потока и основной поток в качестве бегуна форм 2 потока, просто передавая числа втекстовые поля после нажатия кнопки И мне нужно добавить еще одну нить тем же способом, где после нажатия кнопки self.pushButton_GL
функция нарисует ось в виджете OpenGL в той же форме, и она будет доступна, пока 2 других потокавсе еще работает, и основная форма не замораживается.
Итак, вот некоторый код на тот случай, если кому-то понадобится это в будущем так же, как и мне сейчас:
Мой импорт:
import sys
import time
from PyQt5 import QtCore
import threading
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUi
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QApplication, QDialog, QOpenGLWidget
from PyQt5.QtCore import pyqtSignal
import pyqtgraph.opengl as gl
Класс инициализации основной формы:
class form_thread(QDialog):
def __init__(self):
super(form_thread,self).__init__()
loadUi('thread_test.ui', self)
self.setGeometry(800, 300, 537, 831)
self.setWindowTitle("window")
self.pushButton.clicked.connect(lambda: self.startTheThread())
self.pushButton1.clicked.connect(lambda:self.startTheThread_thread2())
self.pushButton_GL.clicked.connect(lambda:self.startTheThread_thread3())
Threads # 1:
# This is Thread #1
def theCallbackFunc(self, msg):
print('thread #1 has sent this message to the GUI:')
print(msg)
self.textEdit.append("Counter: " + msg)
def startTheThread(self):
id_0 = (self.lineEdit.text())
t = threading.Thread(name='myThread', target=myThread, args=(self.theCallbackFunc, int(id_0)))
t.start()
# This is Thread #2
def theCallbackFunc_thread2(self, msg):
print('thread #2 has sent this message to the GUI:')
print(msg)
self.textEdit1.append("Counter: " + msg)
def startTheThread_thread2(self):
id_1 = (self.lineEdit1.text())
t2 = threading.Thread(name='myThread2', target=myThread_2, args=(self.theCallbackFunc_thread2, int(id_1)))
t2.start()
Здесь должен быть поток № 3, где я подключаюсь к виджету OpenGL
# This is Thread #3 OpenGL Thread
def theCallbackFunc_thread3(self, msg):
print('thread #3 has sent this message to the GUI:')
print(msg)
self.textEdit1.append("Counter: " + msg)
def startTheThread_thread3(self):
id_2 = (self.lineEdit2.text())
t3 = threading.Thread(name='myThread3', target=myThread_3, args=(self.theCallbackFunc_thread3, int(id_2)))
t3.start()
Затем мне нужно передать класс для обратного вызова в основной поток:
class Communicate(QtCore.QObject):
myGUI_signal = QtCore.pyqtSignal(str)
myGUI_signal2 = QtCore.pyqtSignal(str)
myGUI_signal3 = QtCore.pyqtSignal(str)
def myThread(callbackFunc, id):
mySrc = Communicate()
mySrc.myGUI_signal.connect(callbackFunc)
for x in range (1, id):
msgForGui = "1, %s" %x
mySrc.myGUI_signal.emit(msgForGui)
time.sleep(0.8)
def myThread_2(callbackFunc, id):
mySrc = Communicate()
mySrc.myGUI_signal2.connect(callbackFunc)
for x in range (1, id):
msgForGui = "1, %s" %x
mySrc.myGUI_signal2.emit(msgForGui)
time.sleep(0.5)
И, наконец, здесь должна быть функция, в которой я на самом деле создаю геометрию и передаю ее в OpenGL wi.dget:
Итак, на самом деле, здесь у меня самая большая проблема, как правильно реализовать этот обратный вызов основной формы, чтобы что-то появлялось в виджете OpenGL? , потому что сейчас я незнать, как это реализовать.
def myThread_3(callbackFunc, id):
mySrc = Communicate()
mySrc.myGUI_signal3.connect(callbackFunc)
# show axis at OpenGL widget [name(openGLWidget)] at PyQT5 Form
w = gl.GLViewWidget()
# Show axis at OpenGL widget
axis = gl.GLAxisItem()
axis.translate(0, 0, 0)
w.addItem(axis)
и окончательные вызовы:
app = QApplication(sys.argv)
form = form_thread()
form.show()
sys.exit(app.exec_())
Снимок формы: thread_test.ui