Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QT QMainWindow来自子例程_C++_Qt_Qmainwindow - Fatal编程技术网

C++ QT QMainWindow来自子例程

C++ QT QMainWindow来自子例程,c++,qt,qmainwindow,C++,Qt,Qmainwindow,从子例程创建QMainWindow对象时遇到问题。我需要它来根据用户的请求创建不同数量的窗口 问题在于,如果我从一个子例程创建它,它将被创建为一个局部变量,并且只在瞬间显示。通常我需要返回一个指针,但我还没有成功地使用这个对象。代码如下: #include <QApplication> #include <QMainWindow> QMainWindow runGUI(){ QMainWindow window; window.show(); w

从子例程创建QMainWindow对象时遇到问题。我需要它来根据用户的请求创建不同数量的窗口

问题在于,如果我从一个子例程创建它,它将被创建为一个局部变量,并且只在瞬间显示。通常我需要返回一个指针,但我还没有成功地使用这个对象。代码如下:

#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();
}

如何正确执行此操作?

从runGUI返回QMainWindow调用复制构造函数:Qt对象不是为复制而设计的。您确实应该返回一个指针,并动态分配窗口:

#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();
}

请注意,使用Qt::WA_DeleteOnClose可确保窗口关闭时将被删除,从而避免内存泄漏。

从runGUI返回QMainWindow将调用复制构造函数:Qt对象不是为复制而设计的。您确实应该返回一个指针,并动态分配窗口:

#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();
}

请注意,使用Qt::WA_DeleteOnClose可确保窗口关闭时被删除,从而避免内存泄漏。

通常我需要返回指针,但我无法使用此对象执行此操作。请显示您迄今为止尝试的内容。另外,在您的主要应用程序中,您没有使用返回的runGUI,因此它在app.execAnd之前被销毁,你能详细说明一下我需要它来根据用户的请求创建不同数量的窗口吗?你需要不同数量的主窗口吗?@mvidelgauz runGUI例程没有编译它说错误:“QMainWindow::QMainWindowconst QMainWindow&”是私有的。我试着把*runGUI;带返回窗口;调用QMainWindow*window=runGUI;我还尝试更改为一个可编译的void例程,但随后窗口会在一瞬间消失。通常我需要返回指针,但我无法使用此对象。请显示您迄今为止尝试过的内容。此外,在主程序中,您没有使用runGUI的returned,因此它在app.execAnd之前被销毁,你能详细说明一下我需要它来根据用户的请求创建不同数量的窗口吗?你需要不同数量的主窗口吗?@mvidelgauz runGUI例程没有编译它说错误:“QMainWindow::QMainWindowconst QMainWindow&”是私有的。我试着把*runGUI;带返回窗口;调用QMainWindow*window=runGUI;我还尝试更改为一个void例程,该例程进行编译,但窗口会在一瞬间消失。实际上,对于这段代码,返回指针是不必要的,并且应该有一个编译器警告,说明main中未使用的变量“window”。对于这段代码,您是对的。但是在OP的用例中,返回指针是必要的,尽管这个用例并没有在它的示例中显示,在我的派生回答中,实际上对于这段代码,返回指针是不必要的,并且应该有一个编译器警告,关于main中未使用的变量“window”。对于这段代码,您是对的。但是返回指针在OP的用例中是必要的,尽管这个用例并没有在它的示例和我的派生答案中真正显示出来