2009-06-30 85 views
0

我想從不是立即返回的python腳本調用一個包裝的C++函數(詳細地說:它是一個啓動QApplication窗口的函數,函數是QApplication-> exec())。所以在這個函數調用之後,我想繼續到Python腳本中的下一行,但執行該腳本和上一行時,它會永久掛起。從python腳本中調用非返回的python函數

相反,當我在python命令行中手動輸入我的腳本行時,我可以在非返回函數調用行上再按一次第二次輸入後繼續我的下一行。

那麼如何解決執行腳本時的問題呢?

謝謝!

編輯:

我的python解釋器被嵌入到應用程序中。我想爲這個應用程序編寫一個擴展,作爲一個單獨的Qt4窗口。所有的Python的東西只是爲了讓我的圖形插件可以訪問每個腳本(每boost.python包裝)。

我的Python腳本:

import imp 
import os 
Plugin = imp.load_dynamic('Plugin', os.getcwd() + 'Plugin.dll') 

qt = Plugin.StartQt4()  # it hangs here when executing as script 
pl = PluginCPP.PluginCPP() # Creates a QMainWindow 
pl.ShowWindow()   # shows the window 

對Qt的啓動功能的C++代碼如下所示:

class StartQt4 
{ 
public: 
    StartQt4() 
    { 
    int i = 0; 
    QApplication* qapp = new QApplication(i, NULL); 
    qapp->exec(); 
    } 
}; 
+1

請給我們的代碼。 – 2009-06-30 09:02:22

回答

2

使用一個線程(longer example here):

from threading import Thread 

class WindowThread(Thread): 
    def run(self): 
     callCppFunctionHere() 

WindowThread().start() 
+0

我認爲這會很好,但不是在我的情況。一切都應該在同一個線程中運行。 – 2009-06-30 10:14:29

1

的QApplication: :exec()啓動應用程序的主循環,並且僅在應用程序退出後纔會返回。如果你想在應用程序啓動後運行代碼,你應該使用Qt的事件處理機制。

http://doc.trolltech.com/4.5/qapplication.html#exec

爲了使您的應用程序執行閒置 處理,即執行特殊的 功能,只要沒有未決 事件,使用QTimer 0超時。 可以使用processEvents()來實現更高級的空閒處理方案 。

0

我假設您已經使用PyQT

+0

不,我只使用python來啓動我的Qt窗口。這個C++代碼用boost.python封裝到python中 – 2009-06-30 10:12:57