vtk中使用widgets的完整例子代码

QT 基于VTK编写STL三维显示程序 基于QT,C++,VTK编写一个读取stl文件并显示的界面应用程序 阅读详情

#include <vtkAutoInit.h>

VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);

#include "vtkActor.h"
#include "vtkAppendPolyData.h"
#include "vtkButtonWidget.h"
#include "vtkCommand.h"
#include "vtkConeSource.h"
#include "vtkEllipticalButtonSource.h"
#include "vtkGlyph3D.h"
#include "vtkLookupTable.h"
#include "vtkNew.h"
#include "vtkPNGReader.h"
#include "vtkPlatonicSolidSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkProp3DButtonRepresentation.h"
#include "vtkProperty.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkSphereSource.h"
#include "vtkTIFFReader.h"
#include "vtkTestUtilities.h"
#include "vtkTesting.h"
#include "vtkTexturedButtonRepresentation.h"
#include "vtkTexturedButtonRepresentation2D.h"
#include <vtkBMPReader.h>
#include "vtkSmartPointer.h"
#include "vtkClipPolyData.h"
#include "vtkImplicitPlaneRepresentation.h"
#include "vtkImplicitPlaneWidget2.h"
#include "vtkInteractorEventRecorder.h"
#include "vtkLODActor.h"
#include "vtkPlane.h"
#include "vtkPolyData.h"
#include <vtkImplicitPlaneWidget.h>
#include "vtkSliderRepresentation2D.h"
#include "vtkSliderRepresentation3D.h"
#include "vtkSliderWidget.h"
#include "vtkWidgetEvent.h"
#include "vtkWidgetEventTranslator.h"
#include "vtkSphere.h"
#include <vtkImageData.h>
#include <vtkImageDataOutlineFilter.h>
#include <vtkImagePlaneWidget.h>
#include <vtkVolume16Reader.h>
#include <vtkImageMapToColors.h>
#include <vtkImageActor.h>
#include <vtkCellPicker.h>
#include "vtkMath.h"
#include "vtkMathUtilities.h"
#include <vtkImageMapper3D.h>
#include "vtkLogger.h"
#include <vtkCamera.h>
#include "vtkRegressionTestImage.h"
#include "vtkImageReslice.h"
#include "vtkInteractorStyleImage.h"
#include "vtkOutlineFilter.h"
#include "vtkPlaneSource.h"
#include "vtkResliceCursor.h"
#include "vtkResliceCursorActor.h"
#include "vtkResliceCursorLineRepresentation.h"
#include "vtkResliceCursorPolyDataAlgorithm.h"
#include "vtkResliceCursorThickLineRepresentation.h"
#include "vtkResliceCursorWidget.h"
#include "vtkSeedRepresentation.h"
#include "vtkSeedWidget.h"
#include "vtkPointHandleRepresentation2D.h"
#include <vtkProperty2D.h>
#include <vtkCompassRepresentation.h>
#include <vtkCompassWidget.h>
#include <vtkAnnotatedCubeActor.h>
#include "vtkDistanceRepresentation2D.h"
#include "vtkDistanceWidget.h"
#include "vtkAxisActor2D.h"
#include <vtkTextProperty.h>
#include <vtkMatrix4x4.h>
#include <vtkStreamingDemandDrivenPipeline.h>
#include <vtkInformation.h>

#include <iostream>
// The mouse motion callback, to turn "Slicing" on and off
class vtkImageInteractionCallback : public vtkCommand
{
public:
    static vtkImageInteractionCallback* New() { return new vtkImageInteractionCallback; }

    vtkImageInteractionCallback()
    {
        this->Slicing = 0;
        this->ImageReslice = nullptr;
        this->Interactor = nullptr;
    }

    void SetImageReslice(vtkImageReslice* reslice) { this->ImageReslice = reslice; }

    vtkImageReslice* GetImageReslice() { return this->ImageReslice; }

    void SetInteractor(vtkRenderWindowInteractor* interactor) { this->Interactor = interactor; }

    vtkRenderWindowInteractor* GetInteractor() { return this->Interactor; }

