Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
24 / 24 / 16
Регистрация: 01.11.2013
Сообщений: 196
1

Ошибка, если QString член класса

12.11.2014, 16:17. Показов 701. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Пишу калькулятор. Если в описании класса делаю QString членом класса, то ошибка:

Запускается C:\QT\example\build-untitled2-Desktop_Qt_5_3_MinGW_32bit-Debug\debug\untitled2.exe...
Программа неожиданно завершилась.
C:\QT\example\build-untitled2-Desktop_Qt_5_3_MinGW_32bit-Debug\debug\untitled2.exe завершился крахом

Так же на QLCDNumber не выводятся символы + / = * , но другие все выводятся.

Calc.H
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#ifndef CALC_H
#define CALC_H
 
#include <QGridLayout>
#include <QWidget>
#include <QStack>
#include <QPushButton>
#include <QLCDNumber>
 
 
class Calc : public QWidget
{
    Q_OBJECT
    QLCDNumber* lcd;
    QPushButton* btn;
    QStack<QString> stek;
    QString display;
public:
    Calc(QWidget* parent = 0);
    QPushButton* creatbutton(const QString& str);
 
public slots:
   void btnclicked();
 
};
 
#endif // CALC_H


Calc.cpp
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "Calc.h"
 
Calc::Calc(QWidget *parent):QWidget(parent)
{
     QChar knopki[4][4] = {{'7','8','9','/'},
                           {'4','5','6','*'},
                           {'1','2','3','-'},
                           {'0','.','=','+'}};
     QGridLayout* grid = new QGridLayout;
     QPushButton* btnCE = new QPushButton("CE");
     connect(btnCE,SIGNAL(clicked()),this,SLOT(btnclicked()));
     lcd = new QLCDNumber(12);
     lcd->setMinimumSize(150,50);
     grid->addWidget(lcd,0,0,1,4);
     grid->addWidget(btnCE,1,3,1,1);
     for (size_t i = 0 ; i < 4 ;i++)
         for (size_t j = 0 ; j < 4 ;j++)
            grid->addWidget(creatbutton(knopki[i][j]), i+2, j, 1, 1 );
     setLayout(grid);
}
 
QPushButton* Calc::creatbutton(const QString & str)
{
 QPushButton* btn = new QPushButton(str);
 btn->setMinimumSize(40,40);
 connect(btn,SIGNAL(clicked()),this,SLOT(btnclicked()));
 return btn;
}
 
void Calc::btnclicked()
{
    QString str;
    str = ((QPushButton*)sender())->text();
    display += str;
    lcd->display(display);
    if (str=="CE")
        lcd->display("0");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2014, 16:17
Ответы с готовыми решениями:

Функция-член Ошибка класса
Непонятная ошибка связанная с функцией-членом. Я в панике + почему-то не могу внести хедер с...

Ошибка: член класса QLineEdit
ошибка: 'class QLineEdit' has no member named 'str' a=ui-&gt;lineEdit-&gt;str.toAscii().data(); ...

Ошибка при записи в открытый член класса
Имеется ниже представленный класс. Создаю его экземпляр и хочу использовать в функции. В этой...

Создать рекурсивную функцию, определяющую n-ый член геометрической про* грессии, если известен первый член и знаменатель
Создать рекурсивную функцию, определяющую n-ый член геометрической про*грессии, если известен...

8
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
12.11.2014, 17:56 2
C++ (Qt)
1
QPushButton* btn;
удалите из хедера на всякий случай

C++ (Qt)
1
2
3
str = ((QPushButton*)sender())->text();
// на
str = qobject_cast<QPushButton*>(sender())->text();
1
24 / 24 / 16
Регистрация: 01.11.2013
Сообщений: 196
12.11.2014, 18:19  [ТС] 3
Сборку сменил с отладки на выпуск, и проблема в классе с QString решилась. Но почему же при отладке программа вылетает.
Почему на QLCDNumber не выводятся символы + / = * понял.

RazrFalcon, Спасибо, а почему преобразование типа лучше делать так? Делаю по книге М.Шлее Qt4.8, у него везде так как.
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
12.11.2014, 18:21 4
Цитата Сообщение от Mr_Progger Посмотреть сообщение
Но почему же при отладке программа вылетает.
Просто пересоберите ее. Возможно компилятор чюдит.

Цитата Сообщение от Mr_Progger Посмотреть сообщение
Почему на QLCDNumber не выводятся символы + / = * понял.
видимо он их не поддерживает

Цитата Сообщение от Mr_Progger Посмотреть сообщение
а почему преобразование типа лучше делать так
ваш способ - это C-стайл, такой не принято использовать в С++.
1
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
12.11.2014, 23:21 5
Цитата Сообщение от RazrFalcon Посмотреть сообщение
ваш способ - это C-стайл, такой не принято использовать в С++.
и чем
Цитата Сообщение от RazrFalcon Посмотреть сообщение
str = qobject_cast<QPushButton*>(sender())->text();
отличается от
Цитата Сообщение от RazrFalcon Посмотреть сообщение
str = qobject_cast<QPushButton*>(sender())->text();
?
В любом случае, если sender() не является кнопкой, то приложение упадет
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
12.11.2014, 23:41 6
gromo, фишка не в проверке sender на 0, а в использовании чисто C++, без С-примесей.
0
59 / 46 / 11
Регистрация: 16.09.2014
Сообщений: 124
13.11.2014, 00:28 7
Фишка не в использовании чисто С++ без примесей, фишка в том, что например dynamic_cast вернет nullptr если не сможет привести один тип к другому как вообщем и qobject_cast и нужно это все для безопасности.

правильно писать так:
C++ (Qt)
1
2
3
4
5
6
7
QPushButton *button = qobject_cast<QPushButton*>(sender());
if(!button ){
    qCritical() << "Bad cast";
    return;
}
str = button ->text();
...
иначе смысла никакого нету добавлять _cast
0
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
13.11.2014, 03:53 8
Pancir, qobject_cast не требует rtti в отличии от динамиккаст. И в коде о котором я говорил вообще нету проверки на ноль. Хватит и статиккаста
0
Поклонник Qt
314 / 210 / 41
Регистрация: 09.11.2013
Сообщений: 336
Записей в блоге: 1
13.11.2014, 04:07 9
Про касты можно почитать тут: http://habrahabr.ru/post/106294/
1
13.11.2014, 04:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2014, 04:07
Помогаю со студенческими работами здесь

Если объект константный, означает ли это, что ни один его член-элемент или член-метод не изменится?
Назрел такой вопрос: Если объект константный это означает, что ни один его член-элемент или...

Член-ссылка на другой член класса
Есть класс Dot с двумя членами - x и y. Требуется еще один класс, который хранит width i height, но...

Ошибка "функция-член класса не может быть повторно объявлена"
В заголовочном файле прототипы расписал. При реализации методов класса Rectangle ошибка ...

Член класса управляемый не может относиться к типу класса неуправляемый
Подскажите пожалуйста, что за ошибка &quot;Член класса управляемый не может относиться к типу класса...


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

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