从深度嵌套的小部件访问PySide PyQt MainWindow或Central Widget

dav*_*ave 1 python qt pyqt pyside

呼吁PyQt专家学习一些最佳实践.

我有一些应用程序通用属性,我在QApplication中定义为属性.在我的MainWindow初始化中,我为MainWindow分配了一个"app"属性.我想在深层嵌套的小部件中访问应用程序的变量.现在,我可以通过调用足够的"parent()"调用来达到MainWindow的水平.

这看起来像kludgey,我的猜测是在这种情况下还有另一种解决方案是最佳实践.以下是一些代码片段,以便更好地理解该问题.

应用类

class App(QtGui.QApplication):

    def __init__(self, sim, *args, **kwargs):
        super(App, self).__init__(*args, **kwargs)
        self.sim = sim
        window = MW.BaseUI(digi_thread, app=self)
Run Code Online (Sandbox Code Playgroud)

主窗口类

class BaseUI(QtGui.QMainWindow):
    def __init__(self, digi_thread, app, parent=None):
        super(BaseUI, self).__init__(parent)
        self.app = app
Run Code Online (Sandbox Code Playgroud)

从嵌套小部件(tabbook中的选项卡)到达主窗口的一些代码示例

@property
def main_window(self):
    return self.parent().parent().parent().parent()

def some_function(self):
    if self.main_window.app.sim:
        print "in simulation mode"
Run Code Online (Sandbox Code Playgroud)

我也不确定centralWidget是否与解决此类问题有关.

Rei*_*ica 8

您始终可以通过以下方式访问当前应用程序实例PySide.QtCore.QCoreApplication.instance().在C++中,全局qApp变量提供相同的功能.

因此,无论是在全局应用程序实例上设置python属性还是Qt属性,您都可以随时访问它而无需经历任何层次结构.