    void Execute(vtkObject*, unsigned long event, void*) override
    {
        vtkRenderWindowInteractor* interactor = this->GetInteractor();

        int lastPos[2];
        interactor->GetLastEventPosition(lastPos);
        int currPos[2];
        interactor->GetEventPosition(currPos);

        if (event == vtkCommand::LeftButtonPressEvent)
        {
            this->Slicing = 1;
        }
        else if (event == vtkCommand::LeftButtonReleaseEvent)
        {
            this->Slicing = 0;
        }
        else if (event == vtkCommand::MouseMoveEvent)
        {
            if (this->Slicing)
            {
                vtkImageReslice* reslice = this->ImageReslice;

                // Increment slice position by deltaY of mouse
                int deltaY = lastPos[1] - currPos[1];

                reslice->Update();
                double sliceSpacing = reslice->GetOutput()->GetSpacing()[2];
                vtkMatrix4x4* matrix = reslice->GetResliceAxes();
                // move the center point that we are slicing through
                double point[4];
                double center[4];
                point[0] = 0.0;
                point[1] = 0.0;
                point[2] = sliceSpacing * deltaY;
                point[3] = 1.0;
                matrix->MultiplyPoint(point, center);
                matrix->SetElement(0, 3, center[0]);
                matrix->SetElement(1, 3, center[1]);
                matrix->SetElement(2, 3, center[2]);
                interactor->Render();
            }
            else
            {
                vtkInteractorStyle* style =
                    vtkInteractorStyle::SafeDownCast(interactor->GetInteractorStyle());
                if (style)
                {
                    style->OnMouseMove();
                }
            }
        }
    }

private:
    // Actions (slicing only, for now)
    int Slicing;

    // Pointer to vtkImageReslice
    vtkImageReslice* ImageReslice;

    // Pointer to the interactor
    vtkRenderWindowInteractor* Interactor;
};

// The program entry point
int tutorial_reslice_1(int argc, char* argv[])
{

    std::string rootDir = std::string(DATA_DIR);
    std::string fullpath = rootDir + "headsq/quarter";


    // Start by loading some data.
    vtkSmartPointer<vtkImageReader2> reader = vtkSmartPointer<vtkImageReader2>::New();
    reader->SetFilePrefix(fullpath.c_str());
    reader->SetDataExtent(0, 63, 0, 63, 1, 93);
    reader->SetDataSpacing(3.2, 3.2, 1.5);
    reader->SetDataOrigin(0.0, 0.0, 0.0);
    reader->SetDataScalarTypeToUnsignedShort();
    reader->SetDataByteOrderToLittleEndian();
    reader->UpdateWholeExtent();

    // Calculate the center of the volume
    reader->Update();
    int extent[6];
    double spacing[3];
    double origin[3];

    reader->GetOutputInformation(0)->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent);
    reader->GetOutput()->GetSpacing(spacing);
    reader->GetOutput()->GetOrigin(origin);

    double center[3];
    center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]);
    center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]);
    center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]);

    // Matrices for axial, coronal, sagittal, oblique view orientations
    // static double axialElements[16] = {
    //         1, 0, 0, 0,
    //         0, 1, 0, 0,
    //         0, 0, 1, 0,
    //         0, 0, 0, 1 };

    // static double coronalElements[16] = {
    //         1, 0, 0, 0,
    //         0, 0, 1, 0,
    //         0,-1, 0, 0,
    //         0, 0, 0, 1 };

    static double sagittalElements[16] = {
      0, 0, -1, 0, //
      1, 0, 0, 0,  //
      0, -1, 0, 0, //
      0, 0, 0, 1   //
    };

    // static double obliqueElements[16] = {
    //         1, 0, 0, 0,
    //         0, 0.866025, -0.5, 0,
    //         0, 0.5, 0.866025, 0,
    //         0, 0, 0, 1 };

    // Set the slice orientation
    vtkSmartPointer<vtkMatrix4x4> resliceAxes = vtkSmartPointer<vtkMatrix4x4>::New();
    resliceAxes->DeepCopy(sagittalElements);
    // Set the point through which to slice
    resliceAxes->SetElement(0, 3, center[0]);
    resliceAxes->SetElement(1, 3, center[1]);
    resliceAxes->SetElement(2, 3, center[2]);

    // Extract a slice in the desired orientation
    vtkSmartPointer<vtkImageReslice> reslice = vtkSmartPointer<vtkImageReslice>::New();
    reslice->SetInputConnection(reader->GetOutputPort());
    reslice->SetOutputDimensionality(2);
    reslice->SetResliceAxes(resliceAxes);
    reslice->SetInterpolationModeToLinear();

    // Create a greyscale lookup table
    vtkSmartPointer<vtkLookupTable> table = vtkSmartPointer<vtkLookupTable>::New();
    table->SetRange(0, 2000);            // image intensity range
    table->SetValueRange(0.0, 1.0);      // from black to white
    table->SetSaturationRange(0.0, 0.0); // no color saturation
    table->SetRampToLinear();
    table->Build();

    // Map the image through the lookup table
    vtkSmartPointer<vtkImageMapToColors> color = vtkSmartPointer<vtkImageMapToColors>::New();
    color->SetLookupTable(table);
    color->SetInputConnection(reslice->GetOutputPort());

    // Display the image
    vtkSmartPointer<vtkImageActor> actor = vtkSmartPointer<vtkImageActor>::New();
    actor->GetMapper()->SetInputConnection(color->GetOutputPort());

    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);

    vtkSmartPointer<vtkRenderWindow> window = vtkSmartPointer<vtkRenderWindow>::New();
    window->AddRenderer(renderer);

    // Set up the interaction
    vtkSmartPointer<vtkInteractorStyleImage> imageStyle =
        vtkSmartPointer<vtkInteractorStyleImage>::New();
    vtkSmartPointer<vtkRenderWindowInteractor> interactor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetInteractorStyle(imageStyle);
    window->SetInteractor(interactor);
    window->Render();

    vtkSmartPointer<vtkImageInteractionCallback> callback =
        vtkSmartPointer<vtkImageInteractionCallback>::New();
    callback->SetImageReslice(reslice);
    callback->SetInteractor(interactor);

    imageStyle->AddObserver(vtkCommand::MouseMoveEvent, callback);
    imageStyle->AddObserver(vtkCommand::LeftButtonPressEvent, callback);
    imageStyle->AddObserver(vtkCommand::LeftButtonReleaseEvent, callback);

    // Start interaction
    // The Start() method doesn't return until the window is closed by the user
    interactor->Start();

    return EXIT_SUCCESS;
}


