使用OpenGL和Qt
问题描述:
科学可视化我试图写使用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
并将其发送信号时,它是为了连接到一个更新。这样做会更容易。有谁知道如何解决这个问题?
答
如果你真的不想要调查螺纹的解决方案,这将是更好的周围的一切,您可以使用以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());
}
答
您可以在应用程序中使用的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()));
}
不会在DisplayWidget插槽中的QThread的上下文中运行? – 2009-06-18 09:23:41
nope,Qt主事件循环处理线程,一切都会正常工作。 – alisami 2009-06-18 10:56:31