s2s s2s - 4 months ago 34
C++ Question

QT QMainWindow from subroutine

I have problems to create a QMainWindow object from a subroutine. I need this to create a different number of windows on the user's request.

The problem lies in the fact that if I create it from a subroutine, it is created as a local variable and only shows for a split second. Usually I would need to return a pointer, but I have not managed to do it with this object. Here is the code:

#include <QApplication>
#include <QMainWindow>

QMainWindow runGUI(){
QMainWindow window;
window.show();
window.resize(340,260);
return window;
}

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
/*
QMainWindow window;
window.show();
window.resize(340,260);
*/
runGUI();
return app.exec();
}


How do I do this correctly?

Answer

Returning your QMainWindow from runGUI() calls the copy constructor: Qt objects are not designed to be copied. You should indeed return a pointer, and dynamically allocate the window:

#include <QApplication>
#include <QMainWindow>

QMainWindow* runGUI(){
    QMainWindow* window = new QMainWindow;
    window->setAttribute(Qt::WA_DeleteOnClose);
    window->show();
    window->resize(340,260);
    return window;
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QMainWindow* window = runGUI();
    return app.exec();
}

Note the use of Qt::WA_DeleteOnClose to ensure the window will be deleted when it is closed, avoiding memory leaks.