PyQt子类化QMainWindow以访问Gui元素

2024-06-16 14:43:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用QStackedWidget在不同的视图之间切换。每个窗格基本上都是一个类,应该驻留在它自己的文件中。在

问题是我想从另一个文件访问QTableView,而不将它的引用传递到构造函数中。在

主文件:

class MyApp(QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None):
        super(MyApp, self).__init__(parent)
        self.setupUi(self)

第二个文件

^{pr2}$

我得到这个错误:

AttributeError: type object 'QMainWindow' has no attribute 'tblLimits'

如您所见,我想访问在QtDesigner中创建的名为“tblLimits”的表,但无法在第二个文件中访问它。在

有什么建议吗?在

(编辑格式)

我编辑这篇文章是为了展示我所做的工作:

总的来说,实例化类时:

self.LimitsEditor = LimitsEditor(self.ui.tblLimits)

在LimitseEditor文件中:

class LimitsEditor():
    def __init__(self, tblLimits):
        self.tblLimits = tblLimits

现在基本上我可以访问表self.ui.tlbLimits'或'自我限制编辑器' 我就是这样做的,而且效果很好。这在我看来不太合适,所以我想知道是否有一种方法可以将所有UI元素的知识继承到另一个类/子类中。在


Tags: 文件self视图编辑uiinitdefmyapp
2条回答

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

您必须共享从MyApp到{}的实例引用。这归根结底是一个设计决定。以下是一些建议(因为我不知道你的应用程序是如何组织的)

  1. 无论在何处管理堆栈小部件,都可以将表实例的引用传递给LimitsEditor
  2. 让您的LimitsEditor不知道表小部件,并发出信号,您的父对象将监听并管理表实例作为响应
  3. eventsFilter为表(在父对象中)设置LimitsEditor。您的LimitsEditor不会直接引用表,而是会接收它可以处理的事件。在

引用您看到的异常,QMainWindow是PyQt4类,不包含您的自定义子窗口小部件。它们位于自定义类的实例上,该类包含setupUi()调用。然后您将需要通过self.tblLimits来访问它,但这同样只适用于实际使用Ui文件的类,而不是其他随机类。在

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

  1. 创建designer.ui文件。在
  2. 创建一个类来使用它。在
  3. 确保ui文件设置了类的小部件。在

例如:

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

相关问题 更多 >