簡體   English   中英

連接用戶自定義 function 以修改 VTK object 與 Qt 小部件

[英]Connect user custome function to modify VTK object with Qt Widgets

我目前正在對最初在 python 下制作的項目進行轉換,允許使用基本上由滑塊制成的 Qt 界面修改 a.vtk 文件的可視化。 python 下的項目功能正常,可以參考這里:

[https://github.com/sebgra/VTK_modelisation/blob/master/Projet_Modelisation_Bovio_Gradit.py][1]

我使用“個人”function 將滑塊連接到 vtk 渲染器時遇到問題。 在 python 下,連接只需完成:

def modif1():
        contour_bone.SetValue(0, Slider_1.value())
        iren.ReInitialize()
 
Slider_1 = QSlider(QtCore.Qt.Horizontal)
    Slider_1.setMinimum(0)
    Slider_1.setMaximum(200)
    Slider_1.setValue(90)
    Slider_1.valueChanged.connect(Display_1.display)
    Slider_1.valueChanged.connect(modif1)
 
# avec iren défini comme
 
mapper_bone=vtk.vtkPolyDataMapper()
    mapper_bone.SetInputConnection(contour_bone.GetOutputPort())  
    mapper_bone.SetLookupTable(lut_bone)
 
    mapper_skin=vtk.vtkPolyDataMapper()
    mapper_skin.SetInputConnection(contour_skin.GetOutputPort())
    mapper_skin.SetLookupTable(lut_skin)
 
    actor_bone=vtk.vtkActor()
    actor_bone.SetMapper(mapper_bone)
 
    actor_skin=vtk.vtkActor()
    actor_skin.SetMapper(mapper_skin)
 
    ren = vtk.vtkRenderer()
    vtkWidget.GetRenderWindow().AddRenderer(ren)
 
    iren = vtkWidget.GetRenderWindow().GetInteractor()
 
 
 
    ren.AddActor(actor_bone)
    ren.AddActor(actor_skin)
    ren.ResetCamera()
    frame.setLayout(vl)
    #setCentralWidget(self.frame)
    #show()
    iren.Initialize()
    iren.Start()
    iren.ReInitialize()

C++ 等效項可在此 repo 中獲得:

[https://github.com/sebgra/VTK_Modelisation_CPP/blob/master/src/StructuredPointsReader.cxx][1]

在 main 之外定義 modif_1 :

void modif_1(QSlider *m_Slider, vtkSmartPointer<vtkContourFilter> m_ContourFilter, vtkRenderWindowInteractor* m_iren  ){
 
  // m_ContourFilter -> setValue(0,m_Slider -> value());
  // m_iren -> ReInitialize();
  std::cout << "done" << endl;
}

和:

QSlider *Slider_1 = new QSlider(Qt::Horizontal, 0);
 
vtkSmartPointer<vtkStructuredPointsReader> reader =
    vtkSmartPointer<vtkStructuredPointsReader>::New();
  reader->SetFileName(inputFilename.c_str());
  reader->Update();
 
vtkSmartPointer<vtkContourFilter> contour_skin =
    vtkSmartPointer<vtkContourFilter>::New();
 
  contour_skin -> SetInputConnection(reader -> GetOutputPort());
  contour_skin -> SetNumberOfContours(1);
  contour_skin -> SetValue(0,50.0);
 
 
vtkSmartPointer<vtkPolyDataMapper> mapper_skin =
  vtkSmartPointer<vtkPolyDataMapper>::New();
 
  mapper_skin -> SetInputConnection(contour_skin -> GetOutputPort());
  mapper_skin -> SetLookupTable(lut_skin);
 
vtkSmartPointer<vtkActor> actor_skin =
  vtkSmartPointer<vtkActor>::New();
 
  actor_skin -> SetMapper(mapper_skin);
 
vtkSmartPointer<vtkRenderer> renderer =
  vtkSmartPointer<vtkRenderer>::New();
 
  widget -> GetRenderWindow() -> AddRenderer(renderer);
 
 
vtkRenderWindowInteractor* iren = widget->GetRenderWindow()->GetInteractor();// Get interactor
 
  iren -> Initialize();
  iren -> Start();
 
 
  QObject::connect(Slider_1, SIGNAL(valueChanged(int)), Display_1,SLOT(display(int)));
  QObject::connect(Slider_1, SIGNAL(valueChanged(int)), iren, SLOT(modif_1(&Slider_1, &contour_bone, &iren)));
 
 iren -> ReInitialize();

終端返回我:

“沒有匹配的 function 調用 'QObject::connect(QSlider*&, const char [19], vtkRenderWindowInteractor*&, const char [42])”

有人可以幫我將 modif_1 連接到 vtk 渲染器(iren)嗎?

提前致謝

只需使用新的信號/插槽語法lambda ...

 QObject::connect(Slider_1, &QSlider::valueChanged,
                  [&Slider_1, &iren, &contour_bone](int value)
                  {
                      modif_1(&Slider_1, &contour_bone, &iren);
                  });

但請注意,僅使用QSlider::valueChanged信號中的值可能比將指針傳遞給關聯的QSlider ...

void modif_1(int value, vtkSmartPointer<vtkContourFilter> m_ContourFilter, vtkRenderWindowInteractor *m_iren);

    .
    .
    .

QObject::connect(Slider_1, &QSlider::valueChanged,
                  [&iren, &contour_bone](int value)
                  {
                      modif_1(value, &contour_bone, &iren);
                  });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM