pyqt4发出信号不起作用
pyqt4 emit signal doesn't work
我想在 actionTracar Qaction 元素上发出触发信号,但它不起作用或出现任何错误。
我做了一小段代码来解决它。但是我还是想不通。
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))
感谢任何帮助。
问题是 QAction
的 triggered
信号与您使用的信号不同,因为它需要 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()
方法,它具有相同的效果。
我想在 actionTracar Qaction 元素上发出触发信号,但它不起作用或出现任何错误。
我做了一小段代码来解决它。但是我还是想不通。
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))
感谢任何帮助。
问题是 QAction
的 triggered
信号与您使用的信号不同,因为它需要 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()
方法,它具有相同的效果。