【问题标题】:Using notebooks with splitters in wxWidgets在 wxWidgets 中使用带有拆分器的笔记本
【发布时间】:2023-02-26 05:04:24
【问题描述】:

我正在尝试使用 wxWidgets(我是新手),我正在尝试制作一个带有笔记本和标签的窗口,然后在笔记本内部,我想要一个拆分器,以便我可以在上面显示一棵树左边,右边是另一个笔记本,里面会有更多的标签。但它引起了问题。到目前为止,我已经扩展了一个 wxFrame,下面是它的内容:

wxPanel* parent = new wxPanel(this, wxID_ANY);

wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL);

wxNotebook* notebook = new wxNotebook(parent, wxID_ANY, wxDefaultPosition, this->GetSize());
wxPanel* notebookWindow = new wxPanel(notebook, wxID_ANY);

parent->SetSizer(vbox);
Center();
Maximize(true);

notebook->SetSize(this->GetSize());
notebook->AddPage(notebookWindow, wxT("Tab one"), true, 0);
notebook->AddPage(notebookWindow, wxT("Tab two"), true, 0);

wxSplitterWindow* splitterWindow = new wxSplitterWindow(notebookWindow, wxID_ANY);

wxTreeCtrl* tree = new wxTreeCtrl(splitterWindow, wxID_ANY, wxPoint(0, 0), wxSize(200, 1000), wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT | wxTR_HIDE_ROOT | wxTR_EDIT_LABELS);

wxTreeItemId rootID = tree->AddRoot(wxT("Root"));
wxTreeItemId item1ID = tree->AppendItem(rootID, wxT("Item 1"));
wxTreeItemId item2ID = tree->AppendItem(rootID, wxT("Item 2"));
wxTreeItemId item3ID = tree->AppendItem(rootID, wxT("Item 3"));
wxTreeItemId item4ID = tree->AppendItem(item2ID, wxT("Item 4"));

vbox->Add(splitterWindow, 1, wxALL | wxEXPAND, 5);

当我运行它时,我在最后一行收到一条错误消息:

“CheckExpectedParentIs(w, m_containingWindow)”在 wxSizer::DoInsert() 中失败:由与给定窗口关联的 sizer 管理的窗口必须将此窗口作为父窗口,否则它们将无法正确重新定位。

但随后它显示正确。但我仍然想摆脱这个错误。我认为这是在说,如果我将 splitterWindow 添加到 vbox,那么 vbox 应该设置为 splitterWindow 的父级 sizer,即 notebookWindow,这样我就可以更改行“parent->SetSizer(vbox);” “到“notebookWindow->SetSizer(vbox);”,但是当我尝试这样做时,即使错误消失了,树也消失了!

还:

  • 我搞砸了分离器,试图让它正确显示东西,包括在主笔记本中右侧带有标签的额外笔记本,但我也没有运气。

  • 我还需要能够使用鼠标来拖动和移动拆分器位置,但这似乎也没有发生。

  • 我需要树和嵌套的笔记本在拆分器移动时相应地移动和调整大小。

  • 而且我还注意到,当我单击选项卡时,它会更改选择的选项卡,但除此之外,没有任何反应。我需要能够在主笔记本的不同选项卡上显示不同的树,这样当我点击不同的选项卡时视图就会改变,嵌套笔记本也必须能够在不同的选项卡上显示不同的内容(否则有什么意义根本不使用标签?)。

我已经搜索了这方面的教程,但我发现的只是像https://zetcode.com/gui/wxwidgets 这样的东西,它似乎并没有真正解决这些问题。有人可以帮帮我吗?

【问题讨论】:

  • 当您开始使用 wxWidgets 和 sizer 时,很难手动编写所有代码。获取一些 RAD 工具——wxGlade、wxFormBuilder、wxCrafter 等,并在那里设计你的 GUI。然后查看生成的代码并尝试了解不同之处。 (我推荐 wxGlade - 它得到维护并且可以根据当前的 wxWidgets 版本生成代码 - 我不是维护者,只是一个快乐的用户)。
  • 我正在尝试使用 wxGlade,但安装说明有点含糊,因为它说“将存档解压缩到已知位置并可能将其添加到路径中。”但它没有指定它在谈论什么路径或如何添加它。它还说“在 Windows 上,应该安装 win32 扩展”,但我也不知道。它说“使用在你的平台上启动 python 应用程序所需的任何东西”,但我不确定我是否有任何解释器或我需要的任何东西。我使用 C++。我会试试这个,但我不知道我是否能成功。你能修复我的代码吗?
  • 我已经检查了你的所有三个建议,它们的安装说明非常复杂或模糊不清,或者它们需要一些完全不同的 IDE(我使用的是 Visual Studio .NET),但是没有一个我可以下载一个安装程序文件,运行它来安装程序,然后运行它来生成我的代码?

标签: c++ user-interface wxwidgets


【解决方案1】:

上面的代码在多个方面确实是错误的:

  1. 您将同一个窗口 (notebookWindow) 添加到笔记本中两次,这是不允许的。您需要为每个页面/标签创建一个新窗口。
  2. 您需要使用 notebookWindow 设置包含拆分器的 sizer,即拆分器父级,正如断言消息告诉您的那样。

    该代码与您说的要执行的操作不符,因为当您谈论其中的两个笔记本时只有一个笔记本,但是您所描述的肯定可以按照您正在做的方式完成,只需使用正确的父母/衡量者。规则很简单:window sizer 可以而且必须只用于管理这个窗口的子窗口,而不是任何其他窗口。

    此外,尽管有 cmets 中的建议,在使用 wxWidgets 时不使用对话框编辑器是完全没问题的,但是使用 XRC(无论是由编辑器处理还是手动编写)对于更复杂的布局确实可以更简单,尤其是避免重新编译代码只是为了测试布局更改(XRC 可以从外部文件加载)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 2014-09-03
    • 1970-01-01
    相关资源
    最近更新 更多