【问题标题】:Python separate Qt ui from signalsPython将Qt ui与信号分开
【发布时间】:2018-10-29 22:38:24
【问题描述】:

我想开始使用 Qt Designer 和 Python3 构建 UI 应用程序。我成功地设计了一个带有按钮的非常基本的窗口,并通过调用 PyQt5.uic.pyuic 将 .ui 文件转换为 .py 文件。

在工作流程中,设计(.ui 文件)可能会经常更改。 .py 输出文件相应地指出: '警告!对此文件所做的所有更改都将丢失!'

很好。所以我决定将带有 GUI 定义的 .py 文件导入另一个 python 文件并开始在那里添加功能(信号和插槽)。因此,GUI 定义和功能将完全分开。

但现在我已经陷入困境,因为显然不能简单地在 GUI 的类定义之外定义新的信号/插槽连接。

我确实附上了我对 GUI 和功能的尝试(单击 -> 退出程序),希望有人能给我一个提示。我对该主题的搜索揭示了一些更高级的多线程相关问题,但太复杂了。这必须简单得多?!

非常感谢!

----> GUI 定义 (UI_simple.py)

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(30, 20, 111, 23))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Click to close!"))

----> (不工作的)功能

import UI_simple
from PyQt5 import QtWidgets, QtCore
import sys


app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = UI_simple.Ui_MainWindow()
ui.setupUi(MainWindow)

# This does NOT work...
# QtCore.QObject.connect(ui.pushButton, QtCore.SIGNAL("clicked()"),
#                        app, QtCore.SLOT("quit()"))

MainWindow.show()
sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    不要使用旧的连接语法,如果您正在学习使用它的教程,我建议您寻找另一个,另一方面PyQt 建议创建一个从小部件继承的类并使用 Qt 提供的类设计师来填补它:

    import UI_simple
    from PyQt5 import QtWidgets, QtCore
    import sys
    
    
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
            self.ui = UI_simple.Ui_MainWindow()
            self.ui.setupUi(self)
            self.ui.pushButton.clicked.connect(QtWidgets.QApplication.quit)
    
    if __name__ == '__main__':
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        w = MainWindow()
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • eyllanesc,非常感谢!只是为了澄清:这是推荐的连接语法'self.ui.pushButton.clicked.connect(QtWidgets.QApplication.quit)'?!
    • @Fab 是的,阅读pyqt.sourceforge.net/Docs/PyQt5/signals_slots.html ,另一方面,如果我的回答对您有帮助,请不要忘记将其标记为正确,如果您不知道该怎么做,请查看@ 987654323@,这是感谢SO的最好方式。
    • 对我来说'self.ui.pushButton.clicked.connect(QtWidgets.QApplication.quit)'不会关闭窗口(也许它只是退出循环)'self.ui.pushButton.clicked.connect (self.close)' 效果更好
    猜你喜欢
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 2015-04-15
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多