Форум сайта python.su
Здравствуйте. Решил освоить потоки в 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_())
Офлайн
Можно сделать, например, передав в экземпляр 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()
Офлайн
Спасибо, то что надо
Офлайн
Только в той тестовой функции я с помощью
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
И как мне поступить? Иконки нужно именно так, в отдельном потоке выставить
Офлайн
В 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
image = QtGui.QImage(path) self.image_ready.emit(image)
def on_image_ready(self, image): pixmap = QtGui.QPixmap.fromImage(image)
Офлайн