PyQt4 应用按钮无效

1 投票
1 回答
1463 浏览
提问于 2025-04-17 16:45

我正在Linux上用PyQt4设计一个应用程序,但在连接信号和槽时遇到了困难。现在我只想让一个按钮的clicked信号连接到一个自定义的槽saveEnergyScheme,这个槽的功能就是在终端打印出'energy list'。

我用pyuic4 -w sumcorr.ui > sumcorr_ui.py把我的应用程序的.ui文件转换成了一个Python类。这条命令在sumcorr_ui.py模块中创建了一个叫SumCorr_ui的类:

class SumCorr_ui(QtGui.QMainWindow, Ui_SumCorr_ui):
    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
        QtGui.QMainWindow.__init__(self, parent, f)

        self.setupUi(self)

接着,我把我的应用程序做成了一个自定义的控件,并尝试给一个按钮添加一个简单的信号-槽连接,以验证它是否有效:

from PyQt4 import QtGui, QtCore
from sumcorr_ui import SumCorr_ui

class SumCorr(SumCorr_ui):

    def __init__(self):
        SumCorr_ui.__init__(self)
        self.save_energies_button.clicked.connect(self.saveEnergyScheme)

    def saveEnergyScheme(self):
        print 'energyList'

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    mySumCorr = QtGui.QMainWindow()
    ui = SumCorr()
    ui.setupUi(mySumCorr)
    mySumCorr.show()
    sys.exit(app.exec_())

我希望在点击名为save_energies_button的按钮时能看到'energy list'这行字,但什么都没有发生。这可能是因为我没有把UI构建成一个控件,而是作为一个主窗口吗?为什么不打印出来呢??

1 个回答

2

试着加上 ui.show(),你会发现你的代码创建了两个不同的窗口,一个窗口连接了信号,另一个没有。这是因为你只显示了 mySumCorr 窗口,但你只对它调用了 setupUi,这并没有连接信号。

当你创建 SumCorr 实例时,你是在创建一个窗口并进行设置,然后,没什么理由地,你又调用了 ui.setupUi(mySumCorr),这会设置 mySumCorr 实例,但 没有 连接信号,最后你显示的是这个窗口。

我认为你的代码应该是这样的:

class SumCorr(QtGui.QMainWindow, Ui_SumCorr_ui):

    def __init__(self):
        SumCorr_ui.__init__(self)
        self.setupUi(self)

        self.save_energies_button.clicked.connect(self.saveEnergyScheme)

    def saveEnergyScheme(self):
        print 'energyList'

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    mySumCorr = SumCorr()
    mySumCorr.show()
    sys.exit(app.exec_())

注意,拥有一个 SumCorr_ui 类是没有意义的,因为 Qt 本身就是一个用户界面库,所以你只是在引入一个没用的抽象层。设计文件已经为你提供了用户界面布局的抽象。

撰写回答