1

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

我已经将我的应用程序的 .ui 代码翻译成带有 .ui 的 python 类pyuic4 -w sumcorr.ui > sumcorr_ui.py。这在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 构建为小部件,而是作为主窗口吗?为什么打印不出来??

4

1 回答 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 它是一个 UI 库,所以您只是引入了一个毫无价值的抽象级别。设计器文件已经为您提供了对 ui 布局的抽象。

于 2013-02-22T12:44:35.577 回答