среда, 16 февраля 2011 г.

Обзор некоторых классов (часть 1)

Итак, наконец настало время более детально изучить возможности разработанных классов, применяемых непосредственно в коде.
Если Вы читаете эту статью, то предполагается, что Вы уже ознакомились со средой программирования Qt Creator и можете создать простейшее приложение с обработкой событий.
В данной статье мы изучим класс QString.
Ну чтож, давайте сразу приступим к делу.
Для начала создадим новый проект и назовем его calculator.
Добавим несколько элементов, и изменим параметры инициализации, как показано на рисунке.

Для левого QLineEdit выставьте значение Name равным num1.
Для среднего QLineEdit выставьте значение Name равным num2.
Для правого QLineEdit выставьте значение Name равным result.
Как Вы уже догадались, в этом примере мы будем делать калькулятор. Калькулятор специально упрощен, ведь главная наша задача не заниматься писаниной алгоритмов (это Вы и так умеете), а рассмотреть необходимые классы.
Итак, по нажатию какой-либо из 6-ти кнопок у нас будет происходить какое-либо событие.
Давайте перейдем к обработке события сложения. Для этого щелкните правой кнопкой на кнопку с надписью "+" и выберите "перейти к слоту", затем в списке сигналов выберите "clicked()" и нажмите "Ок".
Для того, чтобы сложить два числа, нам нужно взять два числа: число из поля num1 и число из поля num2 и результат их сложения поместить в поле result.
Чтобы обратиться к числу (тексту), введенному в какое-либо из полей, нужно использовать метод text(), определенный внутри каждого экземпляра класса QLineEdit.
Метод text() возвращает тип QString(), где слово String переводится как "Строка", т.е. мы получаем строковое значение. Верно предположить, что если мы сложим две строки, то мы получим строку, а не арифметическое сложение чисел, записанных в этой строке.
Чтобы убедиться в этом, попробуем сложить две строки.
В обработке события "нажатие на кнопку +" поместите следующий код:
ui->result->setText(ui->num1->text()+ui->num2->text());
Запустите приложение, и попробуйте ввести в первые два поля и нажать "+"
Результат будет следующим:
Таким образом реализуется сложение строк.
Но, все-таки давайте вернемся к нашему примеру.
Нам необходимо сложить два числа, для этого нужно как-то "распознать" в строке число.
В любом экземпляре класса QString есть метод toInt()  (toDouble(), toFloat(), toLong(),toShot() и т.д.), предназначенный для конвертирования строки в число.
Давайте им и воспользуемся.
Напишем небольшой код:
int num1 = ui->num1->text().toInt(); //получаем число из первого поля
int num2 = ui->num2->text().toInt(); //получаем число из второго поля
int result = num1 + num2; //складываем и записываем результат
ui->result->setText(result); //задаем текст равным результату
Данный код не cкомпилируется, по причине того, что метод setText() использует тип QString, и не может использовать тип int.
Нам необходимо cконвертировать число обратно в текст.
Для этого существует статичный метод класса QString, названный number.
Использование:
QString res = QString::number(result); //записали в строковую переменную значение результата
Итак, конечный код должен выглядеть следующим образом:
Если Вы запустите приложение, то убедитесь, что оно складывает:
Код получился немного громоздким, и с лишними выделениями памяти, поэтому давайте его сократим до одной строчки.
ui->result->setText(QString::number(ui->num1->text().toInt() + ui->num2->text().toInt()));
Попробуйте сами написать обработку события для кнопок "*", "-", "/"
Код для самопроверки представлен ниже:
result->setText(QString::number(ui->num1->text().toInt() * ui->num2->text().toInt()));
ui->result->setText(QString::number(ui->num1->text().toInt() - ui->num2->text().toInt()));
ui->result->setText(QString::number(ui->num1->text().toInt() / ui->num2->text().toInt()));
  • Заметьте, что деление будет работать не совсем корректно, т.к. мы используем целочисленный тип. Для корректной работы деления стоит использовать тип double.
Код:
ui->result->setText(QString::number(ui->num1->text().toDouble() / ui->num2->text().toDouble()));
Итак, я готов поздравить вас с неплохим результатом! Вы овладели всеми необходимыми методами преобразований строк в числа и обратно.
Кнопка "С" предназначена для стирания всех данных в полях.
Попробуйте написать код самостоятельно.
Код для самопроверки представлен ниже:
ui->num1->setText("");
ui->num2->setText("");
ui->result->setText("");
Так же Вы можете воспользоваться функцией clear();
ui->num1->clear();
ui->num2->clear();
ui->result->clear();
Осталось написать обработку для одной кнопки "!". Эта кнопка будет вычислять факториал для первого числа.
Давайте напишем простенький алгоритм для этого:
int stop = ui->num1->text().toInt();
int result = 1;
for(int i=1;i<stop+1;i++)
  result*=i;
ui->result->setText(QString::number(result));
Если Вы запустите проект и попробуете сосчитать факториал, то увидите, что всё отлично работает:
Можете похвалить себя: Вы уже можете написать простенькое GUI приложение!
В следующей статье мы продолжим знакомство с классами Qt.

7 комментариев:

  1. Написал бы что за объект ui и зачем он нужен. Вообще как ты считаешь в чём выгода создавать интерфейс отдельно, кроме того что в дизайнере удобнее шлёпать кнопки?

    ОтветитьУдалить
  2. у вас очень ценный блог! желаю вам хорошего и быстрого развития :)

    ОтветитьУдалить
  3. Лёва, в прошлой статье я упомянул что ui - это User Interface, т.е. это фактически наше окно формы.
    На счет второго вопроса могу сказать следующее: если я правильно Вас понял, то Вы спрашивали какой смысл создавать графические объекты непосредственно в коде.
    Могу сказать следующее - способ задания графических объектов зависит от постановленной задачи. Если Ваша задача требует для массива каких-нибудь объектов создать определенные кнопки с полями для ввода, или новое окно, то такую задачу невозможно решить средствами дизайнера.
    Если задача не предполагает изменений в интерфейсе - то я всеми руками за использование средств дизайнера. Автоматизация - это двигатель прогресса, запомните мои слова :)
    Есть некоторые фанаты описывать всё в коде, не советую их трогать, но так же не советую следовать за ними) Конечно, хороший программист должен знать как всё устроено, но тратить время на то, что можно сделать в пару щелчков - самое неблагородное занятие.

    ОтветитьУдалить
  4. Helper, Большое спасибо за развернутый ответ. Я кстати сам всё в коде расписываю...

    ОтветитьУдалить
  5. Лёва, это Ваш выбор. Каждый поступает как ему удобнее :)
    Моё дело - только посоветовать.

    ОтветитьУдалить