6 / 3 / 0
Регистрация: 04.05.2018
Сообщений: 407
|
|
1 | |
Ошибка при создании сигнала для нажатие на виджет02.07.2019, 22:11. Показов 841. Ответов 17
Метки нет (Все метки)
Дорой ночи. Сидел писал код, все было прекрасно, а потом ни с того ни с сего куча ошибок, и я не понимаю ни капли в чем проблема... Кода довольно много, по этому скину файлом. Подскажу куда рыть:
draftsmanparallepiped.cpp - обьявлен метод virtual void mousePressEvent(QMouseEvent *). mainwindow.h - создаю указатели и именно указатель DraftsmanParallelepiped *Parallelepiped приводит к ошибке. mainwindow.cpp - реализую ранее обьявленый слот ShowChooseParallelepiped, там же конекчу сигнал со слотом и все... 20 ошибок. Выручайте братцы, пожалуйста! https://yadi.sk/d/9-p8M7usI8bvdg
0
|
02.07.2019, 22:11 | |
Ответы с готовыми решениями:
17
При создании виджета, дочернего к QGLWidget, дочерний виджет не отображается Ошибка при создании дескриптора окна при динамическом создании кнопок Ошибка при создании события для кнопки Ошибка при создании пароля для приложения |
284 / 173 / 62
Регистрация: 13.03.2019
Сообщений: 419
|
|||||||||||||||||||||
03.07.2019, 00:18 | 2 | ||||||||||||||||||||
У тебя полная неразбериха между классами MainWindow и DraftsmanParallelepiped
Один класс не может напрямую вызывать сигнал другого класса. Так нельзя:
Тогда так:
2 из draftsmanparallelepiped.h убери #include "mainwindow.h" Ты закольцевал недеры. 3. в mainwindow.h добавь #include "draftsmanparallelepiped.h" Отсутствие этого хедера и ведёт к ругани на указатель. 4. Не
0
|
6 / 3 / 0
Регистрация: 04.05.2018
Сообщений: 407
|
|
03.07.2019, 08:38 [ТС] | 3 |
Анна по жизни, Сделал то, что вы написали и действительно помогло, спасибо большое!
Теперь другая проблема. При запуске программы все работает идеально, но после нажатия на Parallelepiped программа зависает и закрывается У меня нет указателя *event. Посмотрел документацию и чего-то не нашел ничего связанное с анализом
0
|
284 / 173 / 62
Регистрация: 13.03.2019
Сообщений: 419
|
|
03.07.2019, 09:26 | 4 |
Я имела в виду аргумент QMouseEvent *, который передаётся в метод mousePressEvent(QMouseEvent *).
The Event System
0
|
6 / 3 / 0
Регистрация: 04.05.2018
Сообщений: 407
|
|||||||||||||||||||||
03.07.2019, 09:52 [ТС] | 5 | ||||||||||||||||||||
Анна по жизни, Подключил в mainwindow.cpp
После нажатия должна выполняться следующая строчка:
0
|
284 / 173 / 62
Регистрация: 13.03.2019
Сообщений: 419
|
||||||
03.07.2019, 10:11 | 6 | |||||
Попробуй добавить вызов родительского обработчика событий, иначе ты не даёшь виджету обрабатывать события, не попадающие под твоё условие.
Добавлено через 2 минуты У самого события есть методы ignore() и accept(), на которые надо обратить внимание.
0
|
6 / 3 / 0
Регистрация: 04.05.2018
Сообщений: 407
|
||||||
03.07.2019, 11:19 [ТС] | 7 | |||||
Анна по жизни, Не помогло(((
Дописал еще:
Добавлено через 1 час 4 минуты Произвел отладку, но ничего интересного для моего уровня развития не обнаружил Вот проект, где при нажатии на Parallelepiped вылетает приложение - https://yadi.sk/d/5Qn0L2Dvn2zPoA А вот видео с отладки - https://yadi.sk/i/AI19rRMeyFl22w Немного о видео: Когда началось выполнение mousePressEvent я нажал на Parallelepiped. Далее идем по строчкам, потом вылезает уведомление о том, что система отправила закрытые приложения и все...
0
|
284 / 173 / 62
Регистрация: 13.03.2019
Сообщений: 419
|
|
03.07.2019, 12:01 | 8 |
Обычно, в таких случаях, я комменчу весь свой код, оставляю только вызов родительского метода и начинаю разбираться по шагам.
Добавлено через 1 минуту Возможно, что краш происходит не в обработчике события, а в слоте, который привязан к сигналу PressParallelepiped()
0
|
6 / 3 / 0
Регистрация: 04.05.2018
Сообщений: 407
|
|
03.07.2019, 12:26 [ТС] | 9 |
Анна по жизни, Поставил точку остановы на слоте, и выдало вот это - https://yadi.sk/i/TfFUMF2qLsT7KQ
0
|
284 / 173 / 62
Регистрация: 13.03.2019
Сообщений: 419
|
|
03.07.2019, 12:39 | 10 |
Это значит, где-то есть обращение к неинциализированному указателю.
0
|
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|||||||||||
03.07.2019, 13:33 | 11 | ||||||||||
MetMark, ну совсем же детская ошибка. У вас члены класса остаются неинициализированными, потому что в конструкторе используются локальные копии. А когда в методе ShowChooseParallelepiped идет к членам класса обращение, то происходит падение.
В конструкторе вот это:
0
|
Анна по жизни
|
03.07.2019, 13:45
#12
|
Не по теме: DrOffset, к слову о вреде копипаста. :)
0
|
6 / 3 / 0
Регистрация: 04.05.2018
Сообщений: 407
|
|
03.07.2019, 14:09 [ТС] | 13 |
DrOffset, Кхым, заменил в mainwindow.cpp, но также крашится прога. А чем эти записи отличаются?
P.S. Не, все норм. Я просто тут дописывал код и не заметил еще подобный указатель переписать
0
|
284 / 173 / 62
Регистрация: 13.03.2019
Сообщений: 419
|
|||||||||||
03.07.2019, 15:00 | 14 | ||||||||||
Все переменные, которые ты объявляешь при объявлении класса,
.
Если ты определяешь переменную (стековую) в теле функции (конструктора, дeструктора, метода), то время жизни этой переменной ровно до конца тела функции. Если ты определишь переменную внутри фигурных скобок, то она и будет существовать только в пределах этих скобок. В твоём случае вышло, что ты сперва объявил "долгоиграющие" переменные в классе (честно говоря, я вечером только исправила ошибки компиляции, а на код вообще не смотрела), а потом в конструкторе ещё раз объявил стековые переменные с такими же именами. Стековые переменные проинициализировались с помощью new и благополучно сдохли по окончании выполнения конструктора. А комплект переменных-членов класса остался непроинициализированным, что и привело к крашу.
1
|
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
03.07.2019, 15:02 | 15 |
Тем, что в вашем случае значения указателей записывались в локальные переменные одноименные с полями класса, но сами поля класса оставались в неопределенном состоянии.
В остальных функциях использовались именно поля класса, но, поскольку они в неопределенном состоянии, программа вылетала. А я вам посоветовал значения указателей сразу записывать в поля класса, а не в локальные переменные. Вообще, если приходится объяснять такие вещи, то явно что-то не так с вашей базовой подготовкой в С++. Возможно стоит оставить на время Qt и повторить основы.
0
|
6 / 3 / 0
Регистрация: 04.05.2018
Сообщений: 407
|
||||||
03.07.2019, 19:04 [ТС] | 16 | |||||
Анна по жизни, Шикарное объяснение! Спасибо большое, все понял, такого больше не повториться!
Тогда у меня немного другой вопрос не по теме.
0
|
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
03.07.2019, 19:17 | 17 |
Я вас не упрекал. Просто Qt требует хорошее знание С++, а у вас в некоторых местах оно хромает. Поэтому вам же будет проще впоследствии, если вы приостановите на время свою практику и чуть-чуть повторите теорию.
0
|
6 / 3 / 0
Регистрация: 04.05.2018
Сообщений: 407
|
|
03.07.2019, 19:28 [ТС] | 18 |
Приостанавливать не думаю что стоит, все лето впереди, нужно как можно больше знаний получать и обрабатывать своим маленьким мозгом, но к вашему предложению я прислушаюсь и теорию подучу, повторю, возможно открою для себя что-то новое. Просто на практике запоминается намного лучше, нежели простое чтение книги
0
|
03.07.2019, 19:28 | |
03.07.2019, 19:28 | |
Помогаю со студенческими работами здесь
18
Ошибка при создании скрипта для входа Ошибка при создании категорий для статей. Ошибка при создании поиска для документа xml Ошибка при создании приложения для настольных и мобильных устройств Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |