crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> MDI window и plugin 2, при повторном вызове addSubWindow - Segmentation fault
balbes
  опции профиля:
сообщение 12.5.2015, 10:01
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 62
Регистрация: 11.10.2007
Пользователь №: 10

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем привет, в продолжение прошлой теме с плагином и MDI окном.
Я переделал немного плагин, теперь он шлет главному окну сигнал для создния дочернего окна и в нем передает указатель на виджет.
QWidget *CMyPlugin::getSubWindow()
{
    if( !m_pWidget )
        m_pWidget = new QTableWidget();
    return m_pWidget;
}
...
QWidget *pWidget = getSubWindow();
emit createChildWindow(pWidget);
дочернее окно создается так:
void CMainWindow::createChildWindow(QWidget *pWidget)
{
    QMdiSubWindow * pSubWindow= m_pArea->addSubWindow( pWidget );
    pSubWindow->show();
}
,но есть проблема, при закрытии дочернего (только что созданного) окна, и новом открытии его приложение вылетает с ошибкой:
Цитата
The inferior stopped because it received a signal from the Operating System.
Signal name : SIGSEGV
Signal meaning : Segmentation fault


Но почему?

Сообщение отредактировал balbes - 12.5.2015, 10:02
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 12.5.2015, 11:06
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Скорее всего это из-за того, что при первом открытии ты передаешь валидный указатель на QTableWidget, а при повтороном он уничтожается, но не становится NULL так как deleteLater и прочее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.5.2015, 0:25
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(balbes @ 12.5.2015, 12:01) *
if( !m_pWidget )
Если эта функция нужна только чтобы создать виджет, то зачем ты хранишь указатель на этот виджет (m_pWidget)?


ViGOur, прав. Удалеие виджета произойдёт после возвращения в цикл обработки событий, при этом m_pWidget скорее всего у тебя нигде не обнуляется при удалении виджета. Далее попадая в функцию CMyPlugin::getSubWindow(), тест проходит успешно (новый аиджет не создаётся) но указатель уже недействительный, ... :bomb:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.4.2024, 9:07