Взаимодействие с виджетом OpenGL из формы PyQt5 как отдельного потока - PullRequest
0 голосов
/ 13 декабря 2018

Мне нужно добавить графику (геометрию) в виджет 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...