2017-02-05 16 views
2

Мне нужно добавить некоторые функции графическому виджету в форме, которую я создал с помощью Qt Designer.Пользовательский код виджета дизайнера Qt?

Например, я обычно сделать что-то вроде этого:

class custom_gv(QGraphicsView): 
    def __init__(self): 
     super().__init__() 

    def zoom(self): 
     # custom code here 

Но в этом случае графическое представление является частью окна, я сделал в Qt Designer. Я знаю, что вы можете использовать «способствовать» функции в Qt Designer, но я не знаю, как использовать, что в коде, особенно с учетом того, что я использую этот метод, чтобы использовать Qt Designer окна:

from PyQt5.uic import loadUiType 

custom_window = loadUiType('ui.ui') 

class Window(QMainWindow, custom_window): 
    def __init__(self): 
     QMainWindow.__init__(self) 
     custom_window.__init__(self) 
     self.setupUi(self) 

Так как бы Я собираюсь настроить код графического представления в моем окне, когда я использую Qt Designer?

+0

Продвижение виджета [довольно просто] (http://stackoverflow.com/a/22543079/984421). Что конкретно вы не понимаете по этому поводу? – ekhumoro

+0

Как я использую его в PyQt при использовании метода LoadUiType вместо преобразования первого кода кода –

+0

Он работает точно так же. – ekhumoro

ответ

2

Наиболее распространенный способ решить это с помощью widget promotion. Это позволит заменить виджет, определенный в Qt Designer, собственным классом. Шаги для осуществления этого являются следующие:

В Qt Designer выберите QGraphicsView вы хотите заменить, а затем щелкните правой кнопкой мыши и выберите Содействие в .... В диалоговом окне установите Продвинутое имя класса на «custom_gv» и установите Заголовочный файл в путь импорта python для модуля, который содержит этот класс (например, «mypkg.widgets»). Затем нажмите . Добавить и Содействуйте, и вы увидите изменение класса с «QGraphicsView» на «custom_gv» в панели Object Inspector.

Когда дизайнер ui файл Qt преобразуется в PyQt код, он будет автоматически добавить оператор импорта, как это:

from mypkg.widgets import custom_gv 

, а затем в преобразованном коде он заменит что-то вроде этого:

self.graphicsView = QtWidgets.QGraphicsView(MainWindow) 

с этим:

self.graphicsView = custom_gv(MainWindow) 

Так код в файле ui ничего не знает о пользовательском классе: это просто имя, которое импортируется из другого места. Это означает, что вы можете свободно писать пользовательский класс любым способом.

В PyQt этот механизм работает таким же образом с pyuic, как и с модулем uic. Функции loadUi и loadUiType генерируют точно такой же код, как и pyuic. Единственное отличие заключается в том, что инструмент pyuic записывает сгенерированный код в файл, тогда как модуль uic загружает его непосредственно через exec.