crossplatform.ru

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

4 страниц V  < 1 2 3 4 >  
Ответить в данную темуНачать новую тему
> код ошибки -1073741819
lanz
  опции профиля:
сообщение 4.2.2013, 16:08
Сообщение #21


Старейший участник
****

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

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




Репутация:   8  


То же самое.
Plot* plot = new Plot(c.Filename,c.type,c.channel_num,this);

Здесь plot становится дочерним виджетом widget, потом удаляется deleteLater, потом второй раз удаляется при удалении widget (т.к. входит в иерархию QObject-ов)

Надо удалить deleteLater.
Напомнило анекдот
"-Доктор, мне больно когда я вот-так делаю.
-Не делайте так. Следующий!"
:lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
demaker
  опции профиля:
сообщение 5.2.2013, 9:18
Сообщение #22


Студент
*

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

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




Репутация:   0  


Согласен. Но также вылетает - 255 дает

Цитата(demaker @ 5.2.2013, 10:07) *
Согласен. Но также вылетает - 255 дает


Сделал так

void Widget::dropEvent(QDropEvent *event)
{
...

Plot* plot = new Plot(c.Filename,c.type,c.channel_num);
vbl_plot->addWidget(plot);
listPlot.append(plot);
...
}

Widget::~Widget()
{
    delete ui;

    for(int i = 0; i<listPlot.length();i++)
    {
        listPlot.at(i)->deleteLater();
    }
    listPlot.clear();

    items.clear();
}


но не помогает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
demaker
  опции профиля:
сообщение 5.2.2013, 10:34
Сообщение #23


Студент
*

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

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




Репутация:   0  


int TreeWidget::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QTreeWidget::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    if (_c == QMetaObject::InvokeMetaMethod) {
        switch (_id) {
        case 0: sg_itemChecked((*reinterpret_cast< TreeWidgetItem*(*)>(_a[1]))); break;
        default:;
        }
        _id -= 1;
    }
    return _id;
}

вот в этой функции, когда в дебаге отлаживаю зависает и не выходит

хотя нет - но в дебаге работает нормально, а так :unsure: не понимаю почему
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 5.2.2013, 12:05
Сообщение #24


Старейший участник
****

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

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




Репутация:   8  


Ага, а deleteLater остался в sl_deletePlot? Хотя не должно влиять там они и из листа удаляются.

Сообщение отредактировал lanz - 5.2.2013, 12:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
demaker
  опции профиля:
сообщение 5.2.2013, 12:14
Сообщение #25


Студент
*

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

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




Репутация:   0  


Цитата(lanz @ 5.2.2013, 13:05) *
Ага, а deleteLater остался в sl_deletePlot? Хотя не должно влиять там они и из листа удаляются.


В листе у нас вроде :blink: указатели на плоты, а не сами плоты.
Может я ошибаюсь :huh:

Поэтому мы по списку идем и удаляем.
Правильно?

 for(int i = 0; i<listPlot.length();i++)
    {
        listPlot.at(i)->deleteLater();
    }
    listPlot.clear();


а в слоте, я удаляю тот, на который кликнули

connect(tree,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(sl_deletePlot(QTreeWidgetItem*,int)));


 listPlot.removeOne(((TreeWidgetItem*)item)->p);
((TreeWidgetItem*)item)->p->deleteLater();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 5.2.2013, 12:16
Сообщение #26


Старейший участник
****

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

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




Репутация:   8  


Мне не нравятся эти deleteLater в деструкторе.
Виджет разрушается уже после выхода приложения из основного цикла, поэтому делет лэйтер может не сработать, да и вообще хз как он работает в завершившемся приложении. Можно попробовать тупо закомментить его, посмотреть что будет, если ошибка пройдет значит в нем дело.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
demaker
  опции профиля:
сообщение 5.2.2013, 12:26
Сообщение #27


Студент
*

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

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




Репутация:   0  


Цитата(lanz @ 5.2.2013, 13:16) *
Мне не нравятся эти deleteLater в деструкторе.
Виджет разрушается уже после выхода приложения из основного цикла, поэтому делет лэйтер может не сработать, да и вообще хз как он работает в завершившемся приложении. Можно попробовать тупо закомментить его, посмотреть что будет, если ошибка пройдет значит в нем дело.


Закоментил

listPlot.removeOne(((TreeWidgetItem*)item)->p);
//((TreeWidgetItem*)item)->p->deleteLater();
((TreeWidgetItem*)item)->setCheckState(0,Qt::Unchecked);


при двойном клике на item, плот не закрывается, и не вылетает.
а когда виджет закрываю, то в консоле
untitled.exe завершился с кодом -1073741819

Вся фигня, когда я добавляю графики с цифровым сигналом(digital)
А с аналоговыми(analog) все нормально. :huh:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 5.2.2013, 13:24
Сообщение #28


Старейший участник
****

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

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




Репутация:   8  


Не, не эти deleteLater .)

Вот эти
    for(int i = 0; i<listPlot.length();i++)
    {
        listPlot.at(i)->deleteLater();
    }

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
demaker
  опции профиля:
сообщение 5.2.2013, 13:41
Сообщение #29


Студент
*

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

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




Репутация:   0  


Не, все так же
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 5.2.2013, 13:48
Сообщение #30


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


нужно:

1) решить, какой класс управляет данными в массиве (в частности - в мапе, в списке)
2) инкапсулировать массив в этот класс с доступом private
3) сделать методы Clear(), DeleteItem(), .... , AddItem(), FindItem(), ...
4) из конструктора класса вызвать Clear()

и не мучать себя и остальных :D

и, естественно, никаких deleteLater

Сообщение отредактировал Алексей1153 - 5.2.2013, 13:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V  < 1 2 3 4 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 28.3.2024, 19:37