Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 31, 2008 00:14:10

mario
От:
Зарегистрирован: 2007-08-04
Сообщения: 43
Репутация: +  0  -
Профиль   Отправить e-mail  

Пример PyQt4

Большущее спасибо, разобрался, что к чему. Чтобы не плодить тем, хотел бы спросить:

- поискал и нашёл вещь QList (http://doc.trolltech.com/4.4/qlist.html)
self.emit(QtCore.SIGNAL('data_from_thread(QList)'), data) как-то так писать?
- дело в том, что иногда требуется с функции получить целый список переменных (list)
- как поступить в таком случае? ведь полученное надо преобразовать к элементам и отправить в self.editor.append

Подскажите пожалуйста, если можно, ответа пока нигде не нашёл (как передать QList и его элементы отправить в self.editor)



Офлайн

#2 Авг. 31, 2008 14:06:48

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Пример PyQt4

когда коннектишь, не обязательно использовать существующие слоты эдитора для добавления строк, можно коннектить в своим функциям, передавая им параметр QList, а уже в этой функции обрабатывать список и добавлять данные в эдитор.



Офлайн

#3 Сен. 1, 2008 20:49:22

mario
От:
Зарегистрирован: 2007-08-04
Сообщения: 43
Репутация: +  0  -
Профиль   Отправить e-mail  

Пример PyQt4

Tnx, так и думал примерно спасибо большое, идею понял про слот = функция:

class QWorker(QtCore.QThread):

def __init__(self, name):
QtCore.QThread.__init__(self)
self.name = name
def run(self):
try:#допустим в data уже получили list вот такой
data=['dssdsd', 'dsdsdssdd', 'blablala']
self.emit(QtCore.SIGNAL('data_from_data(QList)'), data)
time.sleep(0.1)
except Exception, e:
print e
Потом у меня в классе формы:

class FormMain(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self):
....
def addlist(self, QList):
for elements in QList:
self.editor.append(elements)

def updateUi(self): #вызывается при нажатии на кнопку ...
self.thread=QWorker(text)
self.connect(self.thread2, QtCore.SIGNAL('data_from_data(QList)'), self.addlist)
self.thread.start()
Получается ошибка:
argument 0 of signal QWorker.data_from_data(QList) has an invalid type
Вместо QList писал уже по всякому, QList<string> и т.п …

Подскажите пожалуйста, как list в PyQt задать правильно?



Офлайн

#4 Сен. 25, 2008 19:13:22

Leron
От:
Зарегистрирован: 2007-12-11
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Пример PyQt4

Я немного поковырял этот пример - вот что вышло:

#  _*_ coding: utf-8 _*_

import sys, time
from threading import Thread
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import QObject, SIGNAL


class TextThread(Thread,QObject): #без QObject, получаю ниже ошибку - argument 1 of QObject.connect has an invalid type
def __init__(self, name, *args):
self.counter=0
self.name=name
super(TextThread, self).__init__(*args)

def run(self):
while self.counter < 20:
print self.name, self.counter
QtCore.QObject.emit(SIGNAL('BLA_BLA'), self.name)
self.counter = self.counter + 1
time.sleep(0.1)

class MainWindow(QtGui.QMainWindow):
def __init__(self, *args):
apply(QtGui.QMainWindow.__init__, (self,) + args)
self.editor=QtGui.QTextEdit(self)
self.setCentralWidget(self.editor)
self.thread1=TextThread("thread1")
self.thread2=TextThread("thread2")
QObject.connect(self.thread1, SIGNAL('BLA_BLA'), self.editor.append)
self.thread1.start()
self.thread2.start()

def main(args):
app=QtGui.QApplication(args)
win=MainWindow()
win.show()
app.exec_()

if __name__=="__main__":
main(sys.argv)
Такая проблема - получаю ошибку underling c++ object has been deleted. Один раз я уже постил вопрос об этой ошибке - http://python.su/forum/viewtopic.php?id=1904 тогда Poltergeist посоветовал мне убрать super… Сейчас что то не получается %).



Офлайн

#5 Сен. 26, 2008 09:26:22

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Пример PyQt4

Немного изменил пример:

#  _*_ coding: utf-8 _*_

import sys, time
from threading import Thread
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import QObject, SIGNAL


class TextThread(Thread):
def __init__(self, name, *args):
self.counter=0
self.name=name
super(TextThread, self).__init__(*args)
self.emitter = QObject()

def run(self):
while self.counter < 20:
print self.name, self.counter
self.emitter.emit(SIGNAL('BLA_BLA'), self.name)
self.counter = self.counter + 1
time.sleep(0.1)

class MainWindow(QtGui.QMainWindow):
def __init__(self, *args):
apply(QtGui.QMainWindow.__init__, (self,) + args)
self.editor=QtGui.QTextEdit(self)
self.setCentralWidget(self.editor)
self.thread1=TextThread("thread1")
self.thread2=TextThread("thread2")
self.connect(self.thread1.emitter, SIGNAL('BLA_BLA'), self.editor.append)
self.connect(self.thread2.emitter, SIGNAL('BLA_BLA'), self.editor.append)
self.thread1.start()
self.thread2.start()

def main(args):
app=QtGui.QApplication(args)
win=MainWindow()
win.show()
app.exec_()

if __name__=="__main__":
main(sys.argv)
Вам надо почитать про множественную наследовательность в питоне, не хорошо вот так микшировать родителей, т.к. вам придётся вызывать два родительских конструктора и не известно что из этого потом выйдет, это сейчас оно работает (примерно так):
#  _*_ coding: utf-8 _*_

import sys, time
from threading import Thread
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import QObject, SIGNAL


class TextThread(Thread,QObject):
def __init__(self, name, *args):
QObject.__init__(self)
self.counter=0
self.name=name
super(TextThread, self).__init__(*args)


def run(self):
while self.counter < 20:
print self.name, self.counter
self.emit(SIGNAL('BLA_BLA'), self.name)
self.counter = self.counter + 1
time.sleep(0.1)

class MainWindow(QtGui.QMainWindow):
def __init__(self, *args):
apply(QtGui.QMainWindow.__init__, (self,) + args)
self.editor=QtGui.QTextEdit(self)
self.setCentralWidget(self.editor)
self.thread1=TextThread("thread1")
self.thread2=TextThread("thread2")
self.connect(self.thread1, SIGNAL('BLA_BLA'), self.editor.append)
self.connect(self.thread2, SIGNAL('BLA_BLA'), self.editor.append)
self.thread1.start()
self.thread2.start()

def main(args):
app=QtGui.QApplication(args)
win=MainWindow()
win.show()
app.exec_()

if __name__=="__main__":
main(sys.argv)
…. а какие грабли можно получить в дальнейшем?

Первый пример я считаю более корректным. Я там просто добавил в класс потока self.emitter = QObject(), это чтобы было что с чем связывать: self.connect(self.thread1.emiter, SIGNAL('BLA_BLA'), self.editor.append)



Офлайн

#6 Сен. 26, 2008 19:34:26

Leron
От:
Зарегистрирован: 2007-12-11
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Пример PyQt4

Спасибо



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version