Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Signal and slot connection from a thread!?



  • Hi all,

    I am programming a GUI using pyqt4. I created a thread with an infinite loop inside which there are some signals which would be emitted if certain conditions are fulfilled. I am trying to connect these signals with button handles in the main class. The idea if like this:

    @
    class WorkingThread(QtCore.QThread):

    def __init__(self):
        QtCore.QThread.__init__(self)
    
    
    def run(self):
         # here is a loop inside which the signals are transmitted
            while true
            {
               if a:
                   self.emit(QtCore.SIGNAL("button_left(QString)"))
               elif b:
                    self.emit(QtCore.SIGNAL("button_left(QString)"))
             }
    

    class Mainclass(Qt.QWidget)

    def init(self)
    #other functions
    self.workThread = WorkingThread()
    self.connect( self.workThread, QtCore.SIGNAL("button_right(QString)"), self.handle_a2_right)
    self.connect(self.workThread,QtCore.SIGNAL("button_left(QString)"), self.handle_a2_left)
    self.workThread.start()

    def handle_a2_right
    #functions here

    def handle_a2_left
    #functions here
    @

    When the program reach the connection line in the main class it gives this error:

    File "/usr/lib/python2.7/dist-packages/gnuradio/gr/top_block.py", line 151, in _coerce_endpoint
    raise ValueError("unable to coerce endpoint")
    ValueError: unable to coerce endpoint

    Any suggestions would be appreciated!

    Regards

    [edit: added missing coding tags @ SGaist]


  • Lifetime Qt Champion

    Hi and welcome to devnet,

    You have two design issues here.
    First: button_left(QString) and button_left(QString) are not members of WorkingThread.

    Second: emitting signals from the run function reimplementation doesn't behave like you might think it does. Please take a look at QThread's latest documentation to see how it should be done.

    Hope it helps


Log in to reply