Signals and slots or whatever




  • Moderators

    @jrod2much You still did not answer my question: is Renderer derived from QObject? Did you include the header file containing Renderer class definition?



  • @jsulm according to the error message, I would say m_renderer is not a QObject
    incomplete type 'Renderer *' to const QObject ....



  • @jsulm said in Signals and slots or whatever:

    @jrod2much You still did not answer my question: is Renderer derived from QObject? Did you include the header file containing Renderer class definition?

    Should I do that?

    Update: I included it, now the program runs. However, It is not printing any text on the textBrowser, but atleast I am getting somewhere



  • I think you skipped this part:

    @VRonin said in Signals and slots or whatever:

    Now wherever the interpreter creates the CccModule connect() the 2 signals together



  • @VRonin So I have changed where I am trying to get the value from, it is actually from the Renderer class, not the CccModule class anymore.

    New error

    QObject::connect: Cannot connect (null)::Rvalues(QString) to QTextBrowser::setText(QString)



  • @jrod2much said in Signals and slots or whatever:

    So I have changed where I am trying to get the value from

    I see, cool

    New error

    Could you use Qt5 connection instead? errors usually are a lot more helpful:
    connect(m_interpreter->m_renderer,&Renderer::Rvalues,m_ui->textBrowser,&QTextBrowser::setText);



  • @VRonin

    0_1538488320685_0cf79aa7-0b80-425b-b65a-2d0608dd88f4-image.png

    15:51:34: Debugging starts
    (Internal error: pc 0x0 in read in psymtab, but not in symtab.)
    (Internal error: pc 0x0 in read in psymtab, but not in symtab.)

    @VRonin said in Signals and slots or whatever:

    If you remove the connect you get no such error, correct?

    UPDATE: correct



  • If you remove the connect you get no such error, correct?



  • @VRonin said in Signals and slots or whatever:

    If you remove the connect you get no such error, correct?

    correct



  • 1st try, move the connect as the very last line in the function. if that isn't enough then you have to find out where m_interpreter->m_renderer and m_ui->textBrowser are created and connect after they are created


  • Moderators

    @jrod2much said in Signals and slots or whatever:

    QObject::connect: Cannot connect (null)::Rvalues(QString) to QTextBrowser::setText(QString)

    You're using a nullptr to connect, this can't work. The sender object was not created.



  • @jsulm Is this what you are talking about:

    #include "console.h"
    #include "interpreter.h"
    #include "chirpmon.h"
    #include "dfu.h"
    #include "flash.h"
    #include "ui_mainwindow.h"
    #include "configdialog.h"
    #include "dataexport.h"
    #include "sleeper.h"
    #include "aboutdialog.h"
    #include "parameters.h"
    #include "paramfile.h"
    #include <QTextBrowser>
    #include "renderer.h"
    
    extern ChirpProc c_grabFrame;
    
    MainWindow::MainWindow(int argc, char *argv[], QWidget *parent) :
        QMainWindow(parent),
        m_ui(new Ui::MainWindow)
    {
        QCoreApplication::setOrganizationName(PIXYMON_COMPANY);
        QCoreApplication::setApplicationName(PIXYMON_TITLE);
    
        qRegisterMetaType<Device>("Device");
    
        m_ui->setupUi(this);
        setWindowTitle(PIXYMON_TITLE);
    
        m_interpreter = NULL;
        connect(m_interpreter->m_renderer,&Renderer::Rvalues,m_ui->textBrowser,&QTextBrowser::setText);
        m_flash = NULL;
        m_renderer = NULL;  //<-------------------------This?
        m_pixyConnected = false;
        m_pixyDFUConnected = false;
        m_configDialog = NULL;
        m_fwInstructions = NULL;
        m_fwMessage = NULL;
        m_versionIncompatibility = false;
        m_testCycle = false;
        m_waiting = WAIT_NONE;
    
        parseCommandline(argc, argv);
    
        m_settings = new QSettings(QSettings::NativeFormat, QSettings::UserScope, PIXYMON_COMPANY, PIXYMON_TITLE);
        m_console = new ConsoleWidget(this);
        m_video = new VideoWidget(this);
        connect(m_video, SIGNAL(mouseLoc(int,int)), this, SLOT(handleMouseLoc(int, int)));
    
        m_ui->imageLayout->addWidget(m_video);
        m_ui->imageLayout->addWidget(m_console);
    
        // hide console
        m_showConsole = m_testCycle;
        m_console->setVisible(m_testCycle);
        m_ui->actionConsole->setChecked(m_testCycle);
    
        m_ui->toolBar->addAction(m_ui->actionPlay_Pause);
    
        m_ui->actionDefault_program->setIcon(QIcon(":/icons/icons/home.png"));
        m_ui->toolBar->addAction(m_ui->actionDefault_program);
    
        m_ui->actionRaw_video->setIcon(QIcon(":/icons/icons/raw.png"));
        m_ui->toolBar->addAction(m_ui->actionRaw_video);
    
        m_ui->actionConfigure->setIcon(QIcon(":/icons/icons/config.png"));
        m_ui->toolBar->addAction(m_ui->actionConfigure);
    
        m_ui->menuProgram->setToolTipsVisible(true);
    
        m_statusLeft = new QLabel;
        m_statusRight = new QLabel;
        // give the status a little of a left margin
        m_ui->statusBar->setContentsMargins(6, 0, 0, 0);
        m_ui->statusBar->addWidget(m_statusLeft);
        m_ui->statusBar->addPermanentWidget(m_statusRight);
        updateButtons();
    
        m_parameters.add("Pixy start command", PT_STRING, "",
            "The command that is sent to Pixy upon initialization");
    
        // start looking for devices
        m_connect = new ConnectEvent(this);
        if (m_connect->getConnected()==NONE)
            error("No Pixy devices have been detected.\n");
    
        //  <---My added expermiental code ------v
        //connect(m_renderer,SIGNAL(Rvalues(QString)), m_ui->textBrowser, SLOT(setText(QString)));
       // connect(m_interpreter->m_renderer,&Renderer::Rvalues,m_ui->textBrowser,&QTextBrowser::setText);
    
    }
    


  • ok. stop a second and think.
    What are you doing here?

    m_interpreter = NULL;
    connect(m_interpreter->m_renderer
    


  • @VRonin said in Signals and slots or whatever:

    m_interpreter = NULL;
    connect(m_interpreter->m_renderer
    

    I'm not really sure what this means. This is my interpretation of the code; The application runs without my connect function or any other alteration to the code. So, I would guess it would be a bad idea to create an object where the original Programmers of this code did not. Wouldn't that affect the program? That is my uneducated opinion.


  • Moderators

    @jrod2much said in Signals and slots or whatever:

    I'm not really sure what this means.

    Let's simplify it further.

    m_interpreter = NULL;
    m_interpreter->m_renderer
    

    Line 1: You make m_interpreter a null pointer.
    Line 2: You dereference the null pointer.

    What do you think will happen when you dereference a null pointer?

    Note: This is a very important, fundamental concept in C++. If it's unclear to you, I highly recommend you spend some time learning C++ first, before you attempt to modify a complex application.



  • @JKSH Alright so I read up on the subject and I think I understand. A null pointer does not point to an address so it can't be dereferenced. I also found this video that made me feel stupid.
    https://www.youtube.com/watch?v=bLHL75H_VEM

    Alright so what is my next step. Should I eliminate the two lines of code that make m_interpreter and m_renderer NULL? or do I have to point it to a specific address value?



  • @JKSH @VRonin @jsulm @J-Hilk
    GUYS WE DID IT!!!!!!!!!!!!! ITS OUTPUTING THE VALUES!!!!
    0_1538646514714_02a43331-64d9-4717-990d-2c1101843a9f-image.png
    I searched the code for the whatever you call it when you make a new object and placed the connect function that @VRonin gave me there and BOOM

    ...
      }
                        dir = fd.directory().absolutePath();
                        m_settings->setValue("fw_dialog", QVariant(dir));
                    }
                }
                else if (m_interpreter==NULL)
                {
                    m_console->clear();
                    m_console->print("Pixy detected.\n");
    
                    m_interpreter = new Interpreter(m_console, m_video, &m_parameters, m_initScript);
    
                    connect(m_interpreter->m_renderer,&Renderer::Rvalues,m_ui->textBrowser,&QTextBrowser::setText); //Added
    
                    connect(m_interpreter, SIGNAL(error(QString)), this, SLOT(error(QString)));
                    connect(m_interpreter, SIGNAL(textOut(QString,uint)), this, SLOT(handleText(QString,uint)));
                    connect(m_interpreter, SIGNAL(runState(int,QString)), this, SLOT(handleRunState(int,QString)));
                    connect(m_interpreter, SIGNAL(finished()), this, SLOT(interpreterFinished())); // thread will send finished event when it exits
                    connect(m_interpreter, SIGNAL(connected(Device,bool)), this, SLOT(handleConnected(Device,bool)));
                    connect(m_interpreter, SIGNAL(actionScriptlet(QString,QStringList,bool)), this, SLOT(handleActionScriptlet(QString,QStringList,bool)));
                    connect(m_interpreter, SIGNAL(view(QString,uint,bool,bool)), this, SLOT(handleView(QString,uint,bool,bool)));
                    connect(m_interpreter, SIGNAL(prog(QString,QString,uint,bool)), this, SLOT(handleProg(QString,QString,uint,bool)));
                    connect(m_interpreter, SIGNAL(paramLoaded()), this, SLOT(handleLoadParams()));
                    connect(m_interpreter, SIGNAL(paramChange()), this, SLOT(handleParamChange()));
                    connect(m_interpreter, SIGNAL(version(ushort,ushort,ushort,QString,ushort,ushort,ushort)), this, SLOT(handleVersion(ushort,ushort,ushort,QString,ushort,ushort,ushort)));
                    m_interpreter->start();
                }
                m_pixyConnected = true;
            }
            catch (std::runtime_error &exception)
    ...
    

  • Moderators

    @jrod2much said in Signals and slots or whatever:

    A null pointer does not point to an address so it can't be dereferenced.

    Correct.

    I also found this video that made me feel stupid.
    https://www.youtube.com/watch?v=bLHL75H_VEM

    I think he's being a bit harsh ;-)

    Should I eliminate the two lines of code that make m_interpreter and m_renderer NULL? or do I have to point it to a specific address value?

    You must never ever use these:

    • Null pointers
    • Uninitialized pointers
    • Dangling pointers

    Remember, take some time to learn the foundations of C++. It will save you lots of pain and heartache in the future.

    @jrod2much said in Signals and slots or whatever:

    GUYS WE DID IT!!!!!!!!!!!!! ITS OUTPUTING THE VALUES!!!!

    Congratulations! Happy coding.



  • @jrod2much glad you solved your issue. In appreciation to all the people that helped you with it, please don't forget to mark your post as solved!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.