【问题标题】:QMainWindow opens from main() function, but not from any other functionQMainWindow 从 main() 函数打开,但不能从任何其他函数打开
【发布时间】:2012-07-13 06:26:08
【问题描述】:

我的 Qt 应用程序有一个奇怪的问题。我有一个QMainWindow,方便的是MainWindow

以下代码适用于 main() 函数:

int main(int argc, char *argv[])

{
    ..
    MainWindow mainWindow;
    mainWindow.show();
    ..
}

但是,以下根本不显示 MainWindow:

int main(int argc, char *argv[])
{
    AnotherClass::staticFunction();
}


class AnotherClass: public QObject {
Q_OBJECT
public:
    static void staticFunction();
}

void AnotherClass::staticFunction() {
    MainWindow mainWindow;
    mainWindow.show();
    return ;
}

【问题讨论】:

  • 我认为你需要运行 QCoreApplication::exec();
  • 虽然staticFunction 本身是静态的,但其中的mainWindow 变量不是,所以一旦你从函数返回,变量就会超出范围。
  • 谢谢大家,我已经想通了! :)

标签: c++ qt qmainwindow


【解决方案1】:

哦,我的错!这是因为 main 永远不会返回并进入 exec 循环。但是,由于我的函数立即返回,因此窗口被破坏了。将MainWindow mainWindow; 更改为MainWindow* mainWindow = new MainWindow(); 解决了我的问题:

【讨论】:

  • 不...我正在重写 closeEvent 方法,并销毁其中的窗口。
  • 好的,你应该提一下。顺便说一句,你可以设置 WA_DeleteOnClose 属性来处理这个问题。
【解决方案2】:

在这段代码中

void AnotherClass::staticFunction() {
    MainWindow mainWindow;
    mainWindow.show();
    return ;
}

实例mainWindow在关闭}后会超出范围,然后销毁。您必须使用new 在堆上分配它,才能让它比staticFunction() 活得更久。

void AnotherClass::staticFunction() {
    MainWindow * mainWindow = new MainWindow;
    mainWindow->show();
    return ;
}

您还需要以某种方式跟踪指针并在以后使用deleted(可能使用智能指针)。

当然,您必须有一个 QApplication 并在其上调用 exec() 才能启动主事件循环。

【讨论】:

  • 我不认为这是一个非常优雅的解决方案。您正在创建内存泄漏。
  • @MrLister 这就是为什么我说他需要跟踪指针并稍后删除它的原因。我同意它不是那么优雅,我会将mainWindow 作为main() 中的局部变量,或者作为QApplication 子类中的成员变量(如果它是一个复杂的应用程序,我可以有不同的主窗口)。跨度>
  • 我正在重写closeEvent 方法,并销毁其中的窗口。
  • @TarandeepGill 如果您只在程序退出之前删除资源没有意义时才这样做(您只会减慢退出速度)。可以“泄漏”某些单应用程序实例,例如主窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多