2016-02-14 66 views
0

我想在actionTracar Qaction元素上發出一個觸發信號,但它不起作用或給出任何錯誤。pyqt4發出信號不起作用

我已經做了一小段代碼來排除故障。但我仍然無法弄清楚。

Trouble.py:

# -*- coding: utf-8 -*- 
import sys 
from PyQt4.QtCore import SIGNAL 
from PyQt4.QtGui import QApplication, QMainWindow, QDoubleValidator 
from Tela import Ui_MainWindow 
class JanelaPolinomio (QMainWindow, Ui_MainWindow): 

    def __init__(self):   
     super(JanelaPolinomio, self).__init__()  
     self.setupUi(self) 
     self.actionTracar.emit(SIGNAL("triggered()")) 

    def on_actionTracar_triggered(self): 
     print "test" 

if __name__ == '__main__': 
    app = QApplication(sys.argv)  

    jan = JanelaPolinomio() 
    jan.show()   

    sys.exit(app.exec_()) 

Tela.py:

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(390, 244) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 390, 21)) 
     self.menubar.setObjectName(_fromUtf8("menubar")) 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 
     self.toolBar = QtGui.QToolBar(MainWindow) 
     self.toolBar.setObjectName(_fromUtf8("toolBar")) 
     MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar) 
     self.actionTracar = QtGui.QAction(MainWindow) 
     self.actionTracar.setObjectName(_fromUtf8("actionTracar")) 
     self.toolBar.addAction(self.actionTracar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar", None)) 
     self.actionTracar.setText(_translate("MainWindow", "tracar", None)) 
     self.actionTracar.setShortcut(_translate("MainWindow", "Ctrl+T", None)) 

任何幫助表示讚賞。

+0

'self.actionTracar.trigger()' – ekhumoro

回答

1

的問題是,一個QActiontriggered信號具有不同的簽名,你正在使用的又是什麼,因爲它需要一個bool參數,因此使用老式的信號將發出這樣一個信號的正確方法:

self.actionTracar.emit(SIGNAL("triggered(bool)"), False) 

建議在PyQt中使用新的樣式信號。如果你試圖用新的樣式信號相同,你會得到連接錯誤,指示出了什麼問題,而不是默默地失敗:

>>> jan.actionTracar.triggered.emit() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: QAction.triggered[bool] signal has 1 argument(s) but 0 provided 

PyQt5將兌現的checked=false默認參數,這樣同樣會在那裏工作,但PyQt4中沒有按」牛逼,所以你需要明確給出說法:

>>> jan.actionTracar.triggered.emit(False) 

發射信號的不同方式是簡單地調用trigger()方法上的動作,它具有相同的效果。