constexpr char TestSliderWidgetMultipleViewportsLog[] = "# StreamVersion 1\n"
                                                        "EnterEvent 292 46 0 0 0 0 0\n"
                                                        "MouseMoveEvent 273 65 0 0 0 0 0\n"
                                                        "MouseMoveEvent 252 88 0 0 0 0 0\n"
                                                        "MouseMoveEvent 148 299 0 0 0 0 0\n"
                                                        "LeaveEvent 147 301 0 0 0 0 0\n"
                                                        "EnterEvent 145 299 0 0 0 0 0\n"
                                                        "MouseMoveEvent 145 299 0 0 0 0 0\n"
                                                        "MouseMoveEvent 115 190 0 0 0 0 0\n"
                                                        "LeftButtonPressEvent 115 190 0 0 0 0 0\n"
                                                        "StartInteractionEvent 115 190 0 0 0 0 0\n"
                                                        "LeftButtonReleaseEvent 115 190 0 0 0 0 0\n"
                                                        "EndInteractionEvent 115 190 0 0 0 0 0\n"
                                                        "RenderEvent 115 190 0 0 0 0 0\n"
                                                        "KeyPressEvent 115 190 0 0 114 1 r\n"
                                                        "CharEvent 115 190 0 0 114 1 r\n"
                                                        "RenderEvent 115 190 0 0 114 1 r\n"
                                                        "KeyReleaseEvent 115 190 0 0 114 1 r\n"
                                                        "MouseMoveEvent 194 163 0 0 0 0 r\n"
                                                        "MouseMoveEvent 195 163 0 0 0 0 r\n"
                                                        "LeftButtonPressEvent 195 163 0 0 0 0 r\n"
                                                        "RenderEvent 195 163 0 0 0 0 r\n"
                                                        "MouseMoveEvent 195 163 0 0 0 0 r\n"
                                                        "MouseMoveEvent 201 151 0 0 0 0 r\n"
                                                        "RenderEvent 201 151 0 0 0 0 r\n"
                                                        "LeftButtonReleaseEvent 201 151 0 0 0 0 r\n"
                                                        "RenderEvent 201 151 0 0 0 0 r\n"
                                                        "LeftButtonPressEvent 204 29 0 0 0 0 r\n"
                                                        "RenderEvent 204 29 0 0 0 0 r\n"
                                                        "RenderEvent 210 30 0 0 0 0 r\n"
                                                        "LeftButtonReleaseEvent 210 30 0 0 0 0 r\n"
                                                        "LeftButtonPressEvent 158 159 0 0 0 0 r\n"
                                                        "RenderEvent 158 159 0 0 0 0 r\n"
                                                        "LeftButtonReleaseEvent 169 138 0 0 0 0 r\n"
                                                        "RenderEvent 169 138 0 0 0 0 r\n"
                                                        "RenderEvent 169 138 0 0 0 0 r\n"
                                                        "MouseMoveEvent 251 159 0 0 0 0 r\n"
                                                        "LeftButtonPressEvent 251 159 0 0 0 0 r\n"
                                                        "StartInteractionEvent 251 159 0 0 0 0 r\n"
                                                        "TimerEvent 251 159 0 0 0 0 r\n"
                                                        "RenderEvent 251 159 0 0 0 0 r\n"
                                                        "TimerEvent 251 159 0 0 0 0 r\n"
                                                        "RenderEvent 251 159 0 0 0 0 r\n"
                                                        "TimerEvent 251 159 0 0 0 0 r\n"
                                                        "RenderEvent 251 159 0 0 0 0 r\n"
                                                        "TimerEvent 251 159 0 0 0 0 r\n"
                                                        "RenderEvent 251 159 0 0 0 0 r\n"
                                                        "LeftButtonReleaseEvent 251 159 0 0 0 0 r\n"
                                                        "EndInteractionEvent 251 159 0 0 0 0 r\n"
                                                        "RenderEvent 251 159 0 0 0 0 r\n"
                                                        "LeftButtonPressEvent 250 159 0 0 0 0 r\n"
                                                        "StartInteractionEvent 250 159 0 0 0 0 r\n"
                                                        "TimerEvent 250 159 0 0 0 0 r\n"
                                                        "RenderEvent 250 159 0 0 0 0 r\n"
                                                        "TimerEvent 250 159 0 0 0 0 r\n"
                                                        "RenderEvent 250 159 0 0 0 0 r\n"
                                                        "TimerEvent 250 159 0 0 0 0 r\n"
                                                        "RenderEvent 250 159 0 0 0 0 r\n"
                                                        "TimerEvent 250 159 0 0 0 0 r\n"
                                                        "RenderEvent 250 159 0 0 0 0 r\n"
                                                        "TimerEvent 250 159 0 0 0 0 r\n"
                                                        "RenderEvent 250 159 0 0 0 0 r\n"
                                                        "TimerEvent 250 159 0 0 0 0 r\n"
                                                        "RenderEvent 250 159 0 0 0 0 r\n"
                                                        "LeftButtonReleaseEvent 250 159 0 0 0 0 r\n"
                                                        "EndInteractionEvent 250 159 0 0 0 0 r\n"
                                                        "RenderEvent 250 159 0 0 0 0 r\n"
                                                        "LeftButtonPressEvent 250 159 0 0 0 0 r\n"
                                                        "RenderEvent 250 159 0 0 0 0 r\n"
                                                        "LeftButtonReleaseEvent 250 159 0 0 0 0 r\n"
                                                        "RenderEvent 250 159 0 0 0 0 r\n"
                                                        "LeftButtonPressEvent 209 30 0 0 0 0 r\n"
                                                        "RenderEvent 209 30 0 0 0 0 r\n"
                                                        "MouseMoveEvent 209 30 0 0 0 0 r\n"
                                                        "RenderEvent 209 30 0 0 0 0 r\n"
                                                        "MouseMoveEvent 210 30 0 0 0 0 r\n"
                                                        "RenderEvent 210 30 0 0 0 0 r\n"
                                                        "MouseMoveEvent 210 30 0 0 0 0 r\n"
                                                        "RenderEvent 210 30 0 0 0 0 r\n"
                                                        "MouseMoveEvent 211 30 0 0 0 0 r\n"
                                                        "RenderEvent 211 30 0 0 0 0 r\n"
                                                        "MouseMoveEvent 212 30 0 0 0 0 r\n"
                                                        "RenderEvent 212 30 0 0 0 0 r\n"
                                                        "MouseMoveEvent 214 30 0 0 0 0 r\n"
                                                        "RenderEvent 214 30 0 0 0 0 r\n"
                                                        "MouseMoveEvent 214 30 0 0 0 0 r\n"
                                                        "RenderEvent 214 30 0 0 0 0 r\n"
                                                        "MouseMoveEvent 215 30 0 0 0 0 r\n"
                                                        "RenderEvent 215 30 0 0 0 0 r\n"
                                                        "MouseMoveEvent 233 30 0 0 0 0 r\n"
                                                        "RenderEvent 233 30 0 0 0 0 r\n"
                                                        "LeftButtonReleaseEvent 233 30 0 0 0 0 r\n"
                                                        "MouseMoveEvent 204 30 0 0 0 0 r\n"
                                                        "LeftButtonPressEvent 204 30 0 0 0 0 r\n"
                                                        "RenderEvent 204 30 0 0 0 0 r\n"
                                                        "LeftButtonReleaseEvent 204 30 0 0 0 0 r\n"
                                                        "RenderEvent 204 30 0 0 0 0 r\n"
                                                        "RenderEvent 204 30 0 0 0 0 r\n"
                                                        "MouseMoveEvent 239 83 0 0 0 0 r\n";

