【问题标题】:pyqt - signal error between classespyqt - 类之间的信号错误
【发布时间】:2012-09-03 16:20:29
【问题描述】:

我需要一个来自主窗口的字符串来显示在一个对话框上,我遇到了一些问题......

这是我的代码:

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'

有什么帮助吗?

【问题讨论】:

    标签: python pyqt pyqt4 signals-slots


    【解决方案1】:

    这一行有两个错误:

    Dialog.setWindowTitle(Ui_MainWindow.drive_signal.connect())
    

    首先,这两个方法调用的方式错误,其次,您试图将 unbound signal 连接到插槽,这是无法工作的。

    要使代码正常工作,它需要如下所示:

    window.drive_signal.connect(dialog.setWindowTitle)
    

    其中windowUi_MainWindow 的一个实例,dialogSubDialog 的一个实例。

    考虑到其余代码的编写方式,类的初始化方式也可能存在潜在问题。

    下面的代码显示了一种使信号正常工作的方法。在开始事件循环之前,请注意事情的完成顺序:

    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_())
    

    【讨论】:

      【解决方案2】:

      我会让 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/

      【讨论】:

      • 连接旧方式类似于:mainWindow.connect(self, SIGNAL("something_happened"), self.change_windowTitle)
      • 我正在发布旧方式并连接新方式......我想我还没有准备好提供解决方案。祝你好运!
      • 这就是我使用该方法得到的结果:AttributeError: type object 'Ui_MainWindow' has no attribute 'drive_signal'
      【解决方案3】:

      啊,大名鼎鼎的'has no attribute connect'……其实在SubDialog中,UI_MainWindow.drive_signal就是一个pyqtSignal,泛型类。您需要使用实例才能将其连接到函数,并且必须在运行时完成此实例化(据我所知)。 PyQtPySide 知道如何做到这一点的方法是查看 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_)
      

      应该可以。请注意,您需要将信号与某些东西连接起来,如上图所示……

      您可能还对this question 感兴趣。

      【讨论】:

      • 我这样做了(在两个类中都定义了drive_signal,将它与在信号上打印字符串的东西连接起来),但它什么也没做,它什么也不打印...... ://
      • Mmh... 因此,调试模式 (1):尝试将您的信号连接到 UI_MainWindow 中的方法并查看它是否已发出 (2) 尝试使 UI_MainWindow 成为 @ 的父级987654333@,看看是否可以在不使用无法工作的UI_MainWindow.signal方法的情况下从SubDialog访问来自UI_MainWindow的信号。
      • 它在UI_MainWindow 上确实发出了很好的信号,我试图避免使用全局变量...但我想我最终还是会使用它并检查它是否不会破坏某些东西...我从一开始就知道 pyqt 是个坏主意...下次我会使用 wxWidgets...
      • PyQt/PySide 有点挑剔但性能很好,不要失去希望。我仍然认为self.parent().drive_signal.connect(self.on_drive_signal) 值得一试(一旦您将SubDialog 的父级设置为UI_MainWindow
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2018-09-23
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多