QMainWindow 从 main() 函数打开,但不能从任何其他函数打开
Posted
技术标签:
【中文标题】QMainWindow 从 main() 函数打开,但不能从任何其他函数打开【英文标题】:QMainWindow opens from main() function, but not from any other function 【发布时间】: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
变量不是,所以一旦你从函数返回,变量就会超出范围。
谢谢大家,我已经想通了! :)
【参考方案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 ;
您还需要以某种方式跟踪指针并在以后使用delete
d(可能使用智能指针)。
当然,您必须有一个 QApplication
并在其上调用 exec()
才能启动主事件循环。
【讨论】:
我不认为这是一个非常优雅的解决方案。您正在创建内存泄漏。 @MrLister 这就是为什么我说他需要跟踪指针并稍后删除它的原因。我同意它不是那么优雅,我会将mainWindow
作为main()
中的局部变量,或者作为QApplication
子类中的成员变量(如果它是一个复杂的应用程序,我可以有不同的主窗口)。跨度>
我正在重写closeEvent
方法,并销毁其中的窗口。
@TarandeepGill 如果您只在程序退出之前删除资源没有意义时才这样做(您只会减慢退出速度)。可以“泄漏”某些单应用程序实例,例如主窗口。以上是关于QMainWindow 从 main() 函数打开,但不能从任何其他函数打开的主要内容,如果未能解决你的问题,请参考以下文章
如何从另一个类 PyQT 向 QComboBox 添加项目?
从 QMainWindow 调用具有变量名的 Python 函数
从 QMainWindow 和 Ui_MainWindow 继承 MainWindow 类
移动 QMainWindow 不会影响子窗口小部件的绘制位置