来自子程序的 QT QMainWindow

Posted

技术标签:

【中文标题】来自子程序的 QT QMainWindow【英文标题】:QT QMainWindow from subroutine 【发布时间】:2016-08-06 15:20:44 【问题描述】:

我在从子例程创建 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();

我该如何正确地做到这一点?

【问题讨论】:

“通常我需要返回一个指针,但我没有设法用这个对象做到这一点”你能展示一下你到目前为止所做的尝试吗?跨度> 另外,在您的main 中,您没有使用返回的runGUI(),因此它在app.exec() 之前被销毁 你能详细说明一下“我需要这个来根据用户的请求创建不同数量的窗口”你需要不同数量的主窗口吗? @mvidelgauz runGUI() 例程无法编译(它说错误:'QMainWindow::QMainWindow(const QMainWindow&)' is private)。我尝试将*runGUI();return &amp;window; 并调用QMainWindow *window = runGUI(); 我也尝试更改为 void 例程,该例程可以编译,但随后窗口瞬间消失。 【参考方案1】:

从 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的使用,保证窗口关闭时会被删除,避免内存泄漏。

【讨论】:

实际上对于这段代码,返回指针是不必要的(并且应该有一个编译器警告关于 main 中未使用的变量“window”)。 对于这段代码,你是对的。但是在 OP 的用例中返回指针是必要的,尽管这个用例并没有真正显示在它的示例和我如此派生的答案中

以上是关于来自子程序的 QT QMainWindow的主要内容,如果未能解决你的问题,请参考以下文章

启动使用来自 QT Gui 应用程序的环境变量的控制台应用程序

来自 Qt5 中 http 客户端的 Post 方法

QtQml 应用程序的性能考虑与建议(来自小V的翻译)

来自另一个类的 Qt c++ GUI 调用

怎么用Qt的TableView来显示数据,数据有些来自MySQL的表中(多张不同的表),并且有些数据并不是从MySQL取

QT 常用类