【问题标题】:Connecting signals to slots up the directory tree with PySide使用 PySide 将信号连接到目录树上的插槽
【发布时间】:2017-01-06 10:21:47
【问题描述】:

我正在尝试尽可能多地将 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 上做一些事情,因为它有一个对象引用,但我不知道反过来。

【问题讨论】:

    标签: python pyside signals-slots qt-designer


    【解决方案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_())
    

    【讨论】:

    • 谢谢。不得不花一些时间来理解继承与传递对象引用,但现在我非常感谢你。现在我只需要弄清楚如何运行 GUI 线程,因为后台做了很多阻塞操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2011-10-21
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多