C++ QMainWindow从main()函数打开,但不从任何其他函数打开
我的Qt应用程序有一个奇怪的问题。我有一个C++ QMainWindow从main()函数打开,但不从任何其他函数打开,c++,qt,qmainwindow,C++,Qt,Qmainwindow,我的Qt应用程序有一个奇怪的问题。我有一个QMainWindow,方便地MainWindow 以下代码通过main()函数工作: int main(int argc, char *argv[]) { .. MainWindow mainWindow; mainWindow.show(); .. } 但是,对于以下内容,根本不显示主窗口: int main(int argc, char *argv[]) { AnotherClass::staticFun
QMainWindow
,方便地MainWindow
以下代码通过main()
函数工作:
int main(int argc, char *argv[])
{
..
MainWindow mainWindow;
mainWindow.show();
..
}
但是,对于以下内容,根本不显示主窗口:
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 ;
}
哦,糟糕!这是因为main永远不会返回并进入exec循环。然而,由于我的函数立即返回,窗口被破坏了。更改
main窗口main窗口代码>到MainWindow*MainWindow=newmainWindow()代码>解决了我的问题:在此代码中
void AnotherClass::staticFunction() {
MainWindow mainWindow;
mainWindow.show();
return ;
}
实例main窗口
将在关闭}
后超出范围,然后被销毁。您必须使用new
在堆上分配它,以使其比staticFunction()更长寿
您还需要以某种方式跟踪指针,然后让它delete
d(可能使用智能指针)
当然,您必须有一个QApplication
并在其上调用exec()
,才能启动主事件循环。我认为您需要运行QCoreApplication::exec();虽然staticFunction
本身是静态的,但它内部的main窗口
变量不是静态的,所以一旦您从函数返回,该变量就超出了范围。谢谢各位,我刚才已经弄明白了!)我认为这不是一个非常优雅的解决方案。您正在创建内存泄漏。@李斯特先生,这就是为什么我说他需要跟踪指针并在以后删除它。我同意它不是那么优雅,我会将mainWindow
作为main()
中的局部变量,或者作为QApplication
子类中的成员变量(如果它是一个复杂的应用程序,我可以有不同的主窗口)。我正在重写closeEvent
方法,并破坏其中的窗口。@TarandeepGill如果您只打算这样做一次,那么在程序退出之前删除资源是没有意义的(您只会减慢退出的速度)。“泄漏”某些单个应用程序实例(如主窗口)是可以的。不。。。我正在重写closeEvent
方法,并销毁其中的窗口。好的,您应该提到这一点。顺便说一下,您可以设置WA_DeleteOnClose属性,该属性将处理这个问题。
void AnotherClass::staticFunction() {
MainWindow * mainWindow = new MainWindow;
mainWindow->show();
return ;
}