PYQT Как получить данные из MainUiWindows в QThread? - PullRequest
0 голосов
/ 31 августа 2018

Я хочу знать, как я могу отправлять информацию из MainUiWindows, например, из QlineEdit, и отправлять ее в QThread. Мне нужно это в RealTime, я хочу менять эту информацию каждый раз, когда я хочу, и она меняет переменную в этом QThread.

На данный момент у меня есть:

class ThreadClassControl(QtCore.QThread):
    def __init__(self):
        QThread.__init__(self)
        self.ui=MainUiClass()

    def run(self):
        print self.ui.QlineEdit.text()

Но при этом я получаю информацию только при запуске этого потока и, как я уже сказал, хочу изменить эту переменную между ее итерациями.

Спасибо за продвижение

1 Ответ

0 голосов
/ 31 августа 2018

Виджеты Qt не являются потокобезопасными , и вы не должны получать к ним доступ из какого-либо потока, кроме основного потока (более подробную информацию вы можете найти в документации по Qt). Правильный способ использования потоков и виджетов Qt - через сигналы / слоты.

Чтобы перенести значения GUI во второй поток, вам нужно будет присвоить их этому потоку из основного потока (см. [1])

Если вы хотите изменить такое значение в потоке, вам нужно использовать сигналы (см. [2])

class MainThread(QtGui.QMainWindow, Ui_MainWindow):
    ...       
    def __init__(self, parent = None):
        ...
        # Create QLineEdit instance and assign string
        self.myLine = QLineEdit()
        self.myLine.setText("Hello World!")

        # Create thread instance and connect to signal to function
        self.myThread = ThreadClassControl()
        self.myThread.lineChanged.connect(self.myLine.setText) # <--- [2]
        ...

    def onStartThread(self):      
        # Before starting the thread, we assign the value of QLineEdit to the other thread
        self.myThread.line_thread = self.myLine.text() # <--- [1]

        print "Starting thread..."
        self.myThread.start()

    ... 

class ThreadClassControl(QtCore.QThread):
    # Declaration of the signals, with value type that will be used
    lineChanged = QtCore.pyqtSignal(str) # <--- [2]

    def __init__(self):
        QtCore.QThread.__init__(self)

    def __del__(self):
        self.wait()

    def run(self):
        print "---> Executing ThreadClassControl" 

        # Print the QLineEdit value assigned previously
        print "QLineEdit:", self.line_thread # <--- [1]

        # If you want to change the value of your QLineEdit, emit the Signal
        self.lineChanged.emit("Good bye!") # <--- [2]

В результате эта программа напечатает "Hello World!" но последнее сохраненное значение будет «До свидания!», сделанное потоком.

Надеюсь, это помогло. Удачи!

...