QMessageBox closes application
-
This post is deleted!
-
@hobbyProgrammer said in connect() keeps crashing:
Do you guys have any idea what might causes the app to crash?
Take a debugger and look at the backtrace where exactly it crashes. Since you only show the connect to showContextMenu() and not it's implementation and you say it's crashing inside showContextMenu() we can't help any further.
-
@hobbyProgrammer said in connect() keeps crashing:
It fully walks through the slot(showContextMenu)
So, your slot is crashing, not connect()? connect() just connects signals and slots.
What does your slot do (show code)?
Do you have stack trace?
-
hi
@hobbyProgrammer said in connect() keeps crashing:connect
most likely this will not solve the crash but its better to use New Signal Slot Syntax
connect(this, &MyClass::customContextMenuRequested, this, &MyClass::showContextMenu);
-
As @jsulm said, it's probably your slot that crashes. The reason for that assumption is that you don't specify a connection type and the default is a
Qt::AutoConnection
which in turn means aQt::DirectConnection
. That means your slot is called as soon as it is triggered. Perhaps something isn't quite ready at that point? Try specifyingQt:QueuedConnection
as the connection type and see if that helps.As @LeLev points out you may be better off using the new signal/slot syntax as long as there isn't any overloaded signal in place. If you keep using the old signal/slot syntax (perfectly valid) you may want to change the parameter type(s) to the pure non-qualified type in your connect statement (and only there). That is, instead of specifying const QPoint&, just specify QPoint. Also, if you have more than one parameter make sure that there's no space before or after the comma.
-
@LeLev said in connect() keeps crashing:
connect(this, &MyClass::customContextMenuRequested, this, &MyClass::showContextMenu);
I tried this, but it still doesn't come back from the showContextMenu. I inserted a qDebug() at the end of showContextMenu and that one does show up in the debugger, but the qDebug() i've put after the connect() doesn't show up in the debugger.
-
@hobbyProgrammer
There is something very odd here. If it genuinely does not execute the line after theconnect()
as you say, then (presumably) the connection would not be made so the slot would never be called and you would not seeshowContextMenu()
being called. Have a look again at your code/debug output, use a debugger breakpoint, etc.
-
@hobbyProgrammer Then please show showContextMenu code or a stack trace, else we can only guess...
The thing is: connect() does not call showContextMenu, it just connects the signal to the slot.
-
@jsulm It seems to print the qDebug() line before executing the connect(). And the app closes in the qeventloop.cpp.
while (!d->exit.loadAcquire()) processEvents(flags | WaitForMoreEvents | EventLoopExec);
I have no idea why it stops there.
-
@jsulm it also stops whenever I save a file. The saving part works perfectly, but afterwards it just closes down the app and it seems to be the same mystery as the showContextMenu.
I would like to think that it's the connect function, since they both use connect().
However I've connected about 20 actions like this and only 2 seems to close the app. I would expect them all to close down the app if it were the connect() function.
-
@hobbyProgrammer As I said: connect() does not call the slots.
Why don't you simply use debugger to see where exactly it crashes?
-
@jsulm As I said:
it closes/crashes in the qeventloop.cpp.while (!d->exit.loadAcquire()) processEvents(flags | WaitForMoreEvents | EventLoopExec);
But I have no clue how to prevent this
-
@hobbyProgrammer
@jsulm will know better than I, but I wouldn't have thoughtconnect()
would even callprocessEvents()
/the main event loop?
-
@jsulm @JonB Whenever I use the debugger I don't even get the showContexyMenu(), but when I don't open in debugger, I do get the contextMenu...
-
@hobbyProgrammer Does it crash if you do not connect the slot?
And it would be helpful if you would post the stack trace after crash.
-
@hobbyProgrammer said in connect() keeps crashing:
Whenever I use the debugger I don't even get the showContexyMenu(),
So what's the backtrace?
-
I'm not really familliar with the debugger... Does this provide the information you need?
-
@hobbyProgrammer If you post screen shots you should at least make sure the function signature on the bottom-right side are readable...
-
@jsulm
is this better?
-
@hobbyProgrammer
It would be better if we could read the full function signatures at the bottom right, instead of left-truncated! Can't you drag the column resizer so we can see the full function name? You can make columns like Condition or Ignore much smaller.
-
@hobbyProgrammer said in connect() keeps crashing:
qv.at(i)
It looks like you've created your vector on stack. What exactly does your slot do? Which vars do you access / try to access there?
If the connection fails, you would get an explicit warning / error message (which is obviously not the case)I'm sure, that it crashes because you did something wrong before or inside your slot function.
-
@Pl45m4 Hi, I've found why it closes the app (sort of).
I have a few screens before this one. After going through those screens, you'll end up at this screen.
Whenever I only open this screen, it works perfectly, but when I open the screen through a different screen, it closes after a certain action.
Those other screens are hidden whenever a new screen is shown.I still don't know why it closes.
-
@hobbyProgrammer said in connect() keeps crashing:
I've found why it closes the app (sort of).
@hobbyProgrammer said in connect() keeps crashing:
I still don't know why it closes
Hm.... :D
@hobbyProgrammer said in connect() keeps crashing:
I have a few screens before this one
What kind of screens? You mean, if you are doing something, then it works but if you do something else (different action), then it crashes?
YOU programmed it, so you must know (should know) best, WHAT you did ;-)
Anybody else can just guess, if you make vague descriptions...What does the "crash" look like? Any exception / error message or is it just terminating your process?
-
@Pl45m4 No there's a screen with a "start" button and when you press that button, the graphicsview screen shows up. When I remove that screen it works, but I need that screen/window for the end result.
The way I call a new screen is like this:
In the .h file:
#include "window.h" private: Window *win;
In the .cpp file:
this->hide(); //hides the current screen win = new Window(this); win->show();
-
@Pl45m4 Hi, the crash is not actually a crash. It's just the app that closes. It comes with an "exited with code 0"
-
Using the correct Qt terminology would help too. Sure, it's a kind of "screen" what you see in from of you but if you write
QDialog
or `Q(Main-)Window, everybody can imagine what your program procedure looks like.@hobbyProgrammer said in connect() keeps crashing:
The way I call a new screen is like this:
In the .h file:
#include "window.h"private:
Window *win;In the .cpp file:
this->hide(); //hides the current screen
win = new Window(this);
win->show();This doesn't seem to help for solving your problem ;-) It helps to understand what you are doing. Otherwise we get all the information in pieces and that makes it unnecessarily complicated...
@hobbyProgrammer said in connect() keeps crashing:
When I remove that screen it works
"Remove screen" = Remove / comment the actual code
or
"remove" = dont open that result window?@hobbyProgrammer said in connect() keeps crashing:
In the .cpp file:
this->hide(); // Check if it crashes / exits here win = new Window(this); win->show();
-
@Pl45m4 said in connect() keeps crashing:
"Remove screen" = Remove / comment the actual code
or
"remove" = dont open that result window?Don't open the window.
Whenever I call that second window in the main.cpp it works fine, but when I call the first window in the main.cpp and call the second window in the first window, it has that problem of closing the app on certain actions.
-
@Pl45m4 yes it seems to do that. Whenever I open it in the debugger, it gives a blank window with the title "mainwindow" , which is not the title the other window has. However, when I just run it (not in debugger mode) it opens the screen perfectly (apart from that it closes on some actions)
-
What Qt version do you use?
-
@Christian-Ehrlicher 5.12.3. Would upgrading it to 5.13 help?
-
So your connect does not crash - simply your mainwindow does not show up the contents again after hide/show. If so please upgrade to 5.12.5 (and update your thread title - it's completely confusing), there was a bug in the window handling code in 5.12.3 (afair fixed in 5.12.4).
-
@Christian-Ehrlicher yes that seems to be the problem when I run it in debug mode, but when I run it normally it closes the second window after certain actions.
I'm currently upgrading it to 5.12.5, so hopefully this will solve the issue.UPDATE: this did not work for the closing part, but it did resolve the thing in the debugger mode where I would just see a blank window.
-
@Christian-Ehrlicher said in connect() keeps crashing:
So your connect does not crash
@hobbyProgrammer
I don't understand this. You always saidconnect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showContextMenu(const QPoint&))); qDebug() << "it doesn't get here";
If the
connect()
does not crash, as it should not do, how come the debug message never showed up?
-
@JonB Hi, just a quick update. I think it does get there, but it prints this part before going executing the slot.
I managed to trace it down to the QEventLoop where it does something with the QMutexLocker and after that it goes to qcoreapplication.cpp where the function execCleanup is called and then it closes. I don't know much about debugging, nor do I have a lot of experience with Qt so I don't really know what this all means, but the function is executed and the line after the connect() is also printed.
-
@hobbyProgrammer said in window closes after completing certain actions.:
@JonB Hi, just a quick update. I think it does get there, but it prints this part before going executing the slot.
It's really important for those who try to help you to give accurate description of what does/does not happen. Everyone was trying to figure how your
connect()
could not complete and get to the next line....