2017-08-03 48 views
-1

我见过类似的问题,但他们似乎没有工作,以解决我的问题。pyqt通过类之间的信号

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

在这个例子中,当我按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() 
+0

最小,运行例子是更易于调试,为我们和你以及。 – Trilarion

回答

0

的问题是,你与不同的情况下工作,所以它工作,你应该更改为以下:

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 
     [...]