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 ;

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

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

【讨论】:

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

以上是关于QMainWindow 从 main() 函数打开,但不能从任何其他函数打开的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个类 PyQT 向 QComboBox 添加项目?

从 QMainWindow 调用具有变量名的 Python 函数

从 QMainWindow 和 Ui_MainWindow 继承 MainWindow 类

移动 QMainWindow 不会影响子窗口小部件的绘制位置

C ++ QT如何从QMainWindow布局访问QWidget的公共类成员

空 QMainWindow,PyQt