PyQt - 继承QMainWindow以访问Gui元素

时间:2012-03-27 15:37:14

标签: python pyqt4

我使用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元素的知识继承到另一个类/子类中。

2 个答案:

答案 0 :(得分:1)

如果您要做的是让LimitsEditor能够访问MyApp使用的完全相同的表实例,那么您尝试的这种方法是不可能的。 .ui文件是您应用于类的小部件布局的描述。当您在QMainWindow类中调用setupUi()时,它会创建实例。实际的UI模块不包含对这些实例的任何引用,然后您可以在另一个文件中访问这些实例。

必须共享对MyAppLimitsEditor的实例的引用。这归结为一项设计决定。以下是一些建议(因为我不知道你的应用程序是如何组织的)

  1. 无论您在何处管理堆叠小部件,都可以将表实例的引用传递给LimitsEditor
  2. 让你的LimitsEditor不知道表格小部件,并发出信号,父对象将监听并回复表格实例
  3. 为表设置LimitsEditor eventsFilter(在父对象中)。您的LimitsEditor不会直接引用该表,而是接收它可以处理的事件。
  4. 引用您看到的异常,QMainWindow是PyQt4类,不包含您的自定义子窗口小部件。它们位于包含setupUi()调用的自定义类的实例中。然后,您需要通过self.tblLimits访问它,但同样这只适用于实际使用Ui文件的类,而不是其他随机类。

答案 1 :(得分:-1)

在PyQt中使用QtDesigner时,通常会遵循相同的模式:

  1. 创建设计器.ui文件。
  2. 创建一个类来使用它。
  3. 确保ui文件设置班级的小部件。
  4. 例如:

    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元素访问窗口小部件。