Russian Qt Forum

Qt => Вопросы новичков => Тема начата: str-ms от Май 09, 2017, 21:35



Название: Питон, QAction и функция вложенного объекта
Отправлено: str-ms от Май 09, 2017, 21:35
Привет мастерам Qt!
Разбираюсь с QMainWindow, пытаюсь создать в нем меню. Создал QAction со ссылкой на функцию во вложенном в QMainWindow объекте:

Код
Python
       self.upScaleAct = QAction("Zoom &In (10%)", self.previewArea, shortcut="Ctrl++",
               enabled=True, triggered=self.previewArea.upScale)
 

Сама функция:

Код
Python
   def upScale(self):
       self.settings.picWidth = int(1.1 * self.settings.picWidth)
       self.settings.picHeight = int(1.1 * self.settings.picHeight)
       maxSize = min(self.scrollArea.viewport().width(), self.scrollArea.viewport().height())
       if self.settings.picWidth > maxSize or self.settings.picHeight > maxSize:
           self.settings.picWidth = maxSize
           self.settings.picHeight = maxSize
       self.curColumns = self.maxColumns()
       self.fillViewport(resizeMode = True)
       self.scrollArea.ensureWidgetVisible(self.pixmapLabels[self.settings.currentPic],
           self.settings.picSpacing, self.settings.picSpacing)
 

Не работает... >:( ??? Когда эта функция вызывается из контекста самого previewArea (по событиям) - всё отлично, функция видит атрибуты этого объекта (например, список self.pixmapLabels). Когда же я пытаюсь запустить эту же функцию через меню основного окна - полный игнор, функция все атрибуты объекта previewArea не видит. Что-то я упускаю. Как из родительского объекта запускать функцию (метод) вложенного объекта? Не пинайте сильно, я только пытаюсь разобраться и в Питоне, и в Qt.


Название: Re: Питон, QAction и функция вложенного объекта
Отправлено: str-ms от Май 10, 2017, 08:55
Дабы никто не наступал на подобные грабли, отпишусь сам.
Проблему решил, точнее обошёл. Я не очень понимаю, что происходит при инициализации QAction, метод зачем-то вызывается, но данные в подчиненном объекте ещё не заполнены, он пустой. Я просто в QAction поставил ссылку на метод самого главного окна, а из него уже вызываю метод вложенного объекта:
Код
Python
   def upScale(self):
       print("test upScale")
       self.previewArea.upScale()
 
Так всё работает.
Если кто-то может мне объяснить логику инициализации QAction - буду благодарен.