从另一个文件访问操作按钮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?
任何帮助表示赞赏...
看来你有大部分都安装好了的:你只需要正确地使用它们。
在主窗口类,通过ui_layout
到glWidget
:
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")
谢谢,这解决了问题与行动按钮,但它会抛出箭头与' DropDownActions.statusMessage(self.ui,message)'在'glWidget'的第86行中。我该如何解决这个问题? – BjkOcean
你必须在'glWidget'中的每个地方使用'self.ui',而不是'self.ui_layout'(请参阅我的答案中的修改代码)。那么你应该可以执行'DropDownActions.statusMessage(self,message)'(因为'self'现在具有'ui'属性)。 (PS:如果你发现这个答案有用,请upvote/accept)。 – ekhumoro
非常感谢,效果很好 – BjkOcean
m包含'glWidget'类的模块甚至不会导入'Ui_Program'或'UI_main_subclass',更不用说试图以任何方式使用它们。所以我不明白你为什么认为它应该起作用。 – ekhumoro
我实际上导入了 'import UI_Program' ,我无法导入'UI_main_subclass',因为'glWidget'类文件在'UI_main_subclass'中很重要。 – BjkOcean
但是'glWidget'不会继承'UI_Program',也不会创建它的一个实例。那么你为什么认为它应该有一个'ui'属性呢? – ekhumoro