Skip to content

ShowEvent

Repository source: ShowEvent

Description

Small example (not doing anything actually) to show the use of the overwritten QWidget::showEvent() function to initialize the VTK widget when it is actually used, not directly in the constructor.

Question

If you have a question about this example, please use the VTK Discourse Forum

Code

ShowEvent.cxx

#include <iostream>

#include "ShowEvent.h"
#include "ui_ShowEvent.h"

ShowEvent::ShowEvent(QWidget* parent) : QWidget(parent), ui(new Ui::ShowEvent)
{
  this->ui->setupUi(this);

  // Do not do anything related to VTK display here!
  std::cout << "Constructor" << std::endl;
}

void ShowEvent::showEvent(QShowEvent*)
{
  // Instead, do the VTK display things here!
  std::cout << "VTK Stuff" << std::endl;
}

ShowEvent.h

#ifndef ShowEventQt_H
#define ShowEventQt_H

#include <QMainWindow>

/*
 * See "The Single Inheritance Approach" in this link:
 * [Using a Designer UI File in Your C++
 * Application](https://doc.qt.io/qt-5/designer-using-a-ui-file.html)
 */
namespace Ui {
class ShowEvent;
}

class ShowEvent : public QWidget //, private Ui::ShowEvent
{
  Q_OBJECT

public:
  explicit ShowEvent(QWidget* parent = nullptr);
  virtual ~ShowEvent() = default;

private:
  Ui::ShowEvent* ui;

protected:
  void showEvent(QShowEvent* event);
};

#endif

ShowEventDriver.cxx

#include <QApplication>

#include "ShowEvent.h"

int main(int argc, char* argv[])
{
  QApplication app(argc, argv);
  ShowEvent showEvent;

  showEvent.show();
  return app.exec();
}

ShowEvent.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>ShowEvent</class>
 <widget class="QWidget" name="ShowEvent">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>312</width>
    <height>243</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>ShowEvent</string>
  </property>
  <layout class="QGridLayout" name="gridLayout">
   <item row="0" column="0">
    <widget class="QGraphicsView" name="graphicsView">
     <property name="backgroundBrush">
      <brush brushstyle="NoBrush">
       <color alpha="255">
        <red>0</red>
        <green>0</green>
        <blue>0</blue>
       </color>
      </brush>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

CMakeLists.txt

cmake_minimum_required(VERSION 3.12 FATAL_ERROR)

project(ShowEvent)

find_package(VTK COMPONENTS 
)

if (NOT VTK_FOUND)
  message(FATAL_ERROR "ShowEvent: Unable to find the VTK build folder.")
endif()

# Prevent a "command line is too long" failure in Windows.
set(CMAKE_NINJA_FORCE_RESPONSE_FILE "ON" CACHE BOOL "Force Ninja to use response files.")
add_executable(ShowEvent MACOSX_BUNDLE ShowEvent.cxx )
  target_link_libraries(ShowEvent PRIVATE ${VTK_LIBRARIES}
)
# vtk_module_autoinit is needed
vtk_module_autoinit(
  TARGETS ShowEvent
  MODULES ${VTK_LIBRARIES}
)

Download and Build ShowEvent

Click here to download ShowEvent and its CMakeLists.txt file. Once the tarball ShowEvent.tar has been downloaded and extracted,

cd ShowEvent/build

If VTK is installed:

cmake ..

If VTK is not installed but compiled on your system, you will need to specify the path to your VTK build:

cmake -DVTK_DIR:PATH=/home/me/vtk_build ..

Build the project:

make

and run it:

./ShowEvent

WINDOWS USERS

Be sure to add the VTK bin directory to your path. This will resolve the VTK dll's at run time.