2009-06-18 120 views
2

科學可視化我試圖寫使用Qt的一些科學數據OpenGL的可視化程序。我希望能夠不改變我的現有程序,只需調用glwidget並在每個時間步結束時告訴它更新數據即可。然而,爲了運行一個Qt程序看起來你必須使用QApplication然後qt.run()該塊CPU。使用OpenGL和Qt

這裏是僞代碼

main() 

{ 
    ..set up stuff 
    myVisualizer = new myGLWidget(); 

    for(int i=0;i<1000;i++) 
    { 
     ..do calculations 
     myVisualizer.update(new data) 
    } 
} 

我意識到,我可以把我所有的現有代碼的QThread並將其發送信號時,它是爲了連接到一個更新。這樣做會更容易。有誰知道如何解決這個問題?

回答

2

如果你真的不想要調查螺紋的解決方案,這將是更好的周圍的一切,您可以使用以0基本上特殊情況下超時,當您運行爲0的超時計時器,它處理的是目前在事件發生後運行相應的代碼事件隊列。所以,你可以建立這樣的事情:

class MyDialog : public QDialog 
{ 
    Q_OBJECT 
public: 
    MyDialog() 
    { 
     m_step = 0; 
     QTimer::singleShot(0, this, SLOT(Process())); 
    } 

public slots: 
    void Process() 
    { 
     // do calculations 
     m_step++; 
     QTimer::singleShot(0, this, SLOT(Redraw())); 
     if (m_step != 1000) 
      QTimer::singleShot(0, this, SLOT(Process())); 
    } 

    void Redraw() { // do redrawing code here } 

private: 
    int m_steps; 
}; 

然後用Qt的正確主代碼結合起來:

int main(int argc, char** argv) 
{ 
    QApplication app(argc, argv); 
    MyDialog dialog; 
    dialog.show(); 
    return (app.exec()); 
} 
0

您可以在應用程序中使用的QThread並在一個單獨的線程做計算。 你所要做的就是繼承QThread並實現run()方法。

您可以創建一個計算器類,並在該類添加一些信號和信號連接到顯示部件的更新插槽(在這種情況下QGLWidget來繪圖:: updateGL())。

這裏是一個粗略的例子:(所有你必須是建立在你的main()函數線程和DisplayWidget和設置線程的DisplayWidget)

class Calculator: public QObject 
{ 
    Q_OBJECT 

    public: 
     Calculator(); 
     void start(); 

    signals: 
     void updateDisplayWidget(/* you can put the resulting data */); 
}; 

class DisplayWidget(): public QGLWidget 
{ 
    Q_OBJECT 
    // override paint methods here 
    public slots: 
      void slotUpdateDisplayWidget(/* you can receive the resulting data*/); 
}; 

class MyThread : public QThread 
{ 
public: 
    void run(); 
    void setDisplayWidget(DisplayWidget* displayWidget); 

private: 
    Calculator mCalculator; 
}; 

void MyThread::run() 
{ 
    mCalculator.start(); 
    exec(); 
} 

MyThread::setDisplayWidget(DisplayWidget* displayWidget) 
{ 
    displayWidget->moveToThread(this); 
    connect(&mCalculator, SIGNAL(updateDisplayWidget()), displayWidget, SLOT(slotUpdateDisplayWidget())); 
} 
+0

不會在DisplayWidget插槽中的QThread的上下文中運行? – 2009-06-18 09:23:41

+0

nope,Qt主事件循環處理線程,一切都會正常工作。 – alisami 2009-06-18 10:56:31