Russian Qt Forum
Май 05, 2024, 15:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не могу разобраться с ошибкой: conversion from 'QCharRef' to non-scalar type 'QS  (Прочитано 5809 раз)
Baiola
Гость
« : Декабрь 23, 2014, 19:03 »

Сама ошибка "C:\Qt\Projects\MainWindow\mymainwindow.cpp:43: ошибка: conversion from 'QCharRef' to non-scalar type 'QString' requested
         QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];"

mymainwindow.cpp
Код:
#include "mymainwindow.h"
#include "ui_mymainwindow.h"
#include <QMessageBox>
#include <QPushButton>
#include <QDebug>
#include <qmath.h>

MyMainWindow::MyMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MyMainWindow)
{
    ui->setupUi(this);
    ui->comboBox->addItem("-");
    ui->comboBox->addItem("sin");
    ui->comboBox->addItem("cos");
    ui->comboBox->addItem("ln");
    ui->comboBox->addItem("x²");
    ui->comboBox->addItem("√x");
}

MyMainWindow::~MyMainWindow()
{
    delete ui;
}

void MyMainWindow::on_Exit_triggered()
{
    close();
}

void MyMainWindow::on_Author_triggered()
{
    QMessageBox msg;
    msg.setWindowTitle("Автор");
    msg.setText("M-134 Вайс Илья");
    msg.exec();
}

void MyMainWindow::on_Button0_clicked()
{
    if (ui->lineEdit->text() != "0")
    {
        QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1]; // в строчках такого рода - ошибки
        if (str != ")")
            ui->lineEdit->setText(ui->lineEdit->text() + "0");
        else
            ui->lineEdit->setText(ui->lineEdit->text() + "*0");
    }
}

void MyMainWindow::on_Button1_clicked()
{
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (str != ")")
        ui->lineEdit->setText(ui->lineEdit->text() + "1");
    else
        ui->lineEdit->setText(ui->lineEdit->text() + "*1");
}

void MyMainWindow::on_Button2_clicked()
{
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (str != ")")
        ui->lineEdit->setText(ui->lineEdit->text() + "2");
    else
        ui->lineEdit->setText(ui->lineEdit->text() + "*2");
}

void MyMainWindow::on_Button3_clicked()
{
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (str != ")")
        ui->lineEdit->setText(ui->lineEdit->text() + "3");
    else
        ui->lineEdit->setText(ui->lineEdit->text() + "*3");
}

void MyMainWindow::on_Button4_clicked()
{
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (str != ")")
        ui->lineEdit->setText(ui->lineEdit->text() + "4");
    else
        ui->lineEdit->setText(ui->lineEdit->text() + "*4");
}

void MyMainWindow::on_Button5_clicked()
{
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (str != ")")
        ui->lineEdit->setText(ui->lineEdit->text() + "5");
    else
        ui->lineEdit->setText(ui->lineEdit->text() + "*5");
}

void MyMainWindow::on_Button6_clicked()
{
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (str != ")")
        ui->lineEdit->setText(ui->lineEdit->text() + "6");
    else
        ui->lineEdit->setText(ui->lineEdit->text() + "*6");
}

void MyMainWindow::on_Button7_clicked()
{
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (str != ")")
        ui->lineEdit->setText(ui->lineEdit->text() + "7");
    else
        ui->lineEdit->setText(ui->lineEdit->text() + "*7");
}

void MyMainWindow::on_Button8_clicked()
{
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (str != ")")
        ui->lineEdit->setText(ui->lineEdit->text() + "8");
    else
        ui->lineEdit->setText(ui->lineEdit->text() + "*8");
}

void MyMainWindow::on_Button9_clicked()
{
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (str != ")")
        ui->lineEdit->setText(ui->lineEdit->text() + "9");
    else
        ui->lineEdit->setText(ui->lineEdit->text() + "*9");
}

void MyMainWindow::on_Plus_clicked()
{
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (str != "+" && str != "-" && str != "*" && str != "/" && ui->lineEdit->text() != "" && str != ".")
    {
        ui->lineEdit->setText(ui->lineEdit->text() + "+");
    }
}

void MyMainWindow::on_Minus_clicked()
{
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (str != "+" && str != "-" && str != "*" && str != "/" && str != ".")
    {
        ui->lineEdit->setText(ui->lineEdit->text() + "-");
    }
}

void MyMainWindow::on_Multiply_clicked()
{
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (str != "+" && str != "-" && str != "*" && str != "/" && ui->lineEdit->text() != "" && str != ".")
    {
        ui->lineEdit->setText(ui->lineEdit->text() + "*");
    }
}

void MyMainWindow::on_Divide_clicked()
{
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (str != "+" && str != "-" && str != "*" && str != "/" && ui->lineEdit->text() != "" && str != ".")
    {
        ui->lineEdit->setText(ui->lineEdit->text() + "/");
    }
}

void MyMainWindow::on_Equally_clicked()
{
    if (ExceptionHandling())
    {
        QString str = ProcessingStr();
        if (str == "inf")
        {
            QMessageBox msg;
            msg.setWindowTitle("Ошибка");
            msg.setText("Нельзя делить на ноль");
            msg.exec();
        }
        else
        {
            QString condition = ui->comboBox->currentText();

            if (condition == "sin")
                str = QString::number(qSin(str.toFloat()));
            if (condition == "cos")
                str = QString::number(qCos(str.toFloat()));
            if (condition == "ln")
                str = QString::number(qLn(str.toFloat()));
            if (condition == "x²")
                str = QString::number(qPow(str.toFloat(), 2));
            if (condition == "√x")
                str = QString::number(qSqrt(str.toFloat()));

            if (str == "nan")
            {
                QMessageBox msg;
                msg.setWindowTitle("Ошибка");
                msg.setText("Нельзя извлечь вещественный корень или логарифм из отрицательного числа");
                msg.exec();
            }
            else if (str == "-inf")
            {
                QMessageBox msg;
                msg.setWindowTitle("Ошибка");
                msg.setText("Нельзя извлечь логарифм из нуля");
                msg.exec();
            }
            else
                ui->lineEdit->setText(str);
        }
    }
}

void MyMainWindow::on_Point_clicked()
{
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (str != ".")
    {
        QString str1 = ui->lineEdit->text();
        if (str1.isEmpty() || str == "+" || str == "-" || str == "*" || str == "/")
            ui->lineEdit->setText(ui->lineEdit->text() + "0.");
        else if (str == "(" || str == ")")
            ui->lineEdit->setText(ui->lineEdit->text() + "*0.");
        else
            ui->lineEdit->setText(ui->lineEdit->text() + ".");
    }
}

void MyMainWindow::on_Bracket_clicked()
{
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (ui->lineEdit->text() == "" || str == "(" || str == "+" || str == "-" || str == "*" || str == "/" && str != ".")
    {
        opBr++;
        ui->lineEdit->setText(ui->lineEdit->text() + "(");
    }
    else if ((str == ")" && opBr == clBr) || ((str.toInt() || str == "0") && opBr == clBr) && str != ".")
    {
        opBr++;
        ui->lineEdit->setText(ui->lineEdit->text() + "*(");
    }
    else
    {
        if (str != ".")
        {
            clBr++;
            ui->lineEdit->setText(ui->lineEdit->text() + ")");
        }
    }
}

void MyMainWindow::on_Clear_clicked()
{
    opBr = 0;
    clBr = 0;
    ui->lineEdit->setText("");
}

void MyMainWindow::on_Back_clicked()
{
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (str == "(")
        opBr--;
    if (str == ")")
        clBr--;
    ui->lineEdit->setText(ui->lineEdit->text().remove(ui->lineEdit->text().size()-1, 1));
}

// ошибки
bool MyMainWindow::ExceptionHandling ()
{
    bool ret = true;
    QString str = ui->lineEdit->text()[ui->lineEdit->text().size()-1];
    if (str == "+" || str == "-" || str =="*" || str == "/")
    {
        ret = false;
        QMessageBox msg;
        msg.setWindowTitle("Ошибка");
        msg.setText("Последний символ должен быть цифрой");
        msg.exec();
    }

    /*QRegExp rx("/0");   // исправить
    if (rx.indexIn(ui->lineEdit->text()) != -1)
    {
        ret = false;
        QMessageBox msg;
        msg.setWindowTitle("Ошибка");
        msg.setText("Нельзя делить на ноль");
        msg.exec();
    }*/
    if (opBr != clBr)
    {
        ret = false;
        QMessageBox msg;
        msg.setWindowTitle("Ошибка");
        msg.setText("Не все скобки закрыты");
        msg.exec();
    }

    return ret;
}

