【问题标题】:How can I correctly open my WxFrame loaded from an XML resource file?如何正确打开从 XML 资源文件加载的 WxFrame?
【发布时间】:2021-04-26 18:23:23
【问题描述】:

我对 C++ 和 Wx 都比较陌生,所以在过去的几个小时里,我一直在努力尝试让它工作,但我似乎在这个问题上碰到了一堵比喻性的砖墙.

此代码编译时没有错误,但在运行时,它什么也不做。 它会一直运行直到终止(例如使用 Ctrl-C),但永远不会打开一个窗口。

这里是 C++ 源代码:

#include <wx/wxprec.h>

#ifndef WX_PRECOMP
    #include <wx/wx.h>
#endif

#include <wx/xrc/xmlres.h>


class MyApp : public wxApp {
public:
    virtual bool OnInit();
};

wxIMPLEMENT_APP(MyApp);

bool MyApp::OnInit() {
    wxXmlResource::Get()->InitAllHandlers();
    wxXmlResource::Get()->Load("res.xrc");

    wxFrame MainFrame;
    wxXmlResource::Get()->LoadFrame(&MainFrame, NULL, "MainFrame");
    MainFrame.Show(true);

    return true;
}

这里是附带的 XML 文件 res.xrc,它应该只在面板中生成一个包含 sizer 的空框架:

<?xml version="1.0" ?>

<resource>
    <object class="wxFrame" name="MainFrame" title="Test">
        <object class="wxPanel" name="TopLevelPanel">        
        
           <object class="wxBoxSizer" name="TopLevelSizer">
                <orient>wxVERTICAL</orient>
           </object>
        </object>
    </object>
</resource> 

在 XML 中引入错误 - 例如,添加一些无效 XML 的虚假字符 - 确实会导致窗口打开, 它看起来像这样 (在 Linux 下):

如何修改我的代码以使窗口正确打开?

【问题讨论】:

  • 什么wx版本?资源文件相对于可执行文件位于何处?你能在那里做cd wxWidgets/buuildGTK/dsmples/xrc &amp;&amp; ls -la吗? (如果您自己构建 wx)。如果没有 - 您可以安装示例并构建 xrc 示例并运行它吗?
  • @Igor Wx 3.1.5,通过分发包安装。资源文件与可执行文件位于同一目录中。我不知道如何构建样本,甚至不知道从哪里获取它们。我对此很陌生。
  • 我想你是最新的 Ubuntu 吗?并在 Eclipse 下工作?您可以尝试调试并查看发生了什么 - 文件是否实际加载,然后是否实际找到 XDML 中的框架?
  • 另外,我刚刚意识到 - wxWidgets 使用指针操作。尝试使用以下代码:wxFrame *mainFrame = nullptr; wxXmlResource::Get()-&gt;LoadFrame( MainFrame, NULL, "MainFrame" ); MainFrame-&gt;Show( true );

标签: c++ wxwidgets


【解决方案1】:

当您到达函数的末尾时,您的 MainFrame 会被破坏,这对于应该存在很长时间的框架来说根本不是您想要的。最简单的正确做法是

wxFrame* MainFrame = wxXmlResource::Get()->LoadFrame(NULL, "MainFrame");
if ( !MainFrame ) {
    wxLogError("Failed to load the main frame from the resources.");
    return false;
}
MainFrame->Show();

即只需让 XRC 为您创建一个新框架(使用指针的重载在创建此框架本身时非常有用,即在其中传递this)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2011-12-28
    • 2021-03-06
    • 1970-01-01
    • 2013-03-22
    相关资源
    最近更新 更多