【问题标题】:QT QMainWindow from subroutine来自子程序的 QT QMainWindow
【发布时间】: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 例程,该例程可以编译,但随后窗口瞬间消失。

标签: c++ qt qmainwindow


【解决方案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 的用例中返回指针是必要的,尽管这个用例并没有真正显示在它的示例和我如此派生的答案中
猜你喜欢
  • 2018-07-13
  • 2023-04-02
  • 1970-01-01
  • 2011-08-02
  • 2013-06-06
  • 2014-10-05
  • 2017-11-24
  • 2013-10-22
  • 1970-01-01
相关资源
最近更新 更多