Я пытаюсь нарисовать цилиндр в QVTKOpenGLWidget.Я использую Qt Creator, с версией qt 5.12.0 (msvc2017_64).QVTKOpenGLWidget продвигается из QWidget, и я использую QVTKOpenGLWidget.h в папке включения VTK.
Когда я создаю цилиндр, средство визуализации, vtkGenericOpenGLRenderWindow и т. Д. В конструкторе, как и большинство доступных примеров, ничего не происходит неправильно, цилиндр отображается в QVTKOpenGLWidget.Код подобен приведенному ниже:
mainui::mainui(QWidget *parent) : QMainWindow(parent), ui(new Ui::mainui)
{
ui->setupUi(this);
auto cylinderSource = vtkSmartPointer<vtkCylinderSource>::New();
cylinderSource->SetCenter(0, 0, 0);
cylinderSource->SetRadius(5.0);
cylinderSource->SetHeight(7.0);
cylinderSource->SetResolution(100);
auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(cylinderSource->GetOutputPort());
auto actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
auto renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
auto win = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
win->AddRenderer(renderer);
ui->display3d->SetRenderWindow(win);
}
В этом случае результат будет примерно таким:
Однако, когда я добавляю действие с функцией "срабатывает"() "в качестве сигнала, добавьте связанный с VTK код в функцию, добавьте эту функцию в качестве функции слота и соедините их, виджет QVTKOpenGLWidget не работает (полностью черный, без цилиндра).Но другие виджеты, кажется, работают хорошо.Код выглядит следующим образом:
void mainui::paint() {
ui->textEdit->append("Hello vtk!");
auto cylinderSource = vtkSmartPointer<vtkCylinderSource>::New();
cylinderSource->SetCenter(0, 0, 0);
cylinderSource->SetRadius(5.0);
cylinderSource->SetHeight(7.0);
cylinderSource->SetResolution(100);
auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(cylinderSource->GetOutputPort());
auto actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
auto renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
auto win = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
win->AddRenderer(renderer);
ui->display3d->SetRenderWindow(win);
ui->textEdit->append("textEdit respond to trigger signal");
}
Конструктор:
mainui::mainui(QWidget *parent) : QMainWindow(parent), ui(new Ui::mainui)
{
ui->setupUi(this);
}
Соединитель:
И результат выполнения: