Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
6 / 3 / 0
Регистрация: 04.05.2018
Сообщений: 407
1

Ошибка при создании сигнала для нажатие на виджет

02.07.2019, 22:11. Показов 841. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дорой ночи. Сидел писал код, все было прекрасно, а потом ни с того ни с сего куча ошибок, и я не понимаю ни капли в чем проблема... Кода довольно много, по этому скину файлом. Подскажу куда рыть:
draftsmanparallepiped.cpp - обьявлен метод virtual void mousePressEvent(QMouseEvent *).
mainwindow.h - создаю указатели и именно указатель DraftsmanParallelepiped *Parallelepiped приводит к ошибке.
mainwindow.cpp - реализую ранее обьявленый слот ShowChooseParallelepiped, там же конекчу сигнал со слотом и все... 20 ошибок.
Выручайте братцы, пожалуйста!
https://yadi.sk/d/9-p8M7usI8bvdg
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.07.2019, 22:11
Ответы с готовыми решениями:

При создании виджета, дочернего к QGLWidget, дочерний виджет не отображается
#include "class.h" #include <QApplication> #include <windows.h> #include <GL/glut.h> int...

Ошибка при создании дескриптора окна при динамическом создании кнопок
public Form1() { InitializeComponent(); } int height = 10;...

Ошибка при создании события для кнопки
Button bt1 = new Button(); bt1.Content = "Кнопка 2"; bt1.Width = 180;...

Ошибка при создании пароля для приложения
Всем привет, пытаюсь создать пароль на приложение по этой статье. Но выходит какая-то ошибка.

17
284 / 173 / 62
Регистрация: 13.03.2019
Сообщений: 419
03.07.2019, 00:18 2
У тебя полная неразбериха между классами MainWindow и DraftsmanParallelepiped

Один класс не может напрямую вызывать сигнал другого класса.
Так нельзя:
C++ (Qt)
1
2
3
void DraftsmanParallelepiped::mousePressEvent(QMouseEvent *){
    emit MainWindow::PressParallelepiped();
}
сигнал PressParallelepiped(), видимо, должен быть объявлен в DraftsmanParallelepiped.

Тогда так:
C++ (Qt)
1
2
3
4
void DraftsmanParallelepiped::mousePressEvent(QMouseEvent *event){
// pздесь сделай хоть какой-то анализ содержимого event как в документации или примерах
    emit PressParallelepiped();
}
Перенеси этот метод в draftsmanparallelepiped.cpp

2 из draftsmanparallelepiped.h убери #include "mainwindow.h"
Ты закольцевал недеры.

3. в mainwindow.h добавь #include "draftsmanparallelepiped.h"
Отсутствие этого хедера и ведёт к ругани на указатель.

4. Не
C++ (Qt)
1
   connect(Parallelepiped, &MainWindow::PressParallelepiped, this, &MainWindow::ShowChooseParallelepiped);
а

C++ (Qt)
1
    connect(Parallelepiped, &DraftsmanParallelepiped::PressParallelepiped, this, &MainWindow::ShowChooseParallelepiped);
0
6 / 3 / 0
Регистрация: 04.05.2018
Сообщений: 407
03.07.2019, 08:38  [ТС] 3
Анна по жизни, Сделал то, что вы написали и действительно помогло, спасибо большое!
Теперь другая проблема. При запуске программы все работает идеально, но после нажатия на Parallelepiped программа зависает и закрывается

Цитата Сообщение от Анна по жизни Посмотреть сообщение
здесь сделай хоть какой-то анализ содержимого event как в документации или примерах
У меня нет указателя *event. Посмотрел документацию и чего-то не нашел ничего связанное с анализом
0
284 / 173 / 62
Регистрация: 13.03.2019
Сообщений: 419
03.07.2019, 09:26 4
Цитата Сообщение от MetMark Посмотреть сообщение
У меня нет указателя *event.
Я имела в виду аргумент QMouseEvent *, который передаётся в метод mousePressEvent(QMouseEvent *).

The Event System
0
6 / 3 / 0
Регистрация: 04.05.2018
Сообщений: 407
03.07.2019, 09:52  [ТС] 5
Анна по жизни, Подключил в mainwindow.cpp
C++ (Qt)
1
#include <QMouseEvent>
Далее добавил проверку на нажатие левой кнопки мыши
C++ (Qt)
1
2
3
4
5
void DraftsmanParallelepiped::mousePressEvent(QMouseEvent *event){
    if (event->button() == Qt::LeftButton){
        emit DraftsmanParallelepiped::PressParallelepiped();
    }
}
Ошибок не выдает, но при нажатии на Widget программа зависает и вылетает...

После нажатия должна выполняться следующая строчка:
C++ (Qt)
1
connect(Parallelepiped, &DraftsmanParallelepiped::PressParallelepiped, this, &MainWindow::ShowChooseParallelepiped);
А потом слот:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
void MainWindow::ShowChooseParallelepiped(){
    Parallelepiped->hide(); //Hide figures
    Tetrahedron->hide();
    Cylinder->hide();
    Ball->hide();
    Cone->hide();
    Prism->hide();
 
    Cube->show(); //Show new figures
}
0
284 / 173 / 62
Регистрация: 13.03.2019
Сообщений: 419
03.07.2019, 10:11 6
Попробуй добавить вызов родительского обработчика событий, иначе ты не даёшь виджету обрабатывать события, не попадающие под твоё условие.

C++ (Qt)
1
2
3
4
5
6
7
void DraftsmanParallelepiped::mousePressEvent(QMouseEvent *event){
    if (event->button() == Qt::LeftButton){
        emit DraftsmanParallelepiped::PressParallelepiped();
    }
    else
       QWidget::mousePressEvent(event);
}
дальше, если не поможет, надо уже с отладчиком смотреть,

Добавлено через 2 минуты
У самого события есть методы ignore() и accept(), на которые надо обратить внимание.
0
6 / 3 / 0
Регистрация: 04.05.2018
Сообщений: 407
03.07.2019, 11:19  [ТС] 7
Анна по жизни, Не помогло(((
Дописал еще:
C++ (Qt)
1
event->accept();
вне условия, но никакого результата...

Добавлено через 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 идет к членам класса обращение, то происходит падение.

В конструкторе вот это:
C++
1
2
3
4
5
6
7
    DraftsmanParallelepiped *Parallelepiped = new DraftsmanParallelepiped(this); //Create pointers figures
    DraftsmanBall *Ball = new DraftsmanBall(this);
    DraftsmanCone *Cone = new DraftsmanCone(this);
    DraftsmanCylinder *Cylinder = new DraftsmanCylinder(this);
    DraftsmanPrism *Prism = new DraftsmanPrism(this);
    DraftsmanTetrahedron *Tetrahedron = new DraftsmanTetrahedron(this);
    DraftsmanCube *Cube = new DraftsmanCube(this);
Заменить на это:
C++
1
2
3
4
5
6
7
    Parallelepiped = new DraftsmanParallelepiped(this); //Create pointers figures
    Ball = new DraftsmanBall(this);
    Cone = new DraftsmanCone(this);
    Cylinder = new DraftsmanCylinder(this);
    Prism = new DraftsmanPrism(this);
    Tetrahedron = new DraftsmanTetrahedron(this);
    Cube = new DraftsmanCube(this);
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
Цитата Сообщение от MetMark Посмотреть сообщение
А чем эти записи отличаются?
Все переменные, которые ты объявляешь при объявлении класса,

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
class MyClass
{
public:
 void myMethod();
 
private:
// Я вот эти переменные имею в виду. Это члены класса
   int myVar1;
   bool myVar2;
};
создаются в момент создания экземпляра этого класса:

.
C++ (Qt)
1
2
3
4
5
6
.. // где-то в коде
MyClass *object1 = new MyClass(); // у jbject1 создались myVar1 и myVar2
 
// или так
 
MyClass jobject2; // у jbject2 создались myVar1 и myVar2
и разрушаются, когда разрушается экземпляр. object1 надо разрушить через delete, object2 сдохнет сам.


Если ты определяешь переменную (стековую) в теле функции (конструктора, дeструктора, метода), то время жизни этой переменной ровно до конца тела функции. Если ты определишь переменную внутри фигурных скобок, то она и будет существовать только в пределах этих скобок.

В твоём случае вышло, что ты сперва объявил "долгоиграющие" переменные в классе (честно говоря, я вечером только исправила ошибки компиляции, а на код вообще не смотрела), а потом в конструкторе ещё раз объявил стековые переменные с такими же именами. Стековые переменные проинициализировались с помощью new и благополучно сдохли по окончании выполнения конструктора. А комплект переменных-членов класса остался непроинициализированным, что и привело к крашу.
1
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
03.07.2019, 15:02 15
Цитата Сообщение от MetMark Посмотреть сообщение
А чем эти записи отличаются?
Тем, что в вашем случае значения указателей записывались в локальные переменные одноименные с полями класса, но сами поля класса оставались в неопределенном состоянии.
В остальных функциях использовались именно поля класса, но, поскольку они в неопределенном состоянии, программа вылетала.
А я вам посоветовал значения указателей сразу записывать в поля класса, а не в локальные переменные.

Вообще, если приходится объяснять такие вещи, то явно что-то не так с вашей базовой подготовкой в С++. Возможно стоит оставить на время Qt и повторить основы.
0
6 / 3 / 0
Регистрация: 04.05.2018
Сообщений: 407
03.07.2019, 19:04  [ТС] 16
Анна по жизни, Шикарное объяснение! Спасибо большое, все понял, такого больше не повториться!
Тогда у меня немного другой вопрос не по теме.
C++ (Qt)
1
2
3
4
ListWidget = new QListWidget(this);
ListWidget->addItem("first_Item"); //Можно ли как-то более коротко запихнуть n-ое кол-во item-ов в ListWidget или только так, как я пишу дальше?
ListWidget->addItem("Second_Item");
....
DrOffset, Мне 17 лет, учусь сам. Пишу приложение как раз для того, чтобы нагнать все то, что я не понял, не знал. Тем кто мне помогают я искренне благодарен, т.к. учителя у меня нет, да и знакомых программистов которые могли бы мне объяснить тоже нет....
0
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
03.07.2019, 19:17 17
Цитата Сообщение от MetMark Посмотреть сообщение
Мне 17 лет, учусь сам. Пишу приложение как раз для того, чтобы нагнать все то, что я не понял, не знал. Тем кто мне помогают я искренне благодарен, т.к. учителя у меня нет, да и знакомых программистов которые могли бы мне объяснить тоже нет....
Я вас не упрекал. Просто Qt требует хорошее знание С++, а у вас в некоторых местах оно хромает. Поэтому вам же будет проще впоследствии, если вы приостановите на время свою практику и чуть-чуть повторите теорию.
0
6 / 3 / 0
Регистрация: 04.05.2018
Сообщений: 407
03.07.2019, 19:28  [ТС] 18
Цитата Сообщение от DrOffset Посмотреть сообщение
Поэтому вам же будет проще впоследствии, если вы приостановите на время свою практику и чуть-чуть повторите теорию.
Приостанавливать не думаю что стоит, все лето впереди, нужно как можно больше знаний получать и обрабатывать своим маленьким мозгом, но к вашему предложению я прислушаюсь и теорию подучу, повторю, возможно открою для себя что-то новое. Просто на практике запоминается намного лучше, нежели простое чтение книги
0
03.07.2019, 19:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2019, 19:28
Помогаю со студенческими работами здесь

Ошибка при создании скрипта для входа
Добрый вечер. Хочу сделать для своего сайта вход, но никак не могу понять как правильно. &lt;?php ...

Ошибка при создании категорий для статей.
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in...

Ошибка при создании поиска для документа xml
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

Ошибка при создании приложения для настольных и мобильных устройств
Это баг или я что то не то делаю? watch?v=fyllheD35MQ


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru