Определение объема не сжатого аудио-файла по данным: количеству каналов, глубине кодирования, частоте дискретизации и времени звучания.

  • Постановка задачи
  • Написать приложение в окне которого используются группы (QGroupBox) переключателей QRadioButton, кнопки, однострочное текстовое поле ввода и метки, одна из которых используется для вывода результата. Для компоновки виджетов в окне использовать табличную (матричную) компоновку QGridLayout. Для форматирования вывода использовать разметку HTML.

  • Внешний вид приложения
  • 1 2

  • Файл widget.h
  • #ifndef WIDGET_H
    #define WIDGET_H
    #include <QGroupBox>
    #include <QGridLayout>
    #include <QVBoxLayout>
    #include <QHBoxLayout>
    #include <QRadioButton>
    #include <QPushButton>
    #include <QLabel>
    #include <QLineEdit>
    
    class Widget : public QWidget
    {
        Q_OBJECT
        
    public:
        explicit Widget(QWidget *parent = 0);
        
    private:
        QGroupBox *groupBox1;
        QGroupBox *groupBox2;
        QGroupBox *groupBox3;
        QGroupBox *groupBox4;
        QGroupBox *groupBox5;
        QGroupBox *groupBox6;
        QGridLayout *grid;
        QVBoxLayout *vbox1;
        QVBoxLayout *vbox2;
        QVBoxLayout *vbox3;
        QHBoxLayout *hbox4;
        QVBoxLayout *vbox5;
        QHBoxLayout *hbox6;
        QLineEdit *ledit;
        QRadioButton *radio1;
        QRadioButton *radio2;
        QRadioButton *radio3;
        QRadioButton *radio4;
        QRadioButton *radio5;
        QRadioButton *radio6;
        QRadioButton *radio7;
        QRadioButton *radio8;
        QLabel *lbl1;
        QLabel *lbl2;
        QLabel *lbl1_2;
        QPushButton *exitb;
        QPushButton *okb;
    
    private slots:
        void res();
    
    
    };
    
    #endif // WIDGET_H
    
  • Файл widget.cpp
  • #include "widget.h"
    #include <QString>
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent)
    {
        grid = new QGridLayout(this);
        // Содержимое ячеек
        groupBox1 = new QGroupBox(tr("f"),this);
        groupBox2 = new QGroupBox(tr("nu"),this);
        groupBox3 = new QGroupBox(tr("n"),this);
        groupBox4 = new QGroupBox(tr(""),this);
        groupBox5 = new QGroupBox(tr("Input"),this);
        groupBox6 = new QGroupBox(tr(""),this);
        // Размещаем элементы в таблице 3 х 2
        grid->addWidget(groupBox1,0,0);
        grid->addWidget(groupBox2,1,0);
        grid->addWidget(groupBox3,2,0);
        grid->addWidget(groupBox4,0,1);
        grid->addWidget(groupBox5,1,1);
        grid->addWidget(groupBox6,2,1);
        setLayout(grid);
        // Создаем заголовок окна
        setWindowTitle(tr("File Size"));
    
        // Первая группа
        radio1 = new QRadioButton(tr("11"),this);
        radio2 = new QRadioButton(tr("22.05"),this);
        radio3 = new QRadioButton(tr("44.1"),this);
        // Выбор переключателя по умолчанию
        radio3->setChecked(true);
        // Вертикальная компоновка внутри
        vbox1 = new QVBoxLayout(this);
        vbox1->addWidget(radio1);
        vbox1->addWidget(radio2);
        vbox1->addWidget(radio3);
        groupBox1->setLayout(vbox1);
    
    
        // Вторая группа; по тому же принципу
        radio4 = new QRadioButton(tr("8"),this);
        radio5 = new QRadioButton(tr("16"),this);
        radio6 = new QRadioButton(tr("32"),this);
        // Выбор переключателя по умолчанию
        radio5->setChecked(true);
        // Вертикальная компоновка внутри
        vbox2 = new QVBoxLayout(this);
        vbox2->addWidget(radio4);
        vbox2->addWidget(radio5);
        vbox2->addWidget(radio6);
        groupBox2->setLayout(vbox2);
    
        // Третья группа
        radio7 = new QRadioButton(tr("1"),this);
        radio8 = new QRadioButton(tr("2"),this);
        // Выбор переключателя по умолчанию
        radio8->setChecked(true);
        // Вертикальная компоновка внутри
        vbox3 = new QVBoxLayout(this);
        vbox3->addWidget(radio7);
        vbox3->addWidget(radio8);
        groupBox3->setLayout(vbox3);
    
        // Четвертая
        lbl1 = new QLabel("t = ",this);
        lbl1_2 = new QLabel(" min",this);
        ledit = new QLineEdit(this);
        // Горизонтальная компоновка внутри
        hbox4 = new QHBoxLayout(this);
        hbox4->addWidget(lbl1);
        hbox4->addWidget(ledit);
        hbox4->addWidget(lbl1_2);
        groupBox4->setLayout(hbox4);
    
        // Пятая
        lbl2 = new QLabel(this);
        // Вертикальная компоновка внутри
        vbox5 = new QVBoxLayout(this);
        vbox5->addWidget(lbl2);
        groupBox5->setLayout(vbox5);
    
        // Шестая
        exitb = new QPushButton(tr("Exit"),this);
        okb = new QPushButton(tr("Calculate"),this);
        // Горизонтальная компоновка внутри
        hbox6 = new QHBoxLayout(this);
        hbox6->addWidget(okb);
        hbox6->addWidget(exitb);
        groupBox6->setLayout(hbox6);
    
        // Сигналы
        connect(okb,SIGNAL(clicked()),this,SLOT(res()));
        connect(exitb, SIGNAL(clicked()), this, SLOT(close()));
    
    
    }
    // Функция слота (обработка события)
    void Widget::res(){
        QString string = ledit->text();
        double nu, n, f, i;
        bool ok;
        double t = string.toDouble(&ok);
    
        // Определяем выбранные радиокнопки
        if (radio1->isChecked()){
            f = 11.0;
        } else if(radio2->isChecked()) {
            f = 22.05;
        } else {
            f = 44.1;
        }
        if (radio4->isChecked()){
            nu = 8.0;
        } else if(radio5->isChecked()) {
            nu = 16.0;
        } else {
            nu = 32.0;
        }
        if (radio7->isChecked()){
            n = 1.0;
        } else {
            n = 2.0;
        }
    
        // Вычисление объема файла в Мегабайтах
        i = f * 1000 * nu * t * n * 60 / 8 / 1024 / 1024;
        // Если введено число, то выводим результат,
        // иначе сообщаем об ошибке
        if (ok!=0) {
            string.setNum(i);
        // Используем HTML-форматирование
            lbl2->setText("<center><b><i>i</i></b> = " + string + " MiB</center>");
        } else {
            lbl2->setText("<center><b><font color=\"red\">FALSE</font></b></center>");
        }
    
    }
    
  • Файлы проекта
  • style

  • Постановка задачи для самостоятельной работы
  • Написать приложение в котором используется HTML-форматирование и/или QSS. В приложении используются виджеты QRadioButton, QPushButton, QLabel, QLineEdit и табличная компоновка. Таким приложением может являться программа, вычисляющая сопротивление электрической цепи, состоящей из двух сопротивлений. Резисторы могут быть соединены последовательно и параллельно. Выводить значение в килоомах (опционально, с помощью QCheckBox).

  • Ссылки

Добавить комментарий