Добавяне на функции за събития извън PyQt/PySide генериран код

Използвам PySide по не толкова MVC начин, което означава, че се опитвам, доколкото е възможно, да не редактирам генерирания .ui в .py файл, поставям логиката на приложението си в пакети (модели) и имам един модул (. pyw файл) по-скоро като контролер за всички тях за инициализиране и управление. Не е най-добрата практика, но се справям добре, всичко, което искам е, че не искам да добавям код към генерирания ui .py файл (по-скоро като моя изглед)

Сега тук е проблемът

Забелязах, че генерираният PySide файл не наследява от QDialog или QMainWindow, тъй като трябва да го създадете, когато създавате класа, в резултат на това събития като closeEvent(self, event) не работят вътре в класа, дори когато го поставите там. Знам как да пиша функции за QActions и връзки с джаджи, но НЕ ЗНАМ КАК ДА ДОБАВЯ БАЗИРАНА НА КЛАС ФУНКЦИЯ КЪМ ГЕНЕРИРАН КЛАС PYSIDE ИЗВЪН КЛАСА.

Ако трябва да редактирам генерирания клас на изглед, мога перфектно да го настроя според това, което искам, НО не искам, защото мога да направя изменение в QtDesigner и да компилирам по всяко време

Това е моят въпрос, тъй като не искам как да прикача, да речем, closeEvent към обекта, създаден от класа в моя клас на контролер, без да докосвам генерирания клас на изглед.

Благодаря


person Temitayo    schedule 27.02.2014    source източник


Отговори (2)


Никога няма нужда да редактирате потребителския интерфейс, генериран от pyside-uic.

Има три основни метода за добавяне на функционалност на ниво клас към уиджети от Qt Designer. Първо, за джаджата от най-високо ниво можете просто да създадете подклас, като този:

from PyQt4 import QtCore, QtGui
from mainwindow_ui import Ui_MainWindow

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        Ui_MainWindow().setupUi(self)

    def closeEvent(self, event):
        print('Goodbye world!')
        QtGui.QMainWindow.closeEvent(self, event)

Второ, за приспособления, които не са от най-високо ниво, можете да използвате event- филтър, като този:

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        ...
        self.lineEdit.installEventFilter(self)

    def eventFilter(self, source, event):
        if (event.type() == QtCore.QEvent.MouseMove and
            source is self.lineEdit):
            print('mouse-move:', event.globalPos())
        return QtGui.QMainWindow.eventFilter(self, source, event)

Така че вместо да прилагате отново mouseMoveEvent в подклас QLineEdit, можете да слушате за същите събития чрез филтъра за събития. Всички защитени функции имат съответния тип събитие, който може да бъде достъпен по този начин.

Последният метод е популяризиране на джаджи, което е по-сложно за настройка, но може би дава най-голяма гъвкавост. Това ви позволява напълно да замените уиджетите от Qt Designer с ваши собствени персонализирани подкласове.

За да направите това, в Qt Designer щракнете с десния бутон върху изпълнимия модул, който искате да замените, и изберете „Повиши до...“. В диалоговия прозорец задайте „Име на повишен клас“ на вашия персонализиран подклас (напр. „MyLineEdit“) и задайте „Header file“ на пътя за импортиране на Python за модула, съдържащ подкласа (напр. „myapp“ или „myapp.gui“ ). След това щракнете върху „Добавяне“ и след това върху „Популяризиране“ и ще видите промяната на класа от „QLineEdit“ на „MyLineEdit“ в панела на инспектора на обекти.

С това на място всичко, което трябва да направите, е да се уверите, че модулът myapp съдържа MyLineEdit клас, който може да бъде импортиран от модула .ui, генериран от pyside-uic.

person ekhumoro    schedule 27.02.2014

Monkey Patching свърши работа, не знам защо не съм преподавал на това

person Temitayo    schedule 28.02.2014