Problems with Open-Source Downloads read https://www.qt.io/blog/problem-with-open-source-downloads and https://forum.qt.io/post/638946
Signals and slots or whatever
-
@jrod2much said in Signals and slots or whatever:
I downloaded Qt using the Qt installer, but when I first tried to build the project, the default installation "Tools" was not enough at first so I experimented by downloading many different versions. As for the "Desktop" and "Qt version" kits, if I could tell you how I did it or even why, I wouldn't be on this forum with the type of questions I've been asking Lmao.
Fair enough :)
Here is the caution error message attached to the kit if it is helpful:
It looks like the auto-detector glitched and picked CDB to your debugger. CDB doesn't work with MinGW, I think.
- Select your MinGW kit (just like your screenshot) and click Clone.
- Change the Debugger to GNU GDB (if it doesn't appear, go to the Debuggers tab and add it -- it should be in the same folder as your MinGW compiler)
- Set the C compiler to MinGW 4.8 too (I don't think this is strictly needed, but it can't hurt)
- Give your kit a name, save it, then make it Default.
- Close Qt Creator.
- Go to your project folder and delete the *.pro.user file.
- Launch Qt Creator again and open your project. Make sure you use your new kit from Step #4.
-
Alright so a few things have happened. I followed all the sets but on step 2, I did not find any debugger saying exactly GNU GDB. Here is what I set the debugger to, for sake of trying anything remotely close:
Now, the program is actually just crashing which has never happened before (This is happening without any breakpoints):
Do I have to download the GNU GDB?
-
@jrod2much said in Signals and slots or whatever:
I did not find any debugger saying exactly GNU GDB. Here is what I set the debugger to, for sake of trying anything remotely close:
Yep, you've correctly picked GNU GDB.
Now, the program is actually just crashing which has never happened before (This is happening without any breakpoints):
What do you get when you run the debugger? (Don't click the Run arrow. Instead, click the button below it, which is the Run arrow plus a with the Bug icon -- see #4 at http://doc.qt.io/qtcreator/creator-quick-tour.html )
-
-
@JKSH Alright I fixed it, I had to copy a dll file to the executable file and BOOM. I finally got somewhere. @VRonin It seems like the interpreter code is the one that handles the parameter changes… What should be my next step?
-
@jrod2much said in Signals and slots or whatever:
What should be my next step?
Make the interpreter a QObject if it's not already and declare a signal identical to the one in CccModule.
Now wherever the interpreter creates the CccModuleconnect()
the 2 signals togetherThe following step is finding out how interpreter gets created (by MainWindow?) it might be tricky as it's in a secondary thread but try and have a look
-
@VRonin Alright so I found different data to connect to the textBrowser, and after many attempts and much research, I am still unable to do it. Here are update images:
I don't know the coding lingo, but I' think I found the creation of the render class object or whatever. It is in this Interpret class that is then made an object in the mainwindow
I am showing you any pieces of code that could possibly be related to what I am trying to do. Unfortunately, there are no examples, tutorials, or explanations on how to connect to a textBrowser, no matter where I search on the internet. Most tutorials about connections lazily explain elementary connections between buttons and sliders that are preformatted anyway. I would like to give it one more try before changing my direction from the possibilty of a UI that can display data values to just using printf functions and continuing my project. If you see any way you can help me, I would greatly appreciate it.
-
@jrod2much said in Signals and slots or whatever:
Most tutorials about connections lazily explain elementary connections
connect() always work the same way no matter what you're connecting to what. You can't expect tutorials for everything.
What is the problem now?
It doesn't compile?
Are your slots in "slots" section and signals in "signals" section in your classes? Are those classes derived from QObject?
-
@jsulm Yes connect() always works the same but what I mean by lazy tutorials is that many of the tutorials show how to use preformatted connect()'s. In my case, I have create every aspect of the connection. I don't know what goes in the four arguments of the connect and when I try to use the m_render for the first argument, it does not recognize.
-
@jrod2much said in Signals and slots or whatever:
preformatted connect()
What is this?
As I said: it is always the same.
connect(senderObject, signal, receiverObject, slot);
There is really nothing special.
Is Renderer derived from QObject?
Is m_renderer a pointer?
Can you please post the error message you get?
-
in the
connect(m_renderer
etc, the third argument (this
) is of typeMainWindow
, notQTextBrowser
so it can't work, you need to passm_ui->textBrowser
there.What's the full error the connect reports?
-
-
@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);
-
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
andm_ui->textBrowser
are created and connect after they are created
-
@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.
-
@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_VEMAlright 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!!!!
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) ...
-
@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_VEMI 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!