0

我正在开发一个 wxWidgets 应用程序,并且我正在尝试创建一个回调,它将显示在我的自定义事件类中给出的对话框作为指向动态创建的对话框对象的指针。这样做的原因是我想要一个回调,它将启动任何不知道对话框确切类的对话框/窗口。

为此,我需要从主线程(例如回调函数)显示对话框,否则程序会遇到错误(在某些情况下它仍然运行,但通知用户它不是启动新窗口的正确方式)。

因此,我创建了新对话框,将其分配给我的自定义事件并将事件排队到主窗口。

wxDialog *dialog = new TelemetryDialog(MainWindow::mInstance);
DialogEvent *event = new DialogEvent(EVENT_DIALOG_SHOW, dialog);
MainWindow::mInstance->m_eventHandler->QueueEvent(*event);

然后在回调函数中:

wxDialog *dialog = event.getDialog();
if (dialog != NULL)
{
    dialog->Show(true);
}

发生的事情是对话框出现空并且程序冻结。但是如果我使用这样的回调函数:

wxDialog *dialog = new TelemetryDialog(this);
dialog->Show();

没关系。我一直在考虑克隆对话框对象,但这是不可能的(基类的复制构造函数是私有的)。

有没有人尝试过这样的事情?这甚至可能吗?

4

1 回答 1

0

我怀疑在工作线程中调用对话框构造函数是不行的!

不管具体问题是什么,我建议在主线程中做所有的 GUI 东西会更安全。像这样:

在您的自定义事件中,传递一个枚举整数。然后,在您的回调函数中,使用 switch 语句来构造并显示所需的对话框。

switch ( event.getDialogType() ) {
case TelemetryDialogType:
  dialog = new TelemetryDialog(MainWindow::mInstance);
  break;
...
}

dialog->Show(true);
于 2013-03-08T14:50:08.980 回答