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?


  • Qt Champions 2017

    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.


  • Qt Champions 2017

    @Qtstarter121
    ok, try single step and see what lines it crashes in


  • Qt Champions 2017

    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.


  • Qt Champions 2017

    @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);
    
    }
    

  • Qt Champions 2017

    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?


  • Qt Champions 2017

    @Qtstarter121
    yeah, seems so.
    so it seems to crash on ?
    cButton->setChecked(true);
    since you dont have debugger
    use qDebug

    qDebug() << "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.


  • Qt Champions 2017

    @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. facepalm

    I 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 recognized

    However 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.


  • Qt Champions 2017

    @Qtstarter121
    You are not using Creator?



  • @mrjj nope, gdb.


  • Qt Champions 2017

    @Qtstarter121
    Ok so you compile outside of Creator and not using the dgb integration ?


Log in to reply
 

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