2015-11-25 4 views
0

У меня есть модуль Python с двумя классами, MainWindow (который наследуется от QMainWindow) и MyView (который наследуется от QGraphicsView). В MainWindow у меня есть MyView, который должен установить некоторые переменные в классе MainWindow. Итак, я решил, что просто поставлю ссылку на мой объект MainWindow в глобальную переменную и позволю MyView обращаться к ней так. Вот код:Класс Python глобальный не установлен

class MyView(QtGui.QGraphicsView): 
    def __init__(self, parent = None): 
     super(MyView, self).__init__(parent) 

    def mousePressEvent(self, event): 
     super(MyView, self).mousePressEvent(event) 
     print "Mouse Pointer is currently hovering at: ", event.pos() 
     global myapp 
     print "myapp value is: ", myapp 


myapp = None 
if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    myapp = MainWindow() 
    print "myapp assigned, value is: ", myapp 
    myapp.show() 
    sys.exit(app.exec_()) 

После нажатия на MyView вывод программы заключается в следующем:

$ ./main.py 
Gtk-Message: Failed to load module "canberra-gtk-module" 
myapp assigned, value is: <__main__.MainWindow object at 0x7fc29e1ed640> 
Mouse Pointer is currently hovering at: PyQt4.QtCore.QPoint(172, 132) 
myapp value is: None 

Почему это? Я не устанавливаю «myapp» в другое значение, в опубликованном коде все это происходит.

+0

у вас есть '' parent' в MyView' для доступа 'MainWindow' – furas

+0

Пример код очень вводит в заблуждение, так как он не выводит указанный результат. Я бы предположил, что настоящая причина, по которой ваш код не работает, заключается в том, что вы пытаетесь импортировать из основного сценария. – ekhumoro

ответ

1

С PyQt, вы можете также использовать метод parent().

Если определить MyView с родителем MainWindow:

# either in __main__ 
myapp = MainWindow() 
myview= MyView(myapp) 

# or in the class MainWindow 
self.myView=MyView(self) 

Затем myview.parent() позволяет получить доступ к myapp

>>> print(myView.parent()) 
<__main__.MainWindow object at 0x7f02869b2678> 
+0

К счастью для меня, Qt Designer создает экземпляр объекта, и он делает правильную вещь в моем случае. Доступ через родителя() работал отлично, спасибо. – cronotk

1

Вы не комментируете ключевое слово global. Взгляните на this post, чтобы увидеть хорошее объяснение ключевого слова global.

В этом случае вам просто нужно, чтобы получить доступ к глобальной myapp, созданный в основном модуле, например, так:

globals()['myapp'] 
+0

"globals() ['myapp']" также возвращает "None" внутри класса MyView. – cronotk