// This does the actual work: updates the probe.
// Callback for the interaction
class vtkSliderMultipleViewportsCallback : public vtkCommand
{
public:
  static vtkSliderMultipleViewportsCallback* New()
  {
    return new vtkSliderMultipleViewportsCallback;
  }
  void Execute(vtkObject* caller, unsigned long, void*) override
  {
    vtkSliderWidget* sliderWidget = reinterpret_cast<vtkSliderWidget*>(caller);
    this->Glyph->SetScaleFactor(
      static_cast<vtkSliderRepresentation*>(sliderWidget->GetRepresentation())->GetValue());
  }
  vtkSliderMultipleViewportsCallback()
    : Glyph(nullptr)
  {
  }
  vtkGlyph3D* Glyph;
};

int tutorial_slider_1(int argc, char* argv[])
{
  // Create a mace out of filters.
  //
  vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
  vtkSmartPointer<vtkConeSource> cone = vtkSmartPointer<vtkConeSource>::New();
  vtkSmartPointer<vtkGlyph3D> glyph = vtkSmartPointer<vtkGlyph3D>::New();
  glyph->SetInputConnection(sphereSource->GetOutputPort());
  glyph->SetSourceConnection(cone->GetOutputPort());
  glyph->SetVectorModeToUseNormal();
  glyph->SetScaleModeToScaleByVector();
  glyph->SetScaleFactor(0.25);

  // The sphere and spikes are appended into a single polydata.
  // This just makes things simpler to manage.
  vtkSmartPointer<vtkAppendPolyData> apd = vtkSmartPointer<vtkAppendPolyData>::New();
  apd->AddInputConnection(glyph->GetOutputPort());
  apd->AddInputConnection(sphereSource->GetOutputPort());

  vtkSmartPointer<vtkPolyDataMapper> maceMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
  maceMapper->SetInputConnection(apd->GetOutputPort());

  vtkSmartPointer<vtkLODActor> maceActor = vtkSmartPointer<vtkLODActor>::New();
  maceActor->SetMapper(maceMapper);
  maceActor->VisibilityOn();
  maceActor->SetPosition(1, 1, 1);

  // Create the RenderWindow, Renderer and both Actors
  //
  vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New();
  ren1->SetViewport(0, 0, 0.5, 1.0);
  vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
  renWin->AddRenderer(ren1);
  vtkSmartPointer<vtkRenderer> ren2 = vtkSmartPointer<vtkRenderer>::New();
  ren2->SetViewport(0.5, 0, 1.0, 1.0);
  renWin->AddRenderer(ren2);

  vtkSmartPointer<vtkRenderWindowInteractor> iren =
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
  iren->SetRenderWindow(renWin);

  // VTK widgets consist of two parts: the widget part that handles event
  // processing; and the widget representation that defines how the widget
  // appears in the scene (i.e., matters pertaining to geometry).
  vtkSmartPointer<vtkSliderRepresentation2D> sliderRep =
    vtkSmartPointer<vtkSliderRepresentation2D>::New();
  sliderRep->SetValue(0.25);
  sliderRep->SetTitleText("Spike Size");
  sliderRep->GetPoint1Coordinate()->SetCoordinateSystemToNormalizedDisplay();
  sliderRep->GetPoint1Coordinate()->SetValue(0.1, 0.1);
  sliderRep->GetPoint2Coordinate()->SetCoordinateSystemToNormalizedDisplay();
  sliderRep->GetPoint2Coordinate()->SetValue(0.4, 0.1);
  sliderRep->SetSliderLength(0.02);
  sliderRep->SetSliderWidth(0.03);
  sliderRep->SetEndCapLength(0.01);
  sliderRep->SetEndCapWidth(0.03);
  sliderRep->SetTubeWidth(0.005);

  vtkSmartPointer<vtkSliderWidget> sliderWidget = vtkSmartPointer<vtkSliderWidget>::New();
  sliderWidget->SetInteractor(iren);
  sliderWidget->SetRepresentation(sliderRep);
  sliderWidget->SetCurrentRenderer(ren2);
  sliderWidget->SetAnimationModeToAnimate();

  vtkSmartPointer<vtkSliderMultipleViewportsCallback> callback =
    vtkSmartPointer<vtkSliderMultipleViewportsCallback>::New();
  callback->Glyph = glyph;
  sliderWidget->AddObserver(vtkCommand::InteractionEvent, callback);
  ren1->AddActor(maceActor);
  sliderWidget->EnabledOn();

  vtkSmartPointer<vtkSliderRepresentation3D> sliderRep3D =
    vtkSmartPointer<vtkSliderRepresentation3D>::New();
  sliderRep3D->SetValue(0.25);
  sliderRep3D->SetTitleText("Spike Size");
  sliderRep3D->GetPoint1Coordinate()->SetCoordinateSystemToWorld();
  sliderRep3D->GetPoint1Coordinate()->SetValue(0, 0, 0);
  sliderRep3D->GetPoint2Coordinate()->SetCoordinateSystemToWorld();
  sliderRep3D->GetPoint2Coordinate()->SetValue(2, 0, 0);
  sliderRep3D->SetSliderLength(0.075);
  sliderRep3D->SetSliderWidth(0.05);
  sliderRep3D->SetEndCapLength(0.05);

  vtkSmartPointer<vtkSliderWidget> sliderWidget3D = vtkSmartPointer<vtkSliderWidget>::New();
  sliderWidget3D->GetEventTranslator()->SetTranslation(
    vtkCommand::RightButtonPressEvent, vtkWidgetEvent::Select);
  sliderWidget3D->GetEventTranslator()->SetTranslation(
    vtkCommand::RightButtonReleaseEvent, vtkWidgetEvent::EndSelect);
  sliderWidget3D->SetInteractor(iren);
  sliderWidget3D->SetRepresentation(sliderRep3D);
  sliderWidget3D->SetCurrentRenderer(ren2);
  sliderWidget3D->SetAnimationModeToAnimate();
  sliderWidget3D->EnabledOn();

  sliderWidget3D->AddObserver(vtkCommand::InteractionEvent, callback);

  // Add the actors to the renderer, set the background and size
  //
  ren1->SetBackground(0.1, 0.2, 0.4);
  ren2->SetBackground(0.9, 0.4, 0.2);
  renWin->SetSize(300, 300);

  // render the image
  //
  iren->Initialize();
  renWin->Render();

  return vtkTesting::InteractorEventLoop(argc, argv, iren, TestSliderWidgetMultipleViewportsLog);
}

