【问题标题】:C++, Passing custom class object in wxWidgetsC++,在 wxWidgets 中传递自定义类对象
【发布时间】:2016-06-19 20:37:16
【问题描述】:

谁能解释我如何将自定义类对象传递给 wxWidgets 中的另一个函数?我有一个名为 AddUser 的 wxDialog 类,它包含一个 void 类型的 OnButtonClick 函数,该函数创建自定义类“User”的对象。如何将该对象传递给位于 Main 类中的另一个 OnButtonClick 函数?

【问题讨论】:

  • 为什么要直接打电话给OnButtonClick()?你不能在 Main 类中创建一个以User* 作为参数的函数吗?
  • main中的OnButtonClick函数用于显示对象的内容。
  • @然后只需添加一个函数,该函数接受 User* 并显示它。无需调用其他函数。

标签: c++ wxwidgets


【解决方案1】:

关于wxDialog 需要了解的重要一点(如果您还没有)是在堆栈上创建它们是完全可以的(大多数 wxWidgets 窗口应该在堆上创建)。

这意味着您的对话框实例即使在用户按“确定”关闭后仍然可用。您可以通过以下代码测试用户响应:

... existing method ...

AddUser dialog (this);

if (dialog.ShowModal() == wxID_OK)
{
    ... process new user ...
}

由于对话框仍在实例化,您可以在对话框代码中包含一个返回新用户的方法,如下所示:

User AddUser::GetUser ()
{
    return newUser;
}

但是,您当然应该小心实际创建新用户的位置。例如,如果新用户对象是在对话框中本地创建的,那么您将需要制作它的副本(如上例所示)。如果它是在堆上创建的(我不建议这样做),那么您可以返回一个指针。第三种选择是传递对GetUser 方法的引用,这样对话框方法如下所示:

bool AddUser::GetUser (User& user)
{
    // Make sure that all fields are valid. Simple example given, but
    // should be more complete.
    if (TextName->GetValue() != "" && TextSurname->GetValue() != "")
    {
        user.setName(TextName->GetValue());
        user.setSurname(TextSurname->GetValue());

        return true;
    }
        return false;

    return newUser;
}

调用看起来像这样:

void wxBiblioFrame::OnButAddUserClick(wxCommandEvent& event)
{
    AddUser dialog(this);
    myUserDialog dialog (this);

    myUserClass newUser;

    if (dialog.ShowModal() == wxID_OK)
    {
        if (dialog.GetUser (newUser))
        {
            ... process and store the new user ...
        }
        else
        {
            ... handle the error ...
        }
    }

    // NOTE: no need to Destroy() the dialog.
}

顺便说一句,除非您的用户类很大,否则从效率的角度来看,我不会太担心制作对象的副本。创建和关闭对话框可能会使制作副本所花费的时间相形见绌。

【讨论】:

  • 我改变了一些东西,我不知道我正在尝试做的事情是否合乎逻辑并且可能像我想的那样。这是项目文件github.com/frezn08/wxBib。使用 AddUser 我想创建一个对象并设置它的所有变量,然后将其传递给 ShowList,它将在 TextCtrl 中显示它。
  • 您尝试做的事情是合乎逻辑且可能的,但我会建议另一种方法。查看wxStdDialogButtonSizer 的“确定”和“取消”按钮。而不是AddUser::OnButOKClick,确定按钮将自动关闭它。然后,您可以在 GetUser 方法中填充您的 User 对象(请参阅上面的更新答案)。其他 cmets:1)我不会在同一个对话框中创建新用户和新书。 2) 对于 ShowList,最好在主框架上有一个 wxListCtrl 或 wxDataViewListCtrl。
  • 非常感谢您的时间和精力。我认为我对此太愚蠢了。
  • 我非常怀疑!我不知道你用 wxWidgets 开发多久了,但是需要一点时间来适应。之后,我想你会发现它是一个非常全面和有用的框架。
【解决方案2】:

您不能调用 OnClick 事件并传递与事件签名中的参数不同的内容。如果您需要类似 tis 的东西,那么也许您应该考虑重申您的应用程序的架构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多