我正在尝试使用Qt为一些科学数据编写OpenGL可视化程序。我希望能够使用我现有的程序不变,只需调用glwidget并告诉它在每个时间步结束时更新数据。但是,为了运行Qt程序,您似乎必须使用QApplication
然后qt.run()
来阻止cpu。
这是伪代码
main()
{
..set up stuff
myVisualizer = new myGLWidget();
for(int i=0;i<1000;i++)
{
..do calculations
myVisualizer.update(new data)
}
}
我意识到我可以将所有现有代码放入QThread
并让它在连接到更新时发送信号。这样会更容易。有人知道如何解决这个问题吗?
答案 0 :(得分: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() );
}
答案 1 :(得分: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()));
}