使用PySide将信号连接到目录树中的插槽

时间:2016-08-30 08:21:32

标签: python pyside signals-slots qt-designer

我正在尝试尽可能多地将UI组件与功能代码分开,因此我的PySide应用程序结构如下

main.py
package\
   app.py
   __init__.py
   ui\
      mainwindow.py
      __init__.py   

Main只是一个简单的启动器

if __name__ == '__main__':
    import sys
    from package import app
    sys.exit(app.run())

和app是所有功能应该驻留的地方。我从app.py

启动UI
from PySide import QtCore, QtGui

@QtCore.Slot()
def start_button_clicked():
    print "started"

def run():
    import sys
    from ui.mainwindow import Ui_MainWindow
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

现在,从用户界面我想将发出的信号连接到app.py,以避免大量功能混乱主窗口文件,但UI文件不知道app.py.我应该怎么做才能避免所有插槽都在mainwindow.py中? app.py应该很容易在UI上做东西,因为它有一个对象引用它,但我没有相反的线索。

1 个答案:

答案 0 :(得分:1)

从Qt Designer为顶级窗口小部件创建子类。使用这种方法,Qt Designer中的所有子窗口小部件都将成为子类的属性:

import sys
from PySide import QtCore, QtGui
from ui.mainwindow import Ui_MainWindow

class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.start_button.clicked.connect(self.start_button_clicked)

    def start_button_clicked(self):
        print "started"

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())