我正在开发一个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();
没关系。 我一直在考虑克隆对话框对象,但它只是不可能的(基类的复制构造函数是私有的)。
之前有人试过这样的事吗?这甚至可能吗?
答案 0 :(得分:0)
我怀疑在工作线程中调用对话框构造函数是禁止的!
无论确切的问题是什么,我建议做主线程中的所有GUI内容都会更加安全。像这样:
在自定义事件中,传递枚举整数。然后,在回调函数中,使用switch语句构造并显示所需的对话框。
switch ( event.getDialogType() ) {
case TelemetryDialogType:
dialog = new TelemetryDialog(MainWindow::mInstance);
break;
...
}
dialog->Show(true);