PyQt4 应用程序按钮不起作用

Posted

技术标签:

【中文标题】PyQt4 应用程序按钮不起作用【英文标题】:PyQt4 app button not working 【发布时间】:2013-02-22 12:25:37 【问题描述】:

我正在尝试使用 PyQt4 设计器在 Linux 中设置一个应用程序,但我正在努力将信号和插槽连接到它。现在我要做的就是将一个按钮clicked 信号连接到一个自定义插槽saveEnergyScheme,它只是将“能量列表”打印到终端。

我已将我的应用程序的 .ui 代码翻译成带有 pyuic4 -w sumcorr.ui > sumcorr_ui.py 的 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 的按钮时,我希望获得“能量列表”行,但没有任何反应。这可能是因为我没有将 UI 构建为小部件,而是作为主窗口吗?为什么打印不出来??

【问题讨论】:

【参考方案1】:

尝试添加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 UI 库,因此您只是引入了毫无价值的抽象级别。设计器文件已经为您提供了 ui 布局的抽象。

【讨论】:

谢谢!我已经实现了你的版本并且它有效!我没有意识到我正在创建两个窗口。看来我需要多读书..... 为什么是多余的?一个由 py​​uic4 生成,该代码不应手动编辑。 @LtWorf No. Ui_SumCorr_ui 由 pyuic 生成。 OP 使用它创建了一个 SumCorr_ui 类,它简单地由 QMainWindowUi_SumCorr_ui 继承,最后是从 SumCorr_ui 继承的 SumCorr 类。

以上是关于PyQt4 应用程序按钮不起作用的主要内容,如果未能解决你的问题,请参考以下文章

PyQt4 QTabWidget TAB CHANGE....currentChange(int) 不起作用

PyQt4 Windows - 工具栏操作不起作用。我该如何修复它们?

睡眠在pyqt4上不起作用

PyQt4 代码在 PyQt5 (QHeaderView) 上不起作用

如何关闭登录对话框并显示主窗口(PyQt4)[重复]

打开具有不同参数的多个网页。 PyQt4