简体   繁体   中英

Application crashes when opening a window qt

I would like to create a program that shows a question with some answers to the user. My application uses 3 forms: Main Menu, Login Menu and Game Form, and all inherit from an abstract class called Form; I do this because it allows the use of the factory method, which it create a new window when a signal GoFw is emitted by the actual form.

The "loop" that shows the windows is the following: MainMenu -> LoginMenu -> GameForm -> MainMenu... The problem is when the game is finished (eg the count of remaining questions is zero) the GameForm emits the signal GoFw but the application crashes after the show() method (I could see a white window with no buttons before the crash). The debugger show a messagebox with this error:

The inferior stopped because it triggered an exception.

Stopped in thread 0 by: Exception at 0x723f7b93, code: 0xc0000005: read access
violation at: 0x0, flags=0x0 (first chance).

and QtCreator opens a file called: Disassembler(QHash::findNode)

This is the code of the factory method:

void FormFactory::Init(int formType)
{
    ///if formType == 1 MainMenu is showed
    if(formType == MAIN_MENU_TYPE)
    {
        //inizializza il puntatore
        actualForm = new MainMenu();
    }
    ///else if is == 2 show ProfileMenu
    else if(formType == PROFILE_MENU_TYPE)
    {
        actualForm = new LoginMenu();
    }
    ///else if == 3 show GameForm
    else if(formType == GAME_FORM_TYPE)
    {
        actualForm = new GameForm();
    }
    ///else if there is no match launch an exception
    else
        throw UnexpectedIdEx();

    connect(actualForm, SIGNAL(GoFw(int)), this, SLOT(DisplayForm(int)));
}

void FormFactory::DisplayForm(int i)
{
    Reset();
    Init(i);
    ///show the form pointed by actualform
    actualForm->show();
}

void FormFactory::Reset()
{
    disconnect(actualForm, SIGNAL(GoFw(int)), this, SLOT(DisplayForm(int)));
    ///if actualform is actually pointing to a form, delete it and set actualForm to zero
    if(actualForm!=0)
        delete actualForm;
    actualForm = 0;
}

And the code of MainMenu.cpp is

MainMenu::MainMenu()
{
    setUpGui();
}

void MainMenu::setUpGui()
{
    playButton = new QPushButton(tr("Play"));
    infoButton = new QPushButton(tr("Info"));
    quitButton = new QPushButton(tr("Exit"));

    ///connect the clicked signal to the related slot
    connect(infoButton, SIGNAL(clicked()), this, SLOT(info()));
    connect(quitButton, SIGNAL(clicked()), this, SLOT(quit()));
    connect(playButton, SIGNAL(clicked()), this, SLOT(emitSig()));

    ///create the vertical layout
    QVBoxLayout *layout = new QVBoxLayout;

    layout->addWidget(playButton);
    layout->addWidget(infoButton);
    layout->addWidget(quitButton);

    setLayout(layout);
    setWindowTitle(tr("Menu Principale"));
}

void MainMenu::emitSig()
{
    emit GoFw(2);
}

Thank you all for your help, Luca

I'd suggest rethink your solution, it seems you overcomplicated it with the factory method. Just use 3 variables for the forms, do the "new" operation once for each, and use show() / hide() methods depending on your signals.

To answer to the crash problem, one reason i see is because you do "delete" in the slot. From Qt doc:

Warning: Deleting a QObject while pending events are waiting to be delivered can cause a crash. You must not delete the QObject directly if it exists in a different thread than the one currently executing. Use deleteLater() instead, which will cause the event loop to delete the object after all pending events have been delivered to it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM