Форум сайта python.su
Пытаюсь освоить QThread. Синтаксис в целом понял, но возник вопрос в том, как применить это в своем коде.
пишу для тренировки и с практической целью небольшую прогу для наведения порядке в каталоге с музыкой - задаешь путь к папке, паттерн с тэгами как переименовывать её, и прога переименовывает папки согласно тэгам в файлах, лежащих в них.
и с целью добавления прогресс бара понадобилось использование QThread.
а проблема вот в чем:
есть сейчас в коде 2 класса - один с GUI, другой с рабочим кодом *Renamer(), где и происходит переименование.
И застрял, во многом из-за отсутствия опыта планирования структуры серьезных прог, в том - как организовать взаимодействие QProgressBar с рабочим классом Renamer().
т.е. я создал новый класс Worker(Qthread), в нём в функции run() собственно и будет создаваться по плану объект класса Renamer().
но каким образом реализовать посыл сигналов из класса Renamer() в класс GUI не могу придумать.
вернее, единственное, что пока пришло в голову - это перенести весь код из Renamer() в класс Worker, и тогда в процессе выполнения этого кода и будут посылаться сигналы в класс GUI.*например, после каждой пройденной папки при переименовании*
но такой подход кажется мне неудобным в плане последующей читабельности и удобства кода.
Офлайн
qt-шные сигналы и шли
Офлайн
но как сделать, чтобы они были “от одного объекта”.
сейчас объясню о чем я:
что-то типа такого:
class GUI(QMainWindow):
#создается сперва объект класса Worker здесь
self.thread = Worker()
#здесь ясно дело будет connect
self.connect(self.thread, SIGNAL('custom(step(int))'), self.incrementBar)
def incrementBar(self):
#собственно, заполнение бара на шаг step
class Worker(QThread):
#здесь, метод run, в котором и создается объект класса Renamer()
def run():
test = Renamer()
#это сам рабочий код
class Renamer():
#и допустим, есть что-то типа простого цикла
for i in xrange(10):
#вот здесь начинаю не понимать.
#не могу же я просто написать
emit(SIGNAL('custom(int max)'))
#по логике, emit() это функция объекта класса Worker()
#но если я создам новую переменную
self.thread2 = Worker()
#и затем произведу сигнал
self.thread2.emit(SIGNAL('custom(int max)'))
#то ведь это будет уже другая instance класса Worker
#и поэтому self.connect(self.thread, SIGNAL('custom(step(int))'), self.incrementBar) не сработает.
Отредактировано (Окт. 20, 2010 03:01:52)
Офлайн
Давно это было, но посмотри сюда
Вполне вероятно, что у тебя тут вообще можно обойтись генератором без нитей, так как операция переименования одного файла очень быстрая.
Офлайн