Russian Qt Forum
Ноябрь 23, 2024, 22:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание пользовательских widget-ов  (Прочитано 3766 раз)
swizar
Гость
« : Май 04, 2006, 16:16 »

Добрый всем день.
Сразу о версиях:
- linux = qt-3.1 (стандартная поставка в RedHat 9)
- win = qt-win-commercial-3.3.5 (скачана по наводке с этого форума
очень классно, без всяких проблем встала  Веселый ).

Появился у меня один вопрос, следующего плана:
Надоело набирать в диалогах кучу виджетов и разгребать их потом.
Решил для себя написать пару виджетов со своей спецификой, в виде плагинов и встроить их в дизайнер, что бы потом просто таскать на формы. Но вот с Windows получилась незадача, дизайнер падает с сообщением типа "инструкция по адресу .... обратилась к памяти по адресу ... Память не может быть прочитана". Как я надеюсь понятно, сам плагин собрался без проблем и ошибок, и даже лег куда надо.
Т.е. в дизайнере я его наблюдаю, могу стащить на форму, отредактировать свойства. Но после первого же просмотра формы, дизайнер падает.

Если кто сталкивался с подобной штукой подскажите в чем проблема.
В Linux тот же проект собирается и работает без проблем.

Код не привожу не из жадности, просто мне кажется не в нем дело.
Записан
Hordi
Гость
« Ответ #1 : Май 04, 2006, 19:38 »

Попробуй максимально упростить свой виджет, вплоть до того, что будет состоять только из родительского класса. Если прокатит, то плавно ищи ошибку у себя.
Не обязательно если в линуксе работает, то в винде долно быть также, может просто везет. Есть такое понятие - неопределенное поведение, так и тут может быть - 100 раз запустишь вроде нормально, а на сто первый - получай сигфолт!
Записан
Grigory
Гость
« Ответ #2 : Май 05, 2006, 09:13 »

Возможно это связано с установкой фокуса или таб-ордера для твоего виджета. Так же может быть  это баг  в самой версии qt (3.3.5). У меня в похожей ситуации (alt linux, qt 3.3.3 ) все работает, а под  Linux Mandriva 2006 qt 3.3.5 вылет сразу или при нажатии Tab. В чем дело, я пока не разобрался и когда руки до этого дойдут, не знаю.
Записан
swizar
Гость
« Ответ #3 : Май 05, 2006, 10:26 »

Снимаю вопрос. Спасибо за отклик.
Проблема была в следующем:
Код:

delete button1;
delete button1;


Это конечно ошибка, но gcc ее проглотил. Да и вообще, на сколько я себе предсталял это не должно приводить к краху программы.
Записан
Sergeich
Гость
« Ответ #4 : Май 05, 2006, 10:53 »

Цитата: "swizar"
Это конечно ошибка, но gcc ее проглотил. Да и вообще, на сколько я себе предсталял это не должно приводить к краху программы.

Еще как должно и еще как приводит.  Веселый  В С++ указатель на удаляемый объект не обнуляется. Если б ты написал
Код:
 
delete button1;
button1 = 0;
delete button1;

никакой ошибки не возникло бы. А так после второго delete освобождается кусок памяти по адресу button1 размером sizeof(QPushButton), а в этой памяти может находится что угодно, в результате программа может грохнуться хрен знает в каком месте.
Записан
Hordi
Гость
« Ответ #5 : Май 05, 2006, 11:21 »

Как я угадал с неопределенным поведением Улыбающийся
В стандарте C++ повторное удаление удаленного объекта как раз и приводит к неопределенному поведению.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.081 секунд. Запросов: 20.