Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 3, 2013 11:27:46

modos189
Зарегистрирован: 2012-05-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов функции из потока

Здравствуйте. Решил освоить потоки в 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(), но я не знаю как нужно для этого к ней обратиться. Заранее спасибо.

Офлайн

#2 Янв. 3, 2013 13:37:39

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Вызов функции из потока

Можно сделать, например, передав в экземпляр 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()



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Янв. 3, 2013 13:49:22

modos189
Зарегистрирован: 2012-05-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов функции из потока

Спасибо, то что надо

Офлайн

#4 Янв. 3, 2013 14:45:30

modos189
Зарегистрирован: 2012-05-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов функции из потока

Только в той тестовой функции я с помощью

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

И как мне поступить? Иконки нужно именно так, в отдельном потоке выставить

Офлайн

#5 Янв. 4, 2013 09:24:30

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Вызов функции из потока

В 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)
Но информации о задаче мало, возможно картинки загружаются все сразу в одном негуи потоке, и передавать лучше список.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version