QVTKOpenGLWidget не отвечает на сигнал, в то время как другие виджеты в том же .ui реагируют на него - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь нарисовать цилиндр в 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);
}

В этом случае результат будет примерно таким: enter image description here

Однако, когда я добавляю действие с функцией "срабатывает"() "в качестве сигнала, добавьте связанный с 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);
}

Соединитель: enter image description here

И результат выполнения: enter image description here

1 Ответ

0 голосов
/ 25 апреля 2019

Я заметил, что ваш цилиндр нарисован, когда вы взаимодействуете с QVTKOpenGLWidget (после срабатывания action_open вы перемещаете 3D-дисплей и появляется цилиндр).Это связано с тем, что QVTKOpenGLWidget не обновляется при создании средств визуализации, окон и т. Д.Поэтому вам нужно добавить ui->display3d->update(); перед выходом из функции void mainui::paint(), чтобы принудительно обновить виджет display3d:

void mainui::paint()
{
  ui->textEdit->append("Nope");

  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->display3d->update();//This is the new line
}

Вам не нужно вручную вызывать QWidget::update()вручную, когда вы создаете свой цилиндр в конструкторе, потому что виджет рисуется после конструктора.

Здесь вы можете увидеть, как он работает:

enter image description here

Примечание : Я узнал об этом в руководстве по pcl: Создайте визуализатор PCL в Qt с помощью cmake .

...