[英]pyqt - signal error between classes
我需要主窗口中的字符串才能显示在对话框上,并且我遇到了一些问题...
这是我的代码:
class Ui_MainWindow(QtGui.QMainWindow):
drive_signal = QtCore.pyqtSignal(str)
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(459, 280)
..... #non relevant code
.....
drives = win32api.GetLogicalDriveStrings()
drives = drives.split('\000')[:-1][1:]
self.drive_combo.clear()
self.drive_combo.addItems(drives)
self.drive_signal.emit(self.drive_combo.currentText())
.....
.....
class SubDialog(QtGui.QDialog):
def setupUi(self, Dialog):
Dialog.setWindowTitle(Ui_MainWindow.drive_signal.connect())
Dialog.resize(532, 285)
.....
.....
但我得到这个错误:
AttributeError: 'PyQt4.QtCore.pyqtSignal' object has no attribute 'connect'
有什么帮助吗?
此行有两个错误:
Dialog.setWindowTitle(Ui_MainWindow.drive_signal.connect())
首先,这两个方法调用是错误的方法,其次,您试图将unbound signal
连接到插槽,这是行不通的。
为了使代码正常工作,它需要看起来像这样:
window.drive_signal.connect(dialog.setWindowTitle)
其中window
是Ui_MainWindow
的实例,而dialog
是SubDialog
的实例。
考虑到其余代码的编写方式,类的初始化方式也可能存在潜在问题。
下面的代码显示了一种使信号正常工作的方法。 在开始事件循环之前,请仔细记录事情的执行顺序:
from PyQt4 import QtGui, QtCore
class Ui_MainWindow(QtGui.QMainWindow):
drive_signal = QtCore.pyqtSignal(str)
def setupUi(self, MainWindow):
MainWindow.resize(459, 280)
MainWindow.setWindowTitle('MainWindow: Foo')
self.drive_signal.emit('Dialog: Bar')
class SubDialog(QtGui.QDialog):
def setupUi(self, Dialog):
Dialog.resize(532, 285)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Ui_MainWindow()
dialog = SubDialog()
window.drive_signal.connect(dialog.setWindowTitle)
window.setupUi(window)
dialog.setupUi(dialog)
window.show()
dialog.show()
sys.exit(app.exec_())
我会这样做,以便Ui_MainWindow发出信号:
self.emit(SIGNAL("something_happened"), self.drive_combo.currentText())
然后将其以老式的方式连接到另一个对象中:
mainWindow.something_happened.connect(self.change_windowTitle)
def change_window_title(self, text):
dialog.setWindowTitle(text)
这可能会有所帮助: http : //www.saltycrane.com/blog/2008/01/pyqt-how-to-pass-arguments-while/
嗯,著名的'has no attribute connect'
……实际上,在SubDialog
, UI_MainWindow.drive_signal
是pyqtSignal
的泛型类。 您需要使用一个实例才能将其连接到一个函数,并且该实例化必须在运行时完成(据我所知)。 PyQt
和PySide
知道如何执行此操作的方法是查看PyQt
对象的类属性。 换句话说,您不仅要在想要发出信号的地方定义信号, 还要在想要捕获信号的地方定义信号。
class SubDialog(QtGui.QDialog):
drive_signal = QtCore.pyqtSignal(str)
def setupUi(self, Dialog):
self.dialog_ui = Dialog
self.drive_signal.connect(self.on_drive_signal))
…
def on_drive_signal(self, str_):
self.dialog_ui.setWindowTitle(str_)
那应该工作。 请注意,您需要将信号连接到某物,如上图所示……
您可能也对此问题感兴趣。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.