MVC模型中的PyQt5信号和插槽不工作

2024-10-01 00:29:10 发布

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

\编辑:将代码简化到最小值

我无法连接button.clicked到MVC方法中的函数。调试代码时,在一段时间内(2-5次单击)所有操作都可以正常工作,而不是对单击没有反应。当我在正常模式下运行应用程序(无调试)时,对单击没有任何反应。没有任何错误

我试着从这里学习这个例子(MVC模型):https://realpython.com/python-pyqt-gui-calculator/#creating-a-calculator-with-python-and-pyqt,这很好用。我从web上尝试了一些其他示例,也很好地工作,所以我的代码似乎有问题,而不是安装/配置问题

我现在完全不知所措,甚至不知道该问谷歌什么

代码如下:

from PyQt5 import QtCore, QtWidgets
import sys

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(807, 567)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        MainWindow.setCentralWidget(self.centralwidget)

        self.btn_rand = QtWidgets.QPushButton(self.centralwidget)
        self.btn_rand.setGeometry(QtCore.QRect(290, 170, 175, 34))
        self.btn_rand.setText("Random")


class GUIWords(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

class GUIWordsCtr:
    def __init__(self, view):
        self._view = view
        self._connectSignals()

    def _connectSignals(self):
        self._view.btn_rand.clicked.connect(self._print)

    def _print(self):
        print("rand")

app = QtWidgets.QApplication([])
view = GUIWords()
view.show()
GUIWordsCtr(view)
sys.exit(app.exec())

当我合并类GUIWords和GUIWordsCtr时,所有这些都按预期工作。显然,问题是我在将类GUIWords传递给GUIWordsCtr时出错了。但它和上面提到的calc示例完全一样

缺少任何错误都会让我发疯,并且在调试时工作,但不是在运行模式下。对我来说有点神奇:(


Tags: 代码selfviewinitdefclassprintrand
1条回答
网友
1楼 · 发布于 2024-10-01 00:29:10

试试看:

import sys
from PyQt5 import QtCore, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(807, 567)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        MainWindow.setCentralWidget(self.centralwidget)

        self.btn_rand = QtWidgets.QPushButton(self.centralwidget)
        self.btn_rand.setGeometry(QtCore.QRect(290, 170, 175, 34))
        self.btn_rand.setText("Random")


class GUIWords(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)


class GUIWordsCtr(QtCore.QObject):                     # + (QtCore.QObject)
    def __init__(self, view):
        super(GUIWordsCtr, self).__init__(view)        # +
    
        self._view = view
        self._connectSignals()

    def _connectSignals(self):
        self._view.btn_rand.clicked.connect(self._print)

    def _print(self):
        print("rand")


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    view = GUIWords()
    view.show()

    GUIWordsCtr(view)

    sys.exit(app.exec_())

enter image description here

相关问题 更多 >