VTK 9.3.0+QT5.12.12项目配置简明教程 使用VTK官网例程,说明了QT项目中使用VTK9.3.0库的debug模式下的配置方法。以上就是今天要讲的内容,本文仅仅简单介绍了QT项目中的使用VTK9.3.0的项目配置方法和例程,不足之处请大家指正。 阅读详情

相关推荐

C++ VTK加载DCM医学影像:从环境配置到三维可视化完整指南

医学影像处理是计算机视觉与图形学的重要应用领域,其核心在于对DICOM格式数据的解析与可视化。DICOM作为医学影像的通用标准,包含了丰富的患者信息与多层切片数据,其三维重建与交互浏览是医学诊断与科研的基础需求。VTK(Visualization Toolkit)作为开源的科学可视化库,提供了强大的数据处理与渲染能力,能够高效实现DICOM文件的读取、三维体数据重建及交互式浏览。通过C++集成VTK,开发者可以构建独立的医学影像处理软件,实现从底层数据解析到高级可视化功能的全流程开发。本文以vtkDICOM

weixin_30423977的博客 525

VTK笔记——Widgets简介

VTK的交互器样式(vtkInteractorStyle)通常只是控制相机以及提供一些简单的键盘和鼠标事件的交互技术。交互器样式在渲染场景中并没有一种表达形式,也就是说,在交互时我们看不见交互器样式到底是什么样子的,用户在使用这些交互器样式时,必须事先知道哪些键盘和鼠标事件是控制哪些操作的。然而,渲染场景中的大部分操作都需要直接、简单。比如,如果某条线段的端点可以由用户放置的话,那么沿着某条线段改变倾斜度,就变得非常容易。

