Russian Qt Forum

Qt => Общие вопросы => Тема начата: swizar от Май 04, 2006, 16:16



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

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

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

Код не привожу не из жадности, просто мне кажется не в нем дело.


Название: Создание пользовательских widget-ов
Отправлено: Hordi от Май 04, 2006, 19:38
Попробуй максимально упростить свой виджет, вплоть до того, что будет состоять только из родительского класса. Если прокатит, то плавно ищи ошибку у себя.
Не обязательно если в линуксе работает, то в винде долно быть также, может просто везет. Есть такое понятие - неопределенное поведение, так и тут может быть - 100 раз запустишь вроде нормально, а на сто первый - получай сигфолт!


Название: Создание пользовательских widget-ов
Отправлено: Grigory от Май 05, 2006, 09:13
Возможно это связано с установкой фокуса или таб-ордера для твоего виджета. Так же может быть  это баг  в самой версии qt (3.3.5). У меня в похожей ситуации (alt linux, qt 3.3.3 ) все работает, а под  Linux Mandriva 2006 qt 3.3.5 вылет сразу или при нажатии Tab. В чем дело, я пока не разобрался и когда руки до этого дойдут, не знаю.


Название: Создание пользовательских widget-ов
Отправлено: swizar от Май 05, 2006, 10:26
Снимаю вопрос. Спасибо за отклик.
Проблема была в следующем:
Код:

delete button1;
delete button1;


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


Название: Создание пользовательских widget-ов
Отправлено: Sergeich от Май 05, 2006, 10:53
Цитата: "swizar"
Это конечно ошибка, но gcc ее проглотил. Да и вообще, на сколько я себе предсталял это не должно приводить к краху программы.

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

никакой ошибки не возникло бы. А так после второго delete освобождается кусок памяти по адресу button1 размером sizeof(QPushButton), а в этой памяти может находится что угодно, в результате программа может грохнуться хрен знает в каком месте.


Название: Создание пользовательских widget-ов
Отправлено: Hordi от Май 05, 2006, 11:21
Как я угадал с неопределенным поведением :)
В стандарте C++ повторное удаление удаленного объекта как раз и приводит к неопределенному поведению.