PyQt4 - открытие второго окна при выборе элемента меню + открытие диалога

коренная тема находится здесь

декоратор = http://fkn.ktu10.com/?q=node/2871

# -*- coding: utf-8 -*-

# в предыдущем комментарии мы сообщили среде
# разработки в какой именно кодировке
# сохранён файл - и просим открыть
# его в соответсвии с правилаами этой кодировки
import sys
from PyQt4.QtGui import *
from PyQt4 import QtGui
# следующее  - импортируется для работы со слотами
from PyQt4.QtCore import QObject, pyqtSlot


# Описываем дополнительное окно
class NewWindow(QtGui.QMainWindow):

    def __init__(self):
        super(NewWindow, self).__init__()
# запускаем метод рисующий виджеты окна


        self.initUI()


# пусть по умолчанию строка
# будет пустой
# в этой строке мы можем передать путь
# к папке полученноый из диалога выбора директории
    def initUI(self,str=""):

 # описываем действие ("действие" - это понятие из QT -см. ссылки выше листинга)
        exitAction = QtGui.QAction(QtGui.QIcon('exit.png'), '&Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Выйти изприложения')
        exitAction.triggered.connect(QtGui.qApp.quit)

        self.statusBar()
        #создаём статус бар для окна
        menubar = self.menuBar()
       # добавляем меню "Файл" на форму
        fileMenu = menubar.addMenu('&File')
      # добавляем действие ВЫХОД
      # которое становится элементов подменю
        fileMenu.addAction(exitAction)
      # задаём положение окна и его размер
        self.setGeometry(500, 500, 400, 200)
        # указываем заголовок

        if str: #если параметр передан
            edit = QtGui.QLineEdit(str,  self)
            edit.setDragEnabled(True)
            edit.move(100, 100)

        self.setWindowTitle('Дополнительное окно')
        self.show()

class NewWindow2(QtGui.QMainWindow):

    def __init__(self,str):
        super(NewWindow2, self).__init__()
# запускаем метод рисующий виджеты окна


        self.initUI(str)

# пусть по умолчанию строка
# будет пустой
# в этой строке мы можем передать путь
# к папке полученноый из диалога выбора директории
    def initUI(self,str=""):

 # описываем действие ("действие" - это понятие из QT -см. ссылки выше листинга)
        exitAction = QtGui.QAction(QtGui.QIcon('exit.png'), '&Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Выйти изприложения')
        exitAction.triggered.connect(QtGui.qApp.quit)

        self.statusBar()
        #создаём статус бар для окна
        menubar = self.menuBar()
       # добавляем меню "Файл" на форму
        fileMenu = menubar.addMenu('&File')
      # добавляем действие ВЫХОД
      # которое становится элементов подменю
        fileMenu.addAction(exitAction)
      # задаём положение окна и его размер
        self.setGeometry(500, 500, 400, 200)
        # указываем заголовок

        if str: #если параметр передан
            edit = QtGui.QLineEdit(str,  self)
            edit.setDragEnabled(True)
            edit.move(100, 100)

        self.setWindowTitle('Дополнительное окно')
        self.show()

# описание класса главного окна
class Example(QtGui.QMainWindow):

#---опишем свойство  класса на Python--------------
### это свойсто вы испоьлзуем для того,
##чтобы дополнительное окно не сразу исчезало,
##а оставалось в памяти - и ,соответсвенно,
##на экране

    def getx(self): return self.__addwin            # методы для чтения,
    def setx(self, value): self.__addwin = value    # записи
    def delx(self): del self.__addwin               # удаления свойства
    addwin = property(getx, setx, delx, "Свойство 'addwin'.")    # определение свойства
#---конец описания свойства

    def getx(self): return self.__addwin2            # методы для чтения,
    def setx(self, value): self.__addwin2 = value    # записи
    def delx(self): del self.__addwin2               # удаления свойства
    addwin2 = property(getx, setx, delx, "Свойство 'addwin2'.")    # определение свойства
#---конец описания свойства
    def __init__(self):
        super(Example, self).__init__()

        self.initUI()

    def initUI(self):

 # описываем действие ("действие" - это понятие из QT -см. ссылки выше листинга)
        exitAction = QtGui.QAction(QtGui.QIcon('exit.png'), '&Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Выйти из приложения')

#действие открытия нового окна
        newWindowAction = QtGui.QAction(QtGui.QIcon('exit.png'), '&NewWindow', self)
        newWindowAction.setShortcut('Ctrl+P')
        newWindowAction.setStatusTip('Открыть дополнительное окно')

#действие для диалога выбора директории
        FolderChooser = QtGui.QAction(QtGui.QIcon('exit.png'), '&Choose Folder', self)
        FolderChooser .setShortcut('Ctrl+D')
        FolderChooser .setStatusTip('Открыть диалог выбора диретории')


        # пример подключения слота к действию (сигналу)
        #
        exitAction.triggered.connect(QtGui.qApp.quit)
        newWindowAction.triggered.connect(self.addwindow)
        FolderChooser.triggered.connect(self.showDialog)
        self.statusBar()

        #создаём статус бар для окна
        menubar = self.menuBar()

       # добавляем меню "Файл" на форму
        fileMenu = menubar.addMenu('&File')

      # подключаем действия как элементы полменю
        fileMenu.addAction(FolderChooser)
        fileMenu.addAction(newWindowAction)
        fileMenu.addAction(exitAction)




      # задаём положение окна
        self.setGeometry(300, 300, 300, 200)

        # указываем заголовок
        self.setWindowTitle('Демонстрация главное меню')
        self.show()
# с помощью декоратора указываем, что данный метод
# является слотом
    @pyqtSlot()
    def addwindow(self):
        #""" C++: void foo() """
        self.addwin = NewWindow()


# ОПИСАНИЕ ДИАЛОГА ВЫБОРА ДИРЕКТОРИИ
    @pyqtSlot()
    def showDialog(self):
        file = QFileDialog.getExistingDirectory(self, "Select Directory",'/home')
        self.addwin2 = NewWindow2(file)



# определяем функцию main() (вход в программу)
def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

# составляем указание интерпретатору
# какую именно функцию запускать
# в случае если нас скрипт запущен непосредственно
if __name__ == '__main__':
    main()