Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2015, 20:37   #1
Thez
Пользователь
 
Регистрация: 23.02.2014
Сообщений: 27
По умолчанию Qt изменение текста label'ов

Здравствуйте,

На виджете есть 1 lineEdit, 1 кнопка и допустим 5 label'ов.
Как можно провернуть такое:

Пишем в lineEdit: "x=5", нажимаем на кнопку и текст первого label'а меняется на "х=5";
Потом пишем в lineEdit: "y=7", нажимаем на кнопку и текст уже второго label'а меняется на "y=7" и тд;
Потом если ввести в lineEdit: "х=10", то должен измениться текст не 3-его label'а, а первого, в котором уже было "х=5" на "х=10".

Программа уже разбивает левую часть от знака "=" и правую, и вот мне нужно только, чтоб, если левая часть ранее не встречалась, то изменить текст "нового" лабела на правую часть, если встречалась, то изменить текст в котором встретилась.

Не понятно мне именно как динамически указывать какой лабел должен измениться, помогите пожалуйста
Thez вне форума Ответить с цитированием
Старый 04.01.2015, 05:39   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Ну я не пойму в чем проблема.
Цитата:
чтоб, если левая часть ранее не встречалась
Очевидно тебе надо сохранять информацию о том, что уже встречалось.

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

Либо, например, хранить информацию о том, что встречалось в самих лэйблах. Кнопка передает сигнал первому лейблу, он смотрит встречалось ли в нем что-то - если не встречалось - передает сигнал дальше. Если встречалась - изменяет свой текст. Второй лэйбл связан не с сигналом кнопки, а с сигналом первого. Третий - со вторым и т.п.

Можно еще как-то крутануть это. Лично мне больше нравится второй вариант, т.к. в этом случае кнопка "не знает" сколько лэйблов есть и зависимости слабже...
rrrFer вне форума Ответить с цитированием
Старый 04.01.2015, 18:14   #3
Thez
Пользователь
 
Регистрация: 23.02.2014
Сообщений: 27
По умолчанию

И, снова, здравствуйте,

Немного дописал код и появилась проблемка.
Цитата:
Кнопка передает сигнал первому лейблу
Прошлый пример был немного упрощён, на деле кнопка запускает слот, который, в свою очередь, запускает функцию-не-член к базовому классу, которая запускает ещё несколько функций-не-членов, и одна из этих функций должна запустить паблик функцию-член MyWidget::label1(double d).
Но выскакивает ошибка "cannot call member function 'void MyWidget::label1(double)' without object", в гугле пишут, что нужно сделать функцию статической или указать объект. Но статическая функция отказывается использовать "ui->MyLabel1" и какой тут можно указать объект я тоже не знаю.
Может подскажете, как правильно использовать "ui->MyLabel1" из статической функции или как вообще иначе можно запустить MyWidget::label1(double d).

Код:
void MyWidget::label1(double d)
{
    QString q = ui->MyLabel1->text();
    if (q.isEmpty())
    {
        q=stringvalue+QString("=%1").arg(d);
        ui->MyLabel1->setText(q);
        ui->pushButton_2->setEnabled(true);
    }
    else
    {
        if (q.left(stringvalue.size())==stringvalue)
        {
            q=stringvalue+QString("=%1").arg(d);
            ui->MyLabel1->setText(q);
        }
        else
        {
            MyWidget::label2(d);
        }
    }
}
stringvalue - глобальная переменная типа QString и левая часть от знака "=".
В функцию передаётся double d - правая часть от знака "=".

В Qt нахожусь только первую неделю и просто пытаюсь в ней разобраться.

Последний раз редактировалось Thez; 04.01.2015 в 18:16.
Thez вне форума Ответить с цитированием
Старый 04.01.2015, 19:27   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
В Qt нахожусь только первую неделю и просто пытаюсь в ней разобраться.
Причем тут Qt? - разберись с С++ сначала.
Я не знаю что именно ты хочешь сделать, но это не альтернативы:
Цитата:
нужно сделать функцию статической или указать объект.
Цитата:
должна запустить паблик функцию-член MyWidget::label1(double d).
прочитай про статические функции.
Когда у тебя на форме лежит лейбл, то это конкретный лейбл (есть объект типа QLabel). Очевидно тебе надо взять этот объект и вызвать для него метод.
Статическая функция не связана ни с каким объектом. Мне кажется что ты делаешь что-то не так.

Какую задачу ты решаешь вообще? - подскажу как это ДОЛЖНО быть устроено, потому что ты явно делаешь что-то не так.
rrrFer вне форума Ответить с цитированием
Старый 04.01.2015, 21:20   #5
Thez
Пользователь
 
Регистрация: 23.02.2014
Сообщений: 27
По умолчанию

И вправду, совсем забыл о том, что у классов должны быть объекты.

Делаю простенький калькулятор с возможностью запоминать значения в переменных и отображать их в лабелах.

Пишем всё выражение в lineEdit нажимаем на кнопку или клавишу Enter, и выражение идёт в качестве аргумента по функциям. Результат выводится в textEdit.

глобальная переменная e - позиция курсора в выражении от lineEdit'а (наверно очень некрасиво так делать, но по-другому не додумался).

функция "double number(QString s)" - проверяет число или переменная. И, если переменная, то запоминает следующее выражение. Тут я и хотел, чтоб как только переменная и его значение появлялись, то сразу передавать эти значения в лабел.

Без лабелов всё работало правильно.

Моя наработка:
Код:
#include "mywidget.h"
#include "ui_mywidget.h"
#include <QtGui>

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    ui->textEdit->setReadOnly(true);

    QObject::connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(JustTry()));
}

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

double expr(QString s);
double term(QString s);
double minus(QString s);

int e;
std::map<QString, double> value;
QString stringvalue;

void MyWidget::JustTry()
{
    QString s;
    s = ui->MyLineEdit1->text();
    e=0;
    double x = expr(s);
    s=QString("%1").arg(x);
    ui->textEdit->setText(s);
}

void MyWidget::label1(double d)       // глупая попытка изменить лабел
{
    QString q = ui->MyLabel1->text();
    if (q.isEmpty())
    {
        q=stringvalue+QString("=%1").arg(d);
        ui->MyLabel1->setText(q);
        ui->pushButton_2->setEnabled(true);
    }
    else
    {
        if (q.left(stringvalue.size())==stringvalue)
        {
            q=stringvalue+QString("=%1").arg(d);
            ui->MyLabel1->setText(q);
        }
        else
        {
            MyWidget::label2(d);
        }
    }
}

void MyWidget::keyPressEvent(QKeyEvent *Event)
{
    switch (Event->key())
    {
        case Qt::Key_Return:
            JustTry();
            break;
    }
}

bool strvalue(QString s)
{
    QString res;
    for(;;)
    {
        if (s[e].isLetter())
        {
            while (s[e].isLetterOrNumber())
            {
                res+=s[e];
                e++;
            }
            stringvalue=res;
            return true;
        }
        else
        {
            return false;
        }
    }
}

double number(QString s)
{
    QString res;
    for(;;)
    {
    if (s[e]>='1' && s[e]<='9')
    {
        while (s[e]>='0' && s[e]<='9')
        {
            res+=s[e];
            e++;
        }
        e--;
        return res.toDouble();
     }
    else
    {
        if (strvalue(s)==true)
        {
            double& v=value[stringvalue];
            if (s[e]=='=')
            {
                e++;
                v=expr(s);
                MyWidget::label1(v);    // глупая попытка вызова здесь!
            } else e--;
            return v;
        }
        return 0;
    }
    }
}
Так как же правильно передать текст лабелам?
И, может, саму основу правильнее было бы иначе написать?

Последний раз редактировалось Thez; 04.01.2015 в 21:27.
Thez вне форума Ответить с цитированием
Старый 05.01.2015, 13:54   #6
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Функция "double number(QString s)" не нужна:

Код:
#include <QString>

int main()
{
    QString strNum = "256345.5";

    bool ok;
    double num = strNum.toDouble( &ok );

    if ( !ok )
    {
        qWarning( "Error: unable to convert a string to a number." );
        return 1;
    }

    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 05.01.2015, 17:34   #7
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Забыл написать, что для преобразования из числа в QString нужно использовать такую конструкцию:

Код:
#include <QString>
#include <QDebug>

int main()
{
    double num = 98478.75;

    QString strNum = QString::number( num );

    qDebug() << strNum;

    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 05.01.2015, 22:15   #8
Thez
Пользователь
 
Регистрация: 23.02.2014
Сообщений: 27
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
И всё таки вопрос был в другом.
Thez вне форума Ответить с цитированием
Старый 05.01.2015, 22:23   #9
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Я не понял вопрос. Вроде всё элементарно. Получили значения после нажатия, как тип QString. Преобразовали в double. Произвели операцию. Перевели результат в QString. Установили текст label'а с помощью метода setText(). Я не знал, что такую простую программу так можно накрутить и раздуть проблемы на пустом месте
8Observer8 вне форума Ответить с цитированием
Старый 05.01.2015, 22:59   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
глобальная переменная e - позиция курсора в выражении от lineEdit'а (наверно очень некрасиво так делать, но по-другому не додумался).
Загляни в документацию, у QLineEdit есть метод для получения позиции курсора:
Код:
int 	cursorPosition() const
Хранить эту позицию вообще не надо, т.к. если ты хранить ее еще где-то отдельно, то должен перехватывать событие изменения позиции и изменять глобальную переменную. А чего ради такая свистопляска, когда есть готовый метод?

Вообще какой-то ужасно сложный код.

Цитата:
Код:
double number(QString s)
В Qt есть готовые методы для этого. А в твоем коде знак числа не учитывается, как минимум. "-123" - это тоже число. Вроде бы возвращается double, но на дробном числе программа вроде бы должна упасть.

Зачем тебе столько одноколесных велосипедов?

Цитата:
MyWidget::label1(v); // глупая попытка вызова здесь!
Я все еще не могу понять чего ты хочешь сделать этой строкой, поэтому не могу ничем помочь.

Функция label у тебя принадлежит виджету. Я сходу не понимаю почему ты не можешь ее вызвать так:
Код:
label1(v);
Очень советую заглянуть в эту вводнейщую статью по Qt: Создание собственных виджетов Qt. Сигналы, слоты и события. . Мне кажется ты не делал бы то, что делаешь, если бы прочитал ее.
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение местонахождения Data Label гистограммы с помощью VBA Red Fox Microsoft Office Excel 1 24.10.2014 22:02
Динамическое изменение содержания текста Label. Возможно ли? Blame Microsoft Office Excel 5 10.12.2012 22:39
Label изменение стиля текста Zuba C++ Builder 2 06.05.2012 01:28
автоматическое изменение размер текста в label bbk_serg Компоненты Delphi 15 04.02.2011 00:46
изменение формата всех Label на UserForm Иван Иванович Microsoft Office Excel 1 01.12.2008 14:30