// скобки
QString MyMainWindow::ProcessingStr ()
{
    QString str = ui->lineEdit->text();
    QRegExp rxMain("[-|+|*|/|)|(]");

    while (rxMain.indexIn(str) != -1)
    {
        //qDebug() << str;    // подробное решение
        QRegExp rx("[)]");
        if (rx.indexIn(str) == -1)
            return Analysis(str);
        else
        {
            for (int i = rx.indexIn(str); i >= 0; i--)
            {
                QString symb = ui->lineEdit->text()[i];
                if (symb == "(")
                {
                    QString str1 = (str).mid(i+1, rx.indexIn(str)-i-1);
                    str.replace(i, rx.indexIn(str)-i+1, Analysis(str1));
                }
            }
        }
    }
    return str;
}

// само выражение
QString MyMainWindow::Analysis(QString data)
{
    //qDebug() << data;
    QRegExp val1("[-|/|*|+|)|(]");
    QStringList list1 = data.split(val1, QString::SkipEmptyParts);  // цифры
    QRegExp val2("[0|1|2|3|4|5|6|7|8|9|.|)|(]");
    QStringList list2 = data.split(val2, QString::SkipEmptyParts);    // знаки

    QString str = ui->lineEdit->text()[0];
    if (str == "-")
    {
        list1.insert(0, 0);
    }

    for(int i = 0; i < list2.count();)
    {
        if (list2[i] == "*" || list2[i] == "/")
        {
            float f;
            if (list2[i] == "*")
            {
                f = list1[i].toFloat()*list1[i+1].toFloat();
            }
            if (list2[i] == "/")
            {
                f = list1[i].toFloat()/list1[i+1].toFloat();
            }
            list1.erase(list1.begin() + i);
            list1.erase(list1.begin() + i);
            list2.erase(list2.begin() + i);
            list1.insert(i, QString::number(f));
        }
        else
            i++;
    }

    for (int i = 0; i < list2.count();)
    {
        if (list2[i] == "+" || list2[i] == "-")
        {
            float f;
            if (list2[i] == "+")
            {
                f = list1[i].toFloat()+list1[i+1].toFloat();
            }
            if (list2[i] == "-")
            {
                f = list1[i].toFloat()-list1[i+1].toFloat();
            }
            list1.erase(list1.begin() + i);
            list1.erase(list1.begin() + i);
            list2.erase(list2.begin() + i);
            list1.insert(i, QString::number(f));
        }
        else
            i++;
    }
    return list1[0];
}

mymainwindow.h

Код:
#ifndef MYMAINWINDOW_H
#define MYMAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MyMainWindow;
}

class MyMainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MyMainWindow(QWidget *parent = 0);
    ~MyMainWindow();
    QString operStr;
    float operFloat = 0;
    /*enum e_stat
    {
        plus,
        minus,
        multiply,
        divide,
        none
    };
    e_stat stat = none;*/

    int opBr = 0;
    int clBr = 0;

private slots:
    void on_Exit_triggered();
    void on_Author_triggered();

    void on_Button0_clicked();
    void on_Button1_clicked();
    void on_Button2_clicked();
    void on_Button3_clicked();
    void on_Button4_clicked();
    void on_Button5_clicked();
    void on_Button6_clicked();
    void on_Button7_clicked();
    void on_Button8_clicked();
    void on_Button9_clicked();

    void on_Plus_clicked();
    void on_Minus_clicked();
    void on_Multiply_clicked();
    void on_Divide_clicked();
    void on_Point_clicked();
    void on_Bracket_clicked();

    void on_Equally_clicked();
    void on_Clear_clicked();
    void on_Back_clicked();

    bool ExceptionHandling ();
    QString ProcessingStr ();
    QString Analysis (QString data);

private:
    Ui::MyMainWindow *ui;
};

#endif // MYMAINWINDOW_H
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Декабрь 23, 2014, 19:15 »

Вместо [] используйте .at():
Код:
int i = ui->lineEdit->text().size() - 1;
QString str = ui->lineEdit->text().at(i);
« Последнее редактирование: Декабрь 23, 2014, 19:19 от gil9red » Записан

Baiola
Гость
« Ответ #2 : Декабрь 23, 2014, 19:27 »

Спасибо, а вот с таким что можно сделать?
Код:
for (int i = rx.indexIn(str); i >= 0; i--)
            {

                QString symb = ui->lineEdit->text()[i];
                if (symb == "(")
                {
                    QString str1 = (str).mid(i+1, rx.indexIn(str)-i-1);
                    str.replace(i, rx.indexIn(str)-i+1, Analysis(str1));
                }
            }
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #3 : Декабрь 23, 2014, 19:36 »

Код
C++ (Qt)
QChar symb = ui->lineEdit->text().at(i);
if (symb == '(')
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.098 секунд. Запросов: 23.