Найти - Пользователи
Полная версия: Вызов функции из потока
Начало » GUI » Вызов функции из потока
1
modos189
Здравствуйте. Решил освоить потоки в Qt но столкнулся с проблемой вызова функции в родительском классе из класса с потоком.

class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self)
        self.setupUi(self)
        self.initializing()
    def initializing(self):
        self.s1 = myQThread()
        self.s1.start()
    def test():
        pass
class myQThread(QtCore.QThread):
    def __init__(self):
        QtCore.QThread.__init__(self)
    def run(self):
        MainWindow.test()
if __name__ == "__main__":
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

как видно на примере, запускается класс MainWindow и передаёт управление функции initializing(). Та запускает новый поток с классом myQThread. Запускается функция run(). Теперь нужно из потока запустить функцию test(), но я не знаю как нужно для этого к ней обратиться. Заранее спасибо.
JOHN_16
Можно сделать, например, передав в экземпляр myQThread экземпляр MainWindow:
class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self)
        self.setupUi(self)
        self.initializing(self)
    def initializing(self):
        self.s1 = myQThread(self)
        self.s1.start()
    def test():
        pass
class myQThread(QtCore.QThread):
    def __init__(self, target):
        QtCore.QThread.__init__(self)
        self.target=target
    def run(self):
       self.target.test()
modos189
Спасибо, то что надо
modos189
Только в той тестовой функции я с помощью

icon1 = QtGui.QIcon()
icon1.addPixmap(QtGui.QPixmap(“icon.png”), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.listWidget_2.item(i).setIcon(icon1)

для пунктов listWidget_2 выставляю иконку, но в ответ:

QPixmap: It is not safe to use pixmaps outside the GUI thread

И как мне поступить? Иконки нужно именно так, в отдельном потоке выставить
reclosedev
В Qt нельзя обновлять элементы GUI в других потоках. Это делается через сигналы:
class myQThread(QtCore.QThread):
    something_ready = QtCore.pyqtSignal(object)
    def __init__(self):
        QtCore.QThread.__init__(self)
        
    def run(self):
        some_object = create_something()
        self.something_ready.emit(some_object)
class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
...
    def initializing(self):
        self.s1 = myQThread(self)
        self.s1.something_ready.connect(self.test)
        self.s1.start()
    def test(self, some_object):
        # do something with GUI and some_object
Если я правильно понял, Вам нужно чтобы картинки загружались многопоточно? Тогда в Вашем случае добавляется то, что QPixmap нельзя использовать в других потоках. Для этого нужно загружать картинки в QImage в отдельном потоке(ах) и передавать их через сигнал в главный поток:
image = QtGui.QImage(path)
self.image_ready.emit(image)
а там:
def on_image_ready(self, image):
    pixmap = QtGui.QPixmap.fromImage(image)
Но информации о задаче мало, возможно картинки загружаются все сразу в одном негуи потоке, и передавать лучше список.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB