Unsolved QPushButton set checked causes program to crash
-
I have a situation where I create a new QPushButton dynamically and then add it to an existing layout
obtained from a .ui file. It is a class private variable named cButton.I initialize my button and do some other things:
cButton = new QPushButton; cButton->setObjectName("button1"); cButton->setCheckable(true); connect(cButton, SIGNAL(clicked(bool)), this, SLOT(on_button1_clicked(bool)));
afterwards I do this:
cButton->setChecked(true); on_button1_clicked(true);
With the above two lines, my program crashes when launched. Without them it runs fine.
With just the first line where it's setting the checked state it also still crashes.
What could be the reason for this? -
I think you made infinite loop.
set breakpoint in on_button1_clicked
and see if its called over and over -
Nope no loop there. My slot isn't even called once.
-
@Qtstarter121
ok, try single step and see what lines it crashes in -
Also make sure u didnt do the classic
QPushButton *cButton = new QPushButton; // local, not class member in .h
and then later
cButton->setChecked(true); // the one from .h that is just dangling pointer -
Unfortunately I can't single step because I don't even have time to attach a debugger. My program crashes within seconds of launching. I was hoping to get maybe some possible reasons for what I could have done wrong.
-
@mrjj I actually had this beforehand where it was a local variable but it is a class pointer in my code right now.
-
@Qtstarter121
Ok, i cant guess. But i promise you it wont crash from setChecked
so its an actual code bug.Without debugger life will be really hard.
what do u do in on_button1_clicked ?
-
@mrjj Fair enough. I agree actually that setChecked shouldn't be my issue and that it's likely something else I've done. I'm not sure if it's worth mentioning, but prior to my new button initialization and slot connection, I do the following:
QMetaObject::connectSlotsByName(this);
and I see this in my output log : No matching signal for on_button1_clicked()
To answer your question, my slot currently does this:
void MyClass:on_button1_clicked(bool checked) { if (checked) cButton->setText("ENABLED"); else cButton->setText("DISABLED"); SetWidgetProperty(dynamic_cast<QWidget*>(cButton), "highlighted", checked); }
-
hi
do
SetWidgetProperty
called setChecked ?
if that triggers clicked(bool) u get infinite calls. -
@mrjj The thing is, If I do this:
cButton->setChecked(true); //on_button1_clicked(true);
I still get the same crash. Which tells me on_button1_clicked(bool) is irrelevant. Right?
-
@Qtstarter121
yeah, seems so.
so it seems to crash on ?
cButton->setChecked(true);
since you dont have debugger
use qDebugqDebug() << "before";
cButton->setChecked(true);
qDebug() << "after";to fidn WHAT makes it crash
-
Hold on I might be wrong about that. Let me try something and get back to you.
-
@Qtstarter121
You really should install debugger. :)
Its ment to find stuff like this :) -
Okay so it looks like i am having an off-day because I just found out the source of my problem.
Turns out the issue was with code in the slot ( not Qt stuff but c++ using a proprietary framework) I neglected to post which was using an uninitialized variable. facepalmI neglected to include it because I wrongly assumed the code wasn't relevant.
Sorry for wasting your time and thanks for the help.
-
@mrjj I actually do have a debugger available and installed. The problem is that the way my program is launched, i'm not sure how I can run it with gdb. if I attempt a command such as " gdb < my usual program launch command>
I get an error like this: not in executable format: File format not recognizedHowever I can attach a debugger once my process is running via gdb attach < pid > but in this case the issue was in my constructor so that would run immediately and no time to attach the debugger to catch the crash issue so print statements are my only option.
-
@Qtstarter121
You are not using Creator? -
@mrjj nope, gdb.
-
@Qtstarter121
Ok so you compile outside of Creator and not using the dgb integration ?