![]() |
|
|
![]()
|
|
| NewDima |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
Всем привет
[qt opensource 4.4.3] следующий участок кода
выдает в gdb следующие окна во время инициализации debugMemo ![]() затем выскакивает сразу ошибка сегментирования помогите разобраться, из-за чего это вызов идет так main.cpp
mainwindow.cpp
Добавлено @ 08:34 исходник Это сообщение отредактировал(а) NewDima - 29.12.2008, 08:54 Присоединённый файл ( Кол-во скачиваний: 9 )
mainwindow.cpp 31,15 Kb |
||||||
|
|||||||
| ecspertiza |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 3.11.2008 Где: г.Смоленск Репутация: 4 Всего: 5 |
а можешь ещё mainwindow.h выложить.
|
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
что интересно, в методе CreateForms() исключил инициализацию debugMemo. Далее создается другое окно, на нем создаются две кнопки (без ошибок) и еще один QTextEdit создается. Вот на нем та же ошибка
Присоединённый файл ( Кол-во скачиваний: 8 )
mainwindow.h 4,98 Kb |
|||
|
||||
| ecspertiza |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 3.11.2008 Где: г.Смоленск Репутация: 4 Всего: 5 |
может конечно оно и не так, но в файлике который ты скинул, объявление debugMemo и dockWidgetDebug закоментированы, тоесть ты создаёшь объект которого нет, вот и возникает ошибка сигментации.
|
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
сорри, я кинул тот, который уже закомментировал, что бы проверить без них)
если закомментировать, и пытаться создать, компилятор не даст)). А так они без комментов должны быть) Добавлено через 9 минут и 7 секунд Может в конструкторе нельзя создавать виджеты QTextEdit? хотя QTreeView создается без ошибок |
|||
|
||||
| ecspertiza |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 3.11.2008 Где: г.Смоленск Репутация: 4 Всего: 5 |
Насколько я знаю можно, слушай а дебагер вроде у тебя не на debugMemo ругается а на QString text, попробуй закоментить или переименовать например str. |
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
точно на него. Дебагер показывает строку, которую будет выполнять дальше, но еще не выполнил |
|||
|
||||
| SABROG |
|
||||||||||||||||||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Я бы хотел немного к стилистике кода придраться (не сочтите за наезд), т.к. идей насчет ошибки у меня нет
Улыбнуло двойное включение хедера
И остальной паровоз GUIшных хедеров. Можно обойтись всего лишь:
Хотя я и не исключаю, что возможно при ручном включении нужных хедеров компиляция будет быстрее. "typedef struct" - наследие Си ? Чем плох обычный "struct tree_struct" ? Много избыточной информации
Можно переписать так:
Хотя и рекомендуется для членов класса использовать нотацию типа getMethod/setMethod, но тролли обычно get опускают, а set оставляют. К тому же надо придерживаться общего стиля, а то "get", "Get". Насчет передачи параметров типа QString. Используй передачу по ссылке, если это возможно, метод помечай как const, если он "read only" и не меняет состояния класса. Если не нужна интернационализация (unicode), то используй более легковесный класс QLatin1String, который в конструкторе не переводит строку в Unicode, отчего быстрее. В методе getSettingValue врятли можно будет его использовать из-за операции конкатенации строк, да и для передачи ссылок на строки придется модифицировать метод, чтобы value не менялась.:
Тоже самое. Добавить передачу параметра строки по ссылке, сделать const. Вынести реализацию в .cpp файл. И может быть сделать перегрузку метода, вместо того, чтобы объявлять 3 с разными именами ?
И может быть вместо 3х вызовов сделать один ?
Тут параметр this не обязателен
это эквивалентно:
В некоторых местах используется макрос TRUE, в некоторых true. Не уверен в идентичности типов или копи-паст с чужих исходников ? Используй true.
Не используй NULL, используй 0. Этот тип относится только к WinApi и тролли его используют только для вызовов API функций винды. Если дело доходит до такого, вспоминай QLatin1String:
DWORD. Таже история (winapi). Если нужен тип с фиксированным размером 4 байта используй quint32. Тролли дают зуб ;) Это сообщение отредактировал(а) SABROG - 29.12.2008, 10:19 |
||||||||||||||||||||||
|
|||||||||||||||||||||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
блин, большое спасибо по комменту, постараюсь учесть все. Просто я дельфист. На сях начал писать только курсач, думаю для одного месяца пойдет=)
Добавлено через 12 минут и 57 секунд но вопрос темы в силе |
|||
|
||||
| ecspertiza |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 3.11.2008 Где: г.Смоленск Репутация: 4 Всего: 5 |
Может это Qt трабол, попробуй например тоже самое под Linux собрать, точно так же пробовал создоват QTextEdit всё нормально, и с кодом всё нармуль,
из вариантов у меня остался только бубен, работает 50 на 50 но может тебе поможет. |
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
под линой таже проблема. Там с памятью по-жостче.
Бубен не помог, да и времени трясти его нет |
|||
|
||||
| pan2004 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 6 Всего: 9 |
Кстати, функция SetStandartSettings необязательна - зачем она вообще нужна?
То же самое можно делать при получении значения из QSettings, один из параметров - значение по умолчанию. И вообще зачем создавать этот виджет(dockWidgetDebug, debugMemo)и другие динамически, если есть ui файл? |
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
вообще ui файл убрать надо=)
сейчас этим займусь Функция SetStandartSettings создает дефолтные настройки, в случае, если ini-файл отсутствует. Я пока ее поставил, чтобы она постоянно запускалась, но для релиза поставлю на условие спасибо за замечание |
|||
|
||||
| pan2004 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 6 Всего: 9 |
Попытка воспроизвести ошибку не увенчалась успехом, код:
работает без проблем. Возможно, проблема кроется в ui файле(?) который каким-то образом интерферирует с написанным тобой кодом. Попробуй убрать вызов ui->setupUi(this); из твоего конструктора. |
||||
|
|||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
А программа то сама работает ? Или это только gdb ругается ?
Сборка debug static ? С релизом тоже самое ? |
|||
|
||||
| pan2004 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 6 Всего: 9 |
Еще рекомендуют не инициализировать все диалоги сразу(это может занять много времени, в зависимости их количества), а создавать по необходимости. Хотя в принципе, когда диалогов мало, оба варианта имеют право на жизнь)
|
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
pan2004, убрал, не помогает
SABROG, релиз работает нормально, под виндой. А вот под Мандриваой отказывается, говорит ошибка сегментации, но, поскольку у меня нет в поле зрения знакомого отладчика под линь, я использую Insight. Дебаг версия под виндой выдавала ошибку, о ней я недавно вопрос задавал, а теперь понял, почему она появляется. pan2004, спасибо за рекомендацию. Очень интересно, для запроса у юзера строки использую QInputDialog:getText. Окошко появляется, но после него через одну-пару секунд вылезают те самые сообщения о сегментации Единственным выходом на данный момент для меня является поменять методы, поэтому сразу задам вопрос, не создавая под него новой темы: как у QStandardItem-а узнать выделен ли он? я пробегаюсь по всему дереву и хочу это узнать, но методов типа isSelected() ни у него, ни у QModelndex не нашел. Подскажите, как это осуществляется? |
|||
|
||||
| pan2004 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 6 Всего: 9 |
Если тебе нужны выделенные итемы, то у самого дерева(модели) вроде есть функция типа getSelected... |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
У QItemSelectionModel уже есть куча методов таких как: QModelIndex currentIndex () const (заметь это не текущее выделение, итем может быть текущим, но не выделенным, как бы выделение и текущий выбранный итем разные вещи) bool isSelected ( const QModelIndex & index ) const QModelIndexList selectedIndexes () const Ну и всякие методы, чтобы выделять итемы, выбирать итем и т.п. |
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
SABROG, спасибо, но тема, увы, еще не закрыта
|
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Вот тут я не совсем понял фразу типа нет в поле зрения знакомого отладчика под линь. GDB и Insight одно и то же в принципе, разница лишь в интерфейсе управления. И если в релиз версии ошибку не выдает, а в дебаг версии под винду ты понял в чем ошибка, то что остается, дебаг версия под линем с той же ошибкой ? |
|||
|
||||
| pan2004 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 6 Всего: 9 |
||||
|
||||
| NewDima |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
insight графический, а с gdb просто нет времени разбираться. хех, ошибку то нашел, а исправить, кроме как не использовать данный участок кода, не могу. По-этому для меня обойти ошибку - не значит решить проблему
я не про текущую ошибку, а про ту, которую описывал на днях в другой теме. Она как раз из-за этой ошибки сегментации. Еще нашел ответ на вопрос, почему креатор с gdb не отлаживал дальше функции CreateForms(), видать у него с самим gdb нелады в случае таких ошибок, как с сегментацией, в отличие от Insight. Вообще, я весь проект написал вслепую (ну разве что MessageBox), т.е. отладчик отказывался работать вместе с кретором, релиз работал без лишних сообщений, а инсайт скачал только вчера. Собственно, нужда компилить под линух заставила меня решать эти проблемы с сегментацией Это сообщение отредактировал(а) NewDima - 29.12.2008, 13:43 |
||||
|
|||||
| pan2004 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 6 Всего: 9 |
Только что попробовал откомпилить выше написанный код под linux(kubuntu 8.10 qt 4.4.3) - работает.
Добавлено через 7 минут и 7 секунд Методом исключения остается две возможности: либо у тебя кривая версия qt на линуксе(что наврятли, поскольку проявилось бы в чем-то еще), либо проблема не в выданном тобой коде. |
|||
|
||||
| ecspertiza |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 3.11.2008 Где: г.Смоленск Репутация: 4 Всего: 5 |
pan2004
Добавлено @ 14:34 Я компилил код под Windows Vista и под OpenSuse 11.0 Это сообщение отредактировал(а) ecspertiza - 29.12.2008, 14:36 |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |