从另一个文件访问操作按钮PyQt4

问题描述:

我有一个Pyqt4 pyuic生成的.py文件。在这个文件中,我有一个工具栏和一个连接到actionRotate动作的旋转图标。这是代码的一小部分;从另一个文件访问操作按钮PyQt4

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_Program(object): 
    def setupUi(self, UI_Class): 
     UI_Class.setObjectName(_fromUtf8("UI_Class")) 
       ... 
     self.toolBar = QtGui.QToolBar(UI_Class) 
     self.toolBar.setObjectName(_fromUtf8("toolBar")) 
     UI_Class.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar) 
     self.toolBar.addAction(self.actionRotate) 
     self.actionRotate = QtGui.QAction(UI_Class) 
     self.actionRotate.setCheckable(True) 
     self.actionRotate.setIcon(icon10) 
     self.actionRotate.setObjectName(_fromUtf8("actionRotate")) 

所以,如果我尝试它是否被选中或不从它的工作原理是在底部例如另一个类到达actionRotate按钮;

import PyQt4 
import sys 
from PyQt4.QtGui import * 
from PyQt4 import QtGui, QtCore 
from PyQt4 import QtGui 
from DropDownActions import * 
import pickle 
import OpenGLcode 
from OpenGL.GL import * 
import PYQT_PROGRAM 
import numpy as np 
import sqlite3 as sq 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    from OpenGL import GL 
except ImportError: 
    app = QtGui.QApplication(sys.argv) 
    QtGui.QMessageBox.critical(None, "OpenGL hellogl", 
      "PyOpenGL must be installed to run this example.") 
    sys.exit(1) 

class UI_main_subclass(QMainWindow): 

    def __init__(self, ui_layout): 

     QMainWindow.__init__(self) 
     self.ui = ui_layout 
     ui_layout.setupUi(self) 
     .... 
     var1 = ui_layout.actionRotate.isChecked() 

但是当我尝试从我的OpenGL代码到达动作时,我无法做到这一点。以下代码显示相关部分;

from OpenGL.GL import * 
from PyQt4.QtOpenGL import * 
from PyQt4 import QtCore 

class glWidget(QGLWidget, QMainWindow): 
    resized = QtCore.pyqtSignal() 

    xRotationChanged = QtCore.pyqtSignal(int) 
    yRotationChanged = QtCore.pyqtSignal(int) 
    zRotationChanged = QtCore.pyqtSignal(int) 

    def __init__(self, ui_layout, parent = None): 
     super(glWidget,self).__init__(parent) 

    def mousePressEvent(self, event): 
     if self.ui.actionRotate.isChecked(self): # this code gives error below 
      print("test 1") 
      x, y = event.x(), event.y() 
      w, h = self.width(), self.height() 
      # required to call this to force PyQt to read from the correct, updated buffer 
      glReadBuffer(GL_FRONT) 
      data = self.grabFrameBuffer() # builtin function that calls glReadPixels internally 
      rgba = QColor(data.pixel(x, y)).getRgb() # gets the appropriate pixel data as an RGBA tuple 
      message = "You selected pixel ({0}, {1}) with an RGBA value of {2}.".format(x, y, rgba) 

      self.lastPos = event.pos() 

     else: 
      pass 

错误是;

AttributeError: 'glWidget' object has no attribute 'ui' 

我不知道为什么这不允许我达到主要的.py文件中生成的动作按钮,从pyuic?

任何帮助表示赞赏...

+0

m包含'glWidget'类的模块甚至不会导入'Ui_Program'或'UI_main_subclass',更不用说试图以任何方式使用它们。所以我不明白你为什么认为它应该起作用。 – ekhumoro

+0

我实际上导入了 'import UI_Program' ,我无法导入'UI_main_subclass',因为'glWidget'类文件在'UI_main_subclass'中很重要。 – BjkOcean

+0

但是'glWidget'不会继承'UI_Program',也不会创建它的一个实例。那么你为什么认为它应该有一个'ui'属性呢? – ekhumoro

看来你有大部分都安装好了的:你只需要正确地使用它们。

在主窗口类,通过ui_layoutglWidget

class SABRE2_main_subclass(QMainWindow):  
    def __init__(self, ui_layout): 
     QMainWindow.__init__(self) 
     self.ui = ui_layout 
     ... 
     self.OpenGLwidget = OpenGLcode.glWidget(ui_layout) 

参考然后保持到它里面的glWidget

class glWidget(QGLWidget, QMainWindow):  
    def __init__(self, ui_layout, parent = None): 
     super(glWidget,self).__init__(parent) 
     self.ui = ui_layout 

现在glWidget可以访问的ui_layout属性:

def mousePressEvent(self, event): 
     if self.ui.actionRotate.isChecked(): 
      print("test 1") 
+0

谢谢,这解决了问题与行动按钮,但它会抛出箭头与' DropDownActions.statusMessage(self.ui,message)'在'glWidget'的第86行中。我该如何解决这个问题? – BjkOcean

+0

你必须在'glWidget'中的每个地方使用'self.ui',而不是'self.ui_layout'(请参阅我的答案中的修改代码)。那么你应该可以执行'DropDownActions.statusMessage(self,message)'(因为'self'现在具有'ui'属性)。 (PS:如果你发现这个答案有用,请upvote/accept)。 – ekhumoro

+0

非常感谢,效果很好 – BjkOcean