Python Qt - Как вставить элементы в виджет таблицы из другого потока? - PullRequest
0 голосов
/ 13 сентября 2018

Я хочу вставить текстовые элементы из рабочего Qthread в пользовательский интерфейс QTableWidget в главном потоке?.

Я хочу знать синтаксис для создания сигнала в главном потоке, чтобы я мог также вставить текств виде строки и столбца из рабочего потока, отправив по сигналу

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.myclass2 = myclass2()
        self.myclass2.start()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 300, 220)
        self.setWindowTitle('Icon')
        self.setWindowIcon(QIcon('web.png'))
        self.show()


class myclass2(QThread):
    def __init__(self, parent=None):
        super(myclass2, self).__init__(parent)

    def run(self):
        while True:
            time.sleep(.1)
            print(" in thread \n")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 13 сентября 2018

Вы уже знаете, что должны использовать сигнал, теперь вопрос: какие данные вам нужно отправить? , вы можете подумать, что вам следует отправить строку, столбец и текст, так сигнал должен отправить 2 целых и одну строку, затем вы подключаете его к слоту и вставляете в него, как если бы данные были созданы в основном потоке:

import sys
import time
import random
from PyQt5 import QtCore, QtWidgets


class Example(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        lay = QtWidgets.QVBoxLayout(self)

        self.table = QtWidgets.QTableWidget(10, 10)
        lay.addWidget(self.table)

        self.myclass2 = myclass2()
        self.myclass2.new_signal.connect(self.some_function)
        self.myclass2.start()

    @QtCore.pyqtSlot(int, int, str)
    def some_function(self, r, c, text):
        it = self.table.item(r, c)
        if it:
            it.setText(text)
        else:
            it = QtWidgets.QTableWidgetItem(text)
            self.table.setItem(r, c, it)

class myclass2(QtCore.QThread):
    new_signal = QtCore.pyqtSignal(int, int, str)

    def run(self):
        while True:
            time.sleep(.1)
            r = random.randint(0, 9)
            c = random.randint(0, 9)
            text = "some_text: {}".format(random.randint(0, 9))
            self.new_signal.emit(r, c, text)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ex = Example()
    ex.showMaximized()
    sys.exit(app.exec_())
...