【问题标题】:pyqt passing signals between classespyqt 在类之间传递信号
【发布时间】:2017-08-03 11:19:23
【问题描述】:

我见过类似的问题,但似乎没有一个可以解决我的问题。

基本上,我的意图很简单。我尝试将信号从我的settingsWindow 类传递给centerWindow。因此,我创建了一个名为brigde 的Qbject 来传递信号。

在这个例子中,当我按下settingsWindow 中的确定按钮时,我想得到一个打印“触发”。但是,什么都没有发生。

我不确定我是否正确定义了所有类。所有的继承都正确吗?

import sys

from PyQt5.QtCore import QFileInfo, QSettings, QCoreApplication, QSize, QRect, Qt, QObject, pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import (qApp, QApplication, QMainWindow, QFormLayout, QPushButton, QTabWidget,QDialog, QWidget, QAction, QVBoxLayout, QHBoxLayout, QSpacerItem, QSizePolicy)


class mainWindow(QMainWindow):

    def __init__(self, parent=None):
        super(mainWindow, self).__init__(parent)
        self.initUI()


    def initUI(self):
        exitAction = QAction('Exit', self)
        exitAction.triggered.connect(qApp.quit)     

        gSettingAction = QAction('Settings', self)
        gSettingAction.triggered.connect(settingsWindow)

        self.toolbar = self.addToolBar('Exit')
        self.toolbar.setMovable(False)
        self.toolbar.addAction(exitAction)
        self.toolbar.addAction(gSettingAction)

        self.center_window = centerWindow(self)
        self.setCentralWidget(self.center_window)



class centerWindow(QWidget):
    def __init__(self, parent):
        super(centerWindow, self).__init__(parent)

        self.initUI()

        wb = bridge()
        wb.valueUpdated.connect(self.fire)


    def initUI(self):
        lytLWin = QVBoxLayout()
        self.hbox1 = QHBoxLayout()
        self.hbox1.addLayout(lytLWin)
        self.setLayout(self.hbox1)


    def fire(self):
        print 'fire'




class settingsWindow(QDialog):

    def __init__(self):
        QDialog.__init__(self)

        self.tab_widget = QTabWidget()
        self.win_vbox = QVBoxLayout(self)
        self.win_vbox.addWidget(self.tab_widget)

        self.tab1 = QWidget()
        self.tab_widget.addTab(self.tab1, "Tab_1") 
        t1 = self.tab1_UI()
        self.tab1.setLayout(t1)

        self.win_vbox.addLayout(self.btnbar())
        self.setLayout(self.win_vbox)

        self.wb = bridge()

        self.exec_()



    def tab1_UI(self):
        lytSettings = QFormLayout()

        vbox = QVBoxLayout()
        vbox.addLayout(lytSettings)

        return vbox


    def btnbar(self):
        ok_set_PB = QPushButton('OK')
        ok_set_PB.setObjectName("ok_set_PB_IH")
        ok_set_PB.clicked.connect(self.ok_settings)     
        cancel_set_PB = QPushButton('Cancel')
        cancel_set_PB.setObjectName("cancel_set_PB_IH")

        btn_hbox = QHBoxLayout()
        btn_hbox.addStretch()
        btn_hbox.addWidget(ok_set_PB)
        btn_hbox.addWidget(cancel_set_PB)
        spacerItem = QSpacerItem(2, 2, QSizePolicy.Minimum, QSizePolicy.Minimum)
        btn_hbox.addItem(spacerItem)

        return btn_hbox


    def ok_settings(self):
        self.wb.sendSignal()




class bridge(QObject):
    valueUpdated = pyqtSignal()

    def __init__(self):
        QObject.__init__(self)


    def sendSignal(self):
        self.valueUpdated.emit()



def main():
    app = QApplication(sys.argv)
    ex = mainWindow()
    ex.setGeometry(100,100,1000,600)
    ex.show()
    sys.exit(app.exec_())



if __name__ == "__main__":
    main()

【问题讨论】:

  • 最小的运行示例更容易调试,对我们和您来说也是如此。

标签: python pyqt pyqt5 python-2.x


【解决方案1】:

问题是您正在使用不同的实例,因此您应该更改为以下内容:

class mainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(mainWindow, self).__init__(parent)
        self.wb = bridge()
        self.initUI()
    def initUI(self):
        [...]
        gSettingAction.triggered.connect(lambda: settingsWindow(self.wb))
        [...]
        self.center_window = centerWindow(self.wb, self)
        [...]

class centerWindow(QWidget):
    def __init__(self, bridge, parent=None):
        super(centerWindow, self).__init__(parent)
        self.initUI()
        wb = bridge
        wb.valueUpdated.connect(self.fire)
        [...]

class settingsWindow(QDialog):
    def __init__(self, bridge, parent=None):
        QDialog.__init__(self)
        [...]
        self.wb = bridge
        [...]

【讨论】:

    猜你喜欢
    • 2016-05-16
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 2013-06-27
    相关资源
    最近更新 更多