我使用QStackedWidget并在不同视图之间切换。每个窗格基本上都是一个类,应该驻留在它自己的文件中。
问题是我想从另一个文件访问QTableView而不将它的引用传递给构造函数。
主档案:
class MyApp(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyApp, self).__init__(parent)
self.setupUi(self)
第二档
from ui_MainWindow import Ui_MainWindow
class LimitsEditor(QMainWindow):
def __init__(self, session):
QMainWindow.__init__(self)
self.tblCommonLimits_horizheader = QHeaderView(Qt.Horizontal)
self.tblCommonLimits_horizheader = QMainWindow.tblLimits.horizontalHeader()
我收到此错误:
AttributeError: type object 'QMainWindow' has no attribute 'tblLimits'
如您所见,我想访问我在QtDesigner中创建的名为“tblLimits”的表,但我无法在第二个文件中访问它。
有什么建议吗?
(编辑格式化)
我正在编辑这个以显示我正在做的工作:
主要是在实例化类时:
self.LimitsEditor = LimitsEditor(self.ui.tblLimits)
在LimitsEditor文件中:
class LimitsEditor():
def __init__(self, tblLimits):
self.tblLimits = tblLimits
现在主要是我可以以“self.ui.tlbLimits”或“self.LimitsEditor.tblLimits”的形式访问该表 这就是我一直在做的,它工作正常。它对我来说似乎不太合适,所以我想知道是否有办法将所有UI元素的知识继承到另一个类/子类中。
答案 0 :(得分:1)
如果您要做的是让LimitsEditor
能够访问MyApp使用的完全相同的表实例,那么您尝试的这种方法是不可能的。 .ui文件是您应用于类的小部件布局的描述。当您在QMainWindow类中调用setupUi()时,它会创建实例。实际的UI模块不包含对这些实例的任何引用,然后您可以在另一个文件中访问这些实例。
您必须共享对MyApp
到LimitsEditor
的实例的引用。这归结为一项设计决定。以下是一些建议(因为我不知道你的应用程序是如何组织的)
LimitsEditor
不知道表格小部件,并发出信号,父对象将监听并回复表格实例LimitsEditor
eventsFilter(在父对象中)。您的LimitsEditor不会直接引用该表,而是接收它可以处理的事件。引用您看到的异常,QMainWindow
是PyQt4类,不包含您的自定义子窗口小部件。它们位于包含setupUi()
调用的自定义类的实例中。然后,您需要通过self.tblLimits
访问它,但同样这只适用于实际使用Ui文件的类,而不是其他随机类。
答案 1 :(得分:-1)
在PyQt中使用QtDesigner时,通常会遵循相同的模式:
例如:
class MyApp(QMainWindow):
def __init__(self, parent=None):
super(MyApp, self).__init__(parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
class LimitsEditor(QMainWindow):
def __init__(self, session):
super(QMainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.tblCommonLimits_horizheader = QHeaderView(Qt.Horizontal)
self.tblCommonLimits_horizheader = self.ui.tblLimits.horizontalHeader()
确保您通过实例ui元素访问窗口小部件。