[Qt QML] 如何呼叫Python class functions
之前我寫了一篇文章,[Qt QML] 如何呼叫C++ class functions,簡單示範了如何從以QML撰寫的GUI來呼叫C++層所定義的class function。相同的,這篇文章則是把C++實作的部分改成用Python實作,實作目標與該篇文章的範例程式一樣,「等待三秒將應用程式關閉」。首先貼上這個範例程式的執行結果,其實就跟該篇文章看到的一樣。這篇的重點是如何在QML中呼叫Python的類別function,所以下面就簡單說明一下Python程式碼的部分,至於QML的部分,跟上面提到的那篇文章中是一樣的。
Python程式碼部分
跟該篇文章一樣,我定義了一個類別,一樣名為Controller,也宣告了一個類別function名為quitApp()。
因為Pyside並沒有像在C++一樣有提供Q_INVOKABLE這樣的marco,所以要讓QML可以呼叫Python類別function的話,就是利用如同C++中的另一個方法,也就是定義為slot function,做法是只要在function之前加一個“decorators”,為“@Slot”,如下。
@Slot(int)
def quitApp(self, seconds):
另外,要讓其class所產生的instance作為QML裡的一個property,跟C++的做法是一樣的,只是改成Python實作,如下。
engine = QQmlApplicationEngine()
controller = Controller()
rootContext = engine.rootContext()
rootContext.setContextProperty("ctrl", controller)
可以跟C++的比較一下,我把之前的程式碼複製過來,就可以發現實作邏輯是一樣的。
QQmlApplicationEngine engine;
Controller *pController = new Controller();
QQmlContext *pRootContext = engine.rootContext();
pRootContext->setContextProperty("ctrl", pController);