title: How to properly design a multi-window application in Qt (PyQt)?
body: <p>The most obvious approach for me is to declare each window (window, dialog or widget) in the constructor and call the show() method when needed. Something like this:</p>
  
  <pre><code>class MultiWindowApp():
      def __init__(self):
          self.window_1 = self.init_window_1()
          self.window_2 = self.init_window_2()
  
      def init_window_1(self):
          gui = uic.loadUi(...)
          # other settings
          return gui
  
      def init_window_2(self):
          gui = uic.loadUi(...)
          # other settings
          return gui
  
      def show_window_1(self):
          self.window_1.show()
  
      def show_window_2(self):
          self.window_2.show()
  </code></pre>
  
  <p>Nevertheless, it does not seem to be memory efficient, because I store the windows in the memory all the time, even when I am not showing it.</p>
  
  <p>Alternative solution that comes to my mind is to create a separate class for each window (or other widget) and have one placeholder for all in the main class. Assign an instance of the respective class and delete on closing the window. A minimal example below:</p>
  
  <pre><code>class Window_1(QWidget):
      def __init__(self):
          QWidget.__init__(self)
          uic.loadUi(...)
          # other settings
          self.show()
  
  class Window_2(QWidget):
      def __init__(self):
          QWidget.__init__(self)
          uic.loadUi(...)
          # other settings
          self.show()
  
  
  class MultiWindowApp():
      def __init__(self):
          self.widget_placeholder = None
  
      def show_window_1(self):
          self.widget_placeholder = Window_1()
  
      def show_window_2(self):
          self.widget_placeholder = Window_1()
  </code></pre>
  
  <p>This would be a bit slower, but I would avoid keeping in memory unnecessary stuff. Nevertheless, I still have a feeling that there is a better way. What is the proper way of designing such an application?</p>
  
  <p>I didn't run the examples above, so there can be some errors, but I think that the concepts behind them are clear. </p>