Mercurial > octave
changeset 32247:0b551b864e4c
improve exiting GUI in Qt6 by fixing crash in variable editor
* octave-qobject.cc (~base_qobject): use deleteLater for main
window and delete for dick widgets
* variable-editor.h: new class variable with a list of all used
dock widgets for the open variables
* variable-editor.cc (variable_editor::variable_editor):
initialize new class variable with list of current dock widgets;
(variable_editor::focusInEvent): search in list of dock widgets
instead of using findChildren;
(variable_editor::~variable_editor): disconnect destroyed()
signals of all variable dock widgets preventing a crash when
dock widgets are destroyed after variable editor, no need to
delete tool bar here anymore;
(variable_editor::edit_variable): add new dock widget to the list
(variable_editor::variable_destroyed): search in list of dock widgets
instead of using findChildren;
(variable_editor::variable_focused): dito
author | Torsten Lilge <ttl-octave@mailbox.org> |
---|---|
date | Wed, 09 Aug 2023 20:44:44 +0200 |
parents | 4d4922c57a92 |
children | 3df98fee838b |
files | libgui/src/octave-qobject.cc libgui/src/variable-editor.cc libgui/src/variable-editor.h |
diffstat | 3 files changed, 47 insertions(+), 42 deletions(-) [+] |
line wrap: on
line diff
--- a/libgui/src/octave-qobject.cc Wed Aug 09 10:15:42 2023 -0400 +++ b/libgui/src/octave-qobject.cc Wed Aug 09 20:44:44 2023 +0200 @@ -361,23 +361,19 @@ if (m_community_news) m_community_news->close (); } + else + { + m_main_window->deleteLater (); + } - if (m_terminal_widget) - m_terminal_widget->deleteLater (); - if (m_documentation_widget) - m_documentation_widget->deleteLater (); - if (m_file_browser_widget) - m_file_browser_widget->deleteLater (); - if (m_history_widget) - m_history_widget->deleteLater (); - if (m_workspace_widget) - m_workspace_widget->deleteLater (); - if (m_editor_widget) - m_editor_widget->deleteLater (); - if (m_variable_editor_widget) - m_variable_editor_widget->deleteLater (); - if (m_community_news) - m_community_news->deleteLater (); + delete m_terminal_widget; + delete m_documentation_widget; + delete m_file_browser_widget; + delete m_history_widget; + delete m_workspace_widget; + delete m_editor_widget; + delete m_variable_editor_widget; + delete m_community_news; delete m_interpreter_qobj; delete m_qsci_tr; @@ -385,9 +381,6 @@ delete m_qt_tr; delete m_workspace_model; - if (m_main_window) - m_main_window->deleteLater (); - delete m_qapplication; string_vector::delete_c_str_vec (m_argv);
--- a/libgui/src/variable-editor.cc Wed Aug 09 10:15:42 2023 -0400 +++ b/libgui/src/variable-editor.cc Wed Aug 09 20:44:44 2023 +0200 @@ -1128,6 +1128,7 @@ m_font (), m_sel_font (), m_table_colors (), + m_variables (QList<variable_dock_widget*> ()), m_current_focus_vname (""), m_hovered_focus_vname (""), m_plot_mapper (nullptr), @@ -1196,13 +1197,18 @@ } else { - QDockWidget *any_qdw = m_main->findChild<QDockWidget *> (QString (), Qt::FindDirectChildrenOnly); - if (any_qdw != nullptr) + bool focus_set = false; + for (qsizetype i = 0; i < m_variables.size (); i++) { - activateWindow (); - any_qdw->setFocus (); + if (m_variables.at (i) != nullptr) + { + activateWindow (); + m_variables.at (i)->setFocus (); + focus_set = true; + break; + } } - else + if (! focus_set) setFocus(); } } @@ -1210,14 +1216,14 @@ variable_editor::~variable_editor () { - // FIXME: Maybe toolbar actions could be handled with signals and - // slots so that deleting the toolbar here would disconnect all - // toolbar actions and any other slots that might try to access the - // toolbar would work properly (I'm looking at you, - // handle_focus_change). - - delete m_tool_bar; - m_tool_bar = nullptr; + // Disconnect the destroyed() signals from all variable_dock_widget + // other wise the non existing slot in variable_editor seems to be + // accessed in Qt6 leading to a crash (signal 6). + for (qsizetype i = 0; i < m_variables.size (); i++) + { + if (m_variables.at (i) != nullptr) + disconnect (m_variables.at (i), SIGNAL (destroyed (QObject*)), 0, 0); + } } void @@ -1251,6 +1257,8 @@ variable_dock_widget *page = new variable_dock_widget (this); + m_variables << page; + page->setObjectName (name); m_main->addDockWidget (Qt::LeftDockWidgetArea, page); @@ -1516,14 +1524,18 @@ m_focus_widget_vdw = nullptr; } - if (m_tool_bar) + for (qsizetype i = 0; i < m_variables.size (); i++) { - // If no variable pages remain, deactivate the tool bar. - QList<variable_dock_widget *> vdwlist = findChildren<variable_dock_widget *> (); - if (vdwlist.isEmpty ()) - m_tool_bar->setEnabled (false); + if (m_variables.at (i) == obj) + { + m_variables.removeAt (i); + break; + } } + if (m_tool_bar && m_variables.isEmpty ()) + m_tool_bar->setEnabled (false); + QFocusEvent ev (QEvent::FocusIn); focusInEvent (&ev); } @@ -1541,14 +1553,12 @@ m_focus_widget_vdw = nullptr; if (current != nullptr) { - QList<variable_dock_widget *> vdwlist = findChildren<variable_dock_widget *> (QString (), Qt::FindDirectChildrenOnly); - for (int i = 0; i < vdwlist.size (); i++) + for (qsizetype i = 0; i < m_variables.size (); i++) { - variable_dock_widget *vdw = vdwlist.at (i); - if (vdw->isAncestorOf (current)) + if (m_variables.at (i)->isAncestorOf (current)) { m_focus_widget = current; - m_focus_widget_vdw = vdw; + m_focus_widget_vdw = m_variables.at (i); break; } }