Andy的专栏 4192

VTK 交互类介绍

cpppublic:// 获取点击位置// 执行拾取操作// 处理拾取结果// 调用父类方法保持原有功能// 使用自定义交互样式。

深之JohnChen的专栏 1246

使用Vtk - Qt Creator - VS 编译简单项目

本文介绍了在Visual Studio 2022中配置VTK和Qt开发环境的方法。 1、创建Qt Widgets项目时需要选择QtOpenGL和QtOpenGLWidgets模块; 2、配置VTK包含目录和库文件的详细步骤; 3、提供最小可运行代码示例,包含头文件和cpp文件实现,展示如何通过QVTKOpenGLNativeWidget嵌入VTK渲染窗口; 4、最后给出两种渲染方式:加载STL文件或简单几何图形。 文章详细记录了

iosWorker的博客 1198

Python实现VTK - 自学笔记(4):用Widgets实现三维交互控制

本文介绍了使用VTK(Visualization Toolkit)进行三维可视化的核心交互技术。首先,通过创建圆锥体数据源、映射器和演员,构建了基本的可视化场景。接着,利用vtkRenderWindowInteractor作为交互基础,支持多种交互风格。文章重点展示了如何通过滑块控件(vtkSliderWidget)动态调整圆锥体的分辨率,以及使用包围盒控件(vtkBoxWidget)实现物体的变形操作。这些控件通过回调机制(AddObserver)与事件处理函数绑定,实现动态数据更新。

LiRongLu_的博客 533

STM32多模式智能小车状态机设计与中断优先级实践

在嵌入式实时系统中,状态机是实现多任务协同与功能切换的核心范式。其本质是通过有限状态集合、明确转移条件和确定性动作,构建可预测、易维护的控制逻辑。基于STM32等资源受限MCU时,需兼顾状态调度效率、中断并发安全与硬件资源约束。关键技术价值体现在:提升系统模块解耦度、支持物理按键与蓝牙双源触发、保障实时响应不丢帧。典型应用场景包括智能小车多模运行(循迹、避障、遥控、定距跟随等)、工业设备工作模式切换及IoT终端低功耗状态管理。本文以STM32F103C8T6平台为例,深入解析全局模式变量设计、双通道状态切换

weixin_42509888的博客 92

