c++ - QT & VTK 交互风格

标签 c++ qt vtk qvtkwidget

我正在使用 VTK 作为 qvtkwidget 在 QT 中显示 3D 对象。 我知道我可以通过自己修改交互方式来改变它的交互方式。 我想分别通过右键单击和按住左键单击来旋转和移动对象。 并尝试在头文件中制作修改后的交互样式类,但在修改后的交互样式中使用其他类中声明的函数存在一些困难。这应该很简单。 有人知道吗?

  boxWidget.at(boxWidget.count()-1)->SetInput(reader->GetOutput());
        boxWidget.at(boxWidget.count()-1)->SetScalingEnabled(0); //turn this on to be able to resize the model
        boxWidget.at(boxWidget.count()-1)->SetRotationEnabled(0);
        boxWidget.at(boxWidget.count()-1)->SetInteractor(this->ui->qvtkWidget->GetInteractor());
        boxWidget.at(boxWidget.count()-1)->GetInteractor()->SetInteractorStyle(MyStyle::New());  /

BoxWidget 是我要应用“MyStyle”的对象 下面是 MyStyle 类

class MyStyle : public vtkInteractorStyleTrackballCamera , public MainWindow
{
private:
unsigned int NumberOfClicks;
int PreviousPosition[2];
int ResetPixelDistance;
public:
static MyStyle *New();

vtkTypeMacro(MyStyle, vtkInteractorStyleTrackballCamera);

PeterStyle() : NumberOfClicks(0) , ResetPixelDistance(5)
{
    this->PreviousPosition[0] = 0;
    this->PreviousPosition[1] = 0;
}

virtual void OnLeftButtonDown()
{
    qDebug() << "My Style Mouse Left Clicked";
    //std::cout << "Pressed left mouse button." << std::endl;
    this->NumberOfClicks++;
    //std::cout << "NumberOfClicks = " << this->NumberOfClicks << std::endl;
    int pickPosition[2];
    this->GetInteractor()->GetEventPosition(pickPosition);

    int xdist = pickPosition[0] - this->PreviousPosition[0];
    int ydist = pickPosition[1] - this->PreviousPosition[1];

    this->PreviousPosition[0] = pickPosition[0];
    this->PreviousPosition[1] = pickPosition[1];

    int moveDistance = (int)sqrt((double)(xdist*xdist + ydist*ydist));

    // Reset numClicks - If mouse moved further than resetPixelDistance
    if(moveDistance > this->ResetPixelDistance)
    {
        this->NumberOfClicks = 1;
    }


    if(this->NumberOfClicks == 2)
    {
        vtkSmartPointer<vtkCamera> camera =
            vtkSmartPointer<vtkCamera>::New();
        camera->SetPosition(140.0, 155.0, 590.0);
        camera->SetFocalPoint(140.0, 155.0, 0.0);
        camera->SetClippingRange(590.0, 600.0);

        this->GetCurrentRenderer()->SetActiveCamera(camera);
        qDebug() << "Double clicked.";
        this->NumberOfClicks = 0;
    }
    // forward events
    vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
}

我不知道要更改什么才能用左键单击移动对象。

最佳答案

如果您希望使用左键移动对象,则不需要子类化您自己的交互样式,vtk 已经实现了vtkInteractorStyleTrackballActor允许通过鼠标控制 Actor 的风格,无需与相机互动。然后您可以覆盖它以执行任何您想要的操作。

关于c++ - QT & VTK 交互风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27710823/

相关文章:

c++ - 文件保存过程中的进度

c++ - 如何在 OpenSSL 中获取 SSL 证书

c++ - 如果整个应用程序都是虚拟映射的,为什么 new 会进行系统调用?

c++ - 将负 const double 转换为 unsigned 结果为 0 而 non-const double 很好

c++ - 为什么 QPainter 在 QAbstractItemView::dataChanged 中不工作?

Java 与 C++ Qt : what choice for a gentle deployment?

c++ - Qt 4.6 - C++ - QTreeWidgetItem 迭代器

c++ - VTK:在 vtkCaptionWidget 中禁用 anchor 拾取/拖动

python - 计算表面曲率的导数

c++ - 删除给定框内的点云