我有一个继承自QVTKWidget的小部件。
class MyWidget : public QVTKWidget
{
...
}
此小部件使用QT Designer和QT Interface Compiler从自动生成的标头ui_MainWindow.h
文件中实例化。
...
myWidget = new MyWidget(centralWidget);
myWidget->setObjectName(QString::...);
...
在继承自QMainWindow的主窗口中,调用了setupUi
,因此myWidget被初始化。
在MyWidget的构造函数中,初始化了vtkRenderWindow和vtRenderer。
MyWidget::MyWidget(QWidget *parent) : QVTKWidget(parent)
{
...
renderWindow = vtkRenderWindow::New();
renderer = vtkRenderer::New();
renderer->SetBackground(72.0 / 255.0, ...
renderWindow->AddRenderer(renderer);
this->SetRenderWindow(renderWindow);
QVTKInteractor * iren = this->GetInteractor();
renderWindow->SetInteractor(iren);
camera = vtkCamera::New();
camera->SetPosition(...
camera->SetFocalPoint(...
camera->SetViewUp(...
renderer->SetActiveCamera(camera);
draw(renderer); // Custom draw function, adds actors etc.
renderer->Render();
renderWindow->Render();
iren->Render();
}
但是,在我点击并移动(MouseMove)之前,不会显示任何内容。然后,我的场景出现了。我已尝试更改通话顺序以及在计时器中添加额外的Render通话,但无济于事。
有人能指出我一个好的方法来确保以这种方式实例化的这个小部件在构造函数通过后呈现吗?
注意:我没有自己的Mouse-Move实现。鼠标移动似乎具有正确的效果,即在首次渲染时,根据我的鼠标移动,场景会稍微旋转。
答案 0 :(得分:0)
Try calling:
iRen->ReInitialize()
as the very last step in your code. Whenever I want to ensure that the render window interactor is up to date, I call reinitialize on it. Let me know if it works.