VTK-Widgets在医学图像交互测量中的研究

 通过多平面显示工具可以从三维CT图像数据场中获取二维的组织切片,使用vtkLineWidget对二维切片中的组织进行距离测量,该类本身不具备测量功能,但我们可以借助其内部工具来完成测量。   生 物 医 学 工 程 研 究 第29卷第1期 戴振晖,等:VTK -Widgets在医学图像交互测量中的研究   vtkLineWidget定义了一个交互放置在三维场景内的线段,当对二维切片进行距离测量时,把线段交互式的放置在需要测量的组织切片上,设线段 的两个端点分别为p1和p2,p1的坐标为(x1,y1

Yang Kun 的博客 4395

OpenWRT软件源更换保姆级教程:从国内镜像到官方源一键切换(含常见报错解决)

本文提供OpenWRT软件源更换的详细教程,涵盖从国内镜像源到官方源的切换方法,并深度解析常见报错解决方案。针对国内网络环境,指导用户如何精准定位系统信息、备份配置、选择并配置清华等国内镜像源,以及处理签名验证失败、依赖缺失、404错误等典型问题,旨在提升软件包管理效率与稳定性。

weixin_29229261的博客 1931

编译使用VTK官网的VTKExamples

除了VTK源码包里包含了一些简单的examples,VTK的官网还有一些examples,源码在github上直接搜索VTKExamples即可得到,压缩包275m,没充钱科学上网的估计不好clone下来,我这里放个度盘的链接: 链接:https://pan.baidu.com/s/1XnLMeZXKpDKWjbilpcDo0A 提取码:h4uw 把clone下来的压缩包解压,到src里找cxx的,也就是c++版本的代码,如下图所示,我们用Widgets这个工程试试,在同级目录下新建一个Wi..

TiredWind的博客 5264

从零开始掌握Python机器学习:七步教程 基础篇

前言 「开始」往往是最难的,尤其是当选择太多的时候,一个人往往很难下定决定做出选择。本教程的目的是帮助几乎没有 Python 机器学习背景的新手成长为知识渊博的实践者,而且这个过程中仅需要使用免费的材料和资源即可。 第一步:基本 Python 技能 如果我们打算利用 Python 来执行机器学习,那么对 Python 有一些基本的了解就是至关重要的。 首先,你需要安装 Python。因为我们后...

hcgx2018的博客 1612

别只当玩具!聊聊这个555金属探测器电路背后的电磁感应与RLC调谐原理

本文深入解析了555金属探测器电路的工作原理,重点探讨了电磁感应与RLC调谐原理。通过分析电感线圈的电磁特性、RLC谐振电路的行为以及555定时器的多重功能,揭示了这一看似简单的装置如何实现金属检测。文章还提供了灵敏度优化方案和常见问题解决方法,帮助读者从科学角度理解这一实用技术。

weixin_29204205的博客 476

VTK.js Widgets完全手册:打造专业级3D交互体验的核心组件

VTK.js是基于Web的可视化工具包(Visualization Toolkit for the Web),其Widget组件系统为开发者提供了构建交互式3D应用的强大工具。本文将全面介绍VTK.js Widgets的核心架构、常用组件及实战应用,帮助你快速掌握这一技术,轻松实现专业级3D交互体验。 ## 一、VTK.js Widgets架构解析:MVC模式的创新应用 VTK.js的新风格W

gitblog_00286的博客 1007

手把手入门YOLO到改进优化教程 | 【P2基础篇】数据标注+环境搭建+模型训练

本节以 YOLO自定义目标检测训练为主线,带你从零开始完成 数据标注 → 环境搭建 → 模型训练 → 结果的流程。使用labelImg制作符合YOLO格式的自定义数据集。在Windows基于 Python + Conda 创建独立虚拟环境,安装 PyTorch + CUDA + ultralytics,配置 PyCharm 运行环境。本节不仅使用自定义数据集进行演示,同时也用公开数据集训练 YOLO,查看训练日志与可视化结果(PR、P/R/F1 曲线等)等。

嵌入式阿齐Archie 2万+

第04章-VTK基础(6)

【译者:这个系列教程是以Kitware公司出版的《VTK User’s Guide -11th edition》一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容。敬请期待^_^。欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!】

东灵工作室 1万+

Vue - 在纯 HTML 普通项目中实现组件化,让原生 html 项目支持引入 *.vue 组件 / 组件与组件间的互相引用等,完美解决了引入组件出现的跨域问题(保姆级详细教程,完整示例源码及插件)

html中使用vue组件,在HTML页面中引入vue组件,HTML界面利用http-vue-loader.js以组件方式引入vue文件,使用http-vue-loader引入组件出现报错,在html页面使用http-vue-loader插件引入组件报跨域错误,如何解决http-vue-loader引用组件时出现跨域问题,纯html原生web项目引入vue后如何实现组件引入,使用http-vue-loader插件控制台报错跨域,http-vue-loader跨域怎么办官方文档,html页面如何引入.vu

🏆 前端领域优质创作者 3904

mojoPortal 路径穿越漏洞复现(CVE-2025-28367)(附脚本)

 在 mojoPortal CMS 版本 <=2.9.0.1 中发现了一个导致 ViewState 反序列化的目录遍历漏洞。通过利用此问题,未经身份验证的攻击者可以泄露 Web 根目录中的敏感文件,包括应用程序的文件。此配置文件包含用于验证和解密 ViewState 数据的文件。知道此密钥后,网络攻击者可以构建恶意 ViewState 有效负载,从而导致在底层服务器上执行远程代码。(CVE-2025-28367)

iSee857的博客 500

从VTK官网示例到可运行的Qt项目:一个完整的工作流指南(以CylinderSource为例)

本文详细介绍了如何将VTK官网示例转换为可运行的Qt项目,以CylinderSource为例,涵盖开发环境搭建、项目配置、代码转换、模块初始化、UI设计及调试优化等关键步骤,帮助开发者快速掌握VTK与Qt的集成技术。

weixin_33695082的博客 649

手把手教你学Simulink实例--使用 Simulink 进行电力电子系统的小信号模型仿真

电力电子系统(Power Electronics System)包括各种功率转换器(如 DC-DC 转换器、逆变器等)。这些设备中的关键组件(如 MOSFET、IGBT、电容器、电感器等)不仅影响系统的性能,还直接关系到系统的稳定性、效率和可靠性。因此,在设计阶段进行详细的建模和仿真至关重要。小信号模型仿真的目的是通过线性化非线性系统来评估其动态特性,包括增益、相位裕度、带宽等指标。通过本教程,我们介绍了如何使用 Simulink 进行电力电子系统的小信号模型仿真。背景介绍。

MHD0815的博客 298

QT中使用QVTKOpenGLNativeWidget显示三维图形(VTK9.x以上版本)

首先通过cmake配置所示包含文件以及链接库链接库主要文件如下E:\NativeThirdParty\VTK_9_3\lib\vtkGUISupportQt-9.3.lib E:\NativeThirdParty\VTK_9_3\lib\vtkInteractionWidgets-9.3.lib E:\NativeThirdParty\VTK_9_3\lib\vtkRenderingOpenGL2-9.3.lib E:\NativeThirdParty\VTK_9_3\lib\vtkRenderingHyp

江船野火纵余生 2014

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

VTK.js与传统VTK对比:Web端可视化的革命性突破与优势

VTK.js是Visualization Toolkit(VTK)的Web原生实现,专为浏览器环境设计的高性能可视化库。相比传统C++版VTK,它通过WebGL和WebGPU技术将科学可视化能力直接带到网页端,无需安装任何插件即可实现复杂3D模型渲染、医学影像处理等高级功能。 ## 核心架构差异:从桌面到浏览器的技术跃迁 传统VTK基于C++开发,依赖本地图形接口(如OpenGL)和操作系统资

gitblog_00654的博客 896

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

CTK框架——CTK Widgets快速入门

CTK框架——CTK Widgets快速入门 天山老妖S关注0人评论27888人阅读2018-05-25 18:40:52 CTK框架——CTK Widgets快速入门 一、CTK Widgets模块简介 1、CTK Widgets模块简介 CTK Widgets模块是CTK封装的用于通用功能以及生物医学成像专用领域的Qt组件库。 CTK中所有部分都有大量的测试相关代码,在源码目录下Libs/xxx/Testin/Cpp目录中。 CTK官方文档:http://www.commont.

Johnable的博客 2404

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

VTK 框架架构

VTK 9.5.0框架采用模块化分层架构,主要分为六层:基础层(第三方库)、核心层(数据结构)、算法层(数据处理)、渲染层(可视化)、交互层(用户交互)和应用层(示例/GUI)。模块系统通过265个vtk.module文件管理依赖关系,支持五种依赖强度声明,并实现工厂模式的自动初始化。构建系统支持模块独立编译或合并为共享库(kit),默认采用细粒度模块化方案。该设计通过声明式配置实现了灵活的组件化管理和按需链接,同时保持核心功能的可扩展性。

beibeix2015的博客 259

VTK Python 开发环境配置完整指南 详细介绍pip安装与源码编译部署VTK,解决常见依赖问题

VTK(Visualization Toolkit)是一个开源的跨平台可视化工具包,广泛应用于科学计算和工程领域。本文详细介绍了VTK的安装配置方法,包括通过pip安装预编译版本和源码编译安装两种方式。对于pip安装,提供了Windows、Linux和macOS三大平台的具体操作指南;对于源码编译,详细说明了从获取源码到编译配置的全过程。文章还包含了环境验证方法、常见问题解决方案以及基础3D可视化、数据可视化和图像处理等实用示例代码。本指南基于VTK 9.x版本编写,适用于希望快速上手VTK开发的Pytho

weixin_38644457的博客 1088

常用的VTK工具/控件(VTK Widget)

Family of VTK Widgets 3D Slider widget   2D Slider widget   Box widget   Line widget Implicit plane widget

Jane_yuhui的专栏 5653
上一篇: vtk的Reference count简析
下一篇: 中文Windows系统使用Visual Studio打开cmake生成的项目文件构建项目时窗口输出乱码的解决方案
dotphoenix
博客等级 码龄19年 208粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值