f
fen3derМамыр 29, 2018, 1:24 Т.Ж.

Struct в связке с Qt

Qt, C++, GUI, struct

Добрый день. На форме есть множество спинбоксов, значения из которых используются в расчетах. Хотел реализовать их использование через структуру, но правильно не знаю как реализовать. Создал я ее в классе A. Далее мне этим переменным надо присвоить спинбоксы с формы. Подскажите как реализовать это корректно? Форма выглядит следующим образом.

    struct InputData
    {
        double ro_oil;
        double ro_water;
        double ro_gas;
        double q_liquid;
        double q_vwater;
        double q_oil;
        double q_water;
        double p_overpressure;
        double g;
        double p_nas;
        double t;
        double mu;
        double q_gg;
    };

111111.PNG
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

6
Evgenii Legotckoi
  • Мамыр 29, 2018, 4:14 Т.Ж.

Добрый день.

Если бы это была запись из БД, то можно было бы не использовать структуру, а использовать QDataWidgetMapper .

А так, я бы создал переменную в диалоге с этой структурой и через слоты, которые подключены к сигналам изменения спинбоксов, менял бы значения тех переменных.

Подробнее о сигналах и слотах можете почитать в этой статье .

Вам конкретно какие-то моменты не ясны, например, как получить изменение значения в спинбоксе? или что-то иное?
    f
    • Мамыр 29, 2018, 4:26 Т.Ж.

    Сигналы и слоты я усвоил. Сейчас написана эта программа, но там все в куче и я хотел бы хоть как то структурировать и переписать ее основываясь на принципах ООП.

    Программа то не сложная: ввод данных->далее данные используются в формулах и по нажатию кнопки создается отчет с расчитанным результатом.
    Вот например, как написано сейчас, т.е вся реализация можно сказать в слоте нажатия кнопки, что противоречит ООП
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "calc_functions.h"
    #include "means_of_measurement.h"
    #include "about.h"
    #include <windows.h>
    
    #include <QDebug>
    #include <QVBoxLayout>
    #include <QFile>
    #include <QMessageBox>
    #include <QtPrintSupport>  // QPrinter
    #include <QFileDialog> // для диалога сохранения файла
    #include <QInputDialog> // для диалога сохранения файла
    #include <QPageLayout>
    #include <QPageSize>
    #include <QDesktopServices>
    #include <QMessageBox>
    
    //#include <QtCharts/QChartView>
    //#include <QtCharts/QLineSeries>
    //#include <QLineSeries>
    
    
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        m_WebEngineView = new QWebEngineView(ui->tabReport);
    
        QVBoxLayout* layout = static_cast<QVBoxLayout*>(ui->tabReport->layout());
        layout->insertWidget(0,m_WebEngineView);
    
        ui->tabWidget->setCurrentWidget(ui->tabCalculation);
    
        // сигналы к слотам
        connect(ui->water_content, SIGNAL(clicked(bool)), SLOT(changeSpinbox()));
    
        connect(ui->doubleSpinBox_Q_oil, SIGNAL(valueChanged(double)), SLOT(onBtnCommandClicked1()));
        connect(ui->doubleSpinBox_Q_water, SIGNAL(valueChanged(double)), SLOT(onBtnCommandClicked2()));
    
        connect(ui->m3m3, SIGNAL(clicked(bool)), SLOT(changeLabel1()));
        connect(ui->radioButton_m3_t, SIGNAL(clicked(bool)), SLOT(changeLabel2()));
    
      //  connect(ui->tabChart, SIGNAL(currentChanged(int)), SLOT(createcharts))
    
        //   connect(ui->btn_report, SIGNAL(clicked(bool)), SLOT(createCharts()));
    
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    void MainWindow::onBtnCommandClicked1()
    {
        ui->doubleSpinBox_Q_liquid->setValue(ui->doubleSpinBox_Q_oil ->value()+ui->doubleSpinBox_Q_water ->value());
    }
    
    void MainWindow::onBtnCommandClicked2()
    {
        ui->doubleSpinBox_Q_liquid->setValue(ui->doubleSpinBox_Q_oil ->value()+ui->doubleSpinBox_Q_water ->value());
    }
    
    // Расчет расхода воды/нефти по обводненности
    void MainWindow::changeSpinbox()
    {
        double Q_liquid   =  ui->doubleSpinBox_Q_liquid->value();
        double w = ui->doubleSpinBox_Wc->value();
        if (ui->water_content->isChecked())
        {
        ui->doubleSpinBox_Q_water->setValue(calc_Q_water(w, Q_liquid)); // расчет суточного расхода воды
        ui->doubleSpinBox_Q_oil->setValue(calc_Q_oil(w, Q_liquid)); // расчет суточного расхода нефти
        }
        else
        {
            ui->doubleSpinBox_Q_water->setValue(0);
            ui->doubleSpinBox_Q_oil->setValue(0);
            ui->doubleSpinBox_Q_liquid->setValue(0);
            ui->doubleSpinBox_Wc->setValue(0);
        }
    }
    
    void MainWindow::on_btn_report_clicked()
    {
    
        /*
         * Генерация текущего времени создания отчета
         */
    
        QDateTime datetime;
        QString strdatetime;
        datetime = QDateTime::currentDateTime();
        strdatetime = datetime.toString("dd.MM.yyyy hh:mm:ss");
    
        const double p_0 = 0.1;
    
        /*
       *  Берем данные из интерфейса:
       */
    
        double ro_oil    =  ui->doubleSpinBox_ro_oil->value();
        double ro_water  =  ui->doubleSpinBox_ro_water->value();
        double ro_gas    =  ui->doubleSpinBox_ro_gas->value();
    
        double Q_oil     =  ui->doubleSpinBox_Q_oil->value();
        double Q_water   =  ui->doubleSpinBox_Q_water->value();
    
        ui->doubleSpinBox_Wc->value();
    
        double Q_gg      =  ui->doubleSpinBox_Q_gg->value();
        double alpha_0   =  ui->doubleSpinBox_alpha_0->value();
        double mu        =  ui->doubleSpinBox_mu->value();
    ...
    
    
    }
      Evgenii Legotckoi
      • Мамыр 29, 2018, 4:31 Т.Ж.
      • (өңделген)

      Чем это противоречит ООП? У вас есть данные в спинбоксах, который вы забираете через get методы и устанавливаете в структуру. Вы не можете добавить структуру в спинбоксы, у них не реализован такой функционал.
      Мапперы работают также, есть определённый объект и его свойства. делается некоторая привязка через вспомогательные методы, в данном случае сигнал-слотовое соединение, в котором уже присваиваются данные из интерфейса в объект.

      Вполне стандартный подход в небольшом приложении.
      Маппер можно конечно написать, но в итоге это будет тоже самое.
        Evgenii Legotckoi
        • Мамыр 29, 2018, 4:37 Т.Ж.
        • (өңделген)

        извиняюсь, понял, что вы имели ввиду.

        Обьявите свою структуру в заголовочной файле.
        а потом просто обращайтесь к её полям.
        my_structure.ro_oil = ui->doubleSpinBox_ro_oil->value();

          f
          • Мамыр 29, 2018, 4:41 Т.Ж.

          Тем что конкретная функция должна выполнять свою работу. А так у меня выходит что и время генерируется по кнопке и значения из спинов берутся по нажатию только и отчет создается и график. Хотя в функции кнопке должно быть просто обращение к функции, допустим создания графика.

          Тогда такой вопрос: можно вынести эти строки
           double ro_oil = ui->doubleSpinBox_ro_oil->value();
          в какую то отдельную функцию, чтоб не было нагромождения в нажатии кнопки?
          а то голову ломаю как это можно сделать
            Evgenii Legotckoi
            • Мамыр 29, 2018, 4:50 Т.Ж.

            Вы уже использовали сигналы изменения значений от спинбоксов

            connect(ui->doubleSpinBox_Q_oil, SIGNAL(valueChanged(double)), SLOT(onBtnCommandClicked1()));
            Точно также используйте отдельную функцию для всех переменных структуры.
            Объявите объект структуры в стеке в заголовочном файле.
            А в каждом таком методе-слоте присваивайте полям структуры значения.
            void MainWindow::onBtnCommandClicked1()
            {
                ui->doubleSpinBox_Q_liquid->setValue(ui->doubleSpinBox_Q_oil ->value()+ui->doubleSpinBox_Q_water ->value());
                target_structure.ro_oil = ui->doubleSpinBox_ro_oil->value();
            }

              Пікірлер

              Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
              Кіріңіз немесе Тіркеліңіз
              OI
              • Ora Iro
              • Жел. 24, 2024, 6:38 Т.Ж.

              C++ - Тест 001. Первая программа и типы данных

              • Нәтиже:40ұпай,
              • Бағалау ұпайлары-8
              AD

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Нәтиже:50ұпай,
              • Бағалау ұпайлары-4
              m
              • molni99
              • Қаз. 26, 2024, 1:37 Т.Ж.

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Нәтиже:80ұпай,
              • Бағалау ұпайлары4
              Соңғы пікірлер
              ИМ
              Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
              Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
              Evgenii Legotckoi
              Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
              Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
              A
              ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
              Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
              Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas5Шілде 5, 2024, 11:02 Т.Ж.
              QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              Енді форумда талқылаңыз
              WD
              Weave DecorЖел. 28, 2024, 3:18 Т.Ж.
              Weave & Decor Weave Decor Where passion for textiles meets innovative design. We specialize in manufacturing a diverse range of high-quality bed sheets, from classic to contemporary, using premium fa…
              n
              nklyЖел. 27, 2024, 11:41 Т.Ж.
              Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. У меня есть Представление QTreeView и древовидная модель QStandardItemModel подключенная к представлению. Итемы в модели QStandardItem. В разных ветках дерева могут быть элементы с одинаковым им…
              Evgenii Legotckoi
              Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
              t
              tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
              google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
              NSProject
              NSProjectМаусым 4, 2022, 3:49 Т.Ж.
              Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

              Бізді әлеуметтік желілерде бақылаңыз