Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
f
29 мая 2018 г. 5: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;
    };

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

Добрый день.

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

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

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

Вам конкретно какие-то моменты не ясны, например, как получить изменение значения в спинбоксе? или что-то иное?
0
f

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

Программа то не сложная: ввод данных->далее данные используются в формулах и по нажатию кнопки создается отчет с расчитанным результатом.
Вот например, как написано сейчас, т.е вся реализация можно сказать в слоте нажатия кнопки, что противоречит ООП
#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();
...


}
0

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

Вполне стандартный подход в небольшом приложении.
Маппер можно конечно написать, но в итоге это будет тоже самое.
0

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

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

1
f

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

Тогда такой вопрос: можно вынести эти строки
 double ro_oil = ui->doubleSpinBox_ro_oil->value();
в какую то отдельную функцию, чтоб не было нагромождения в нажатии кнопки?
а то голову ломаю как это можно сделать
0

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

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();
}
1

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
IT
25 марта 2019 г. 17:32
Ilya The Engineer

Qt - Тест 001. Сигналы и слоты

  • Результат:5баллов,
  • Очки рейтинга-10
G
25 марта 2019 г. 8:34
GAG

C++ - Тест 002. Константы

  • Результат:41баллов,
  • Очки рейтинга-8
G
25 марта 2019 г. 8:25
GAG

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

  • Результат:66баллов,
  • Очки рейтинга-1
Последние комментарии
22 марта 2019 г. 12:32
Евгений Легоцкой

Ну может бибилотеки не те положили? У вас сборка для MinGW, а либы для MSVC.
ВН
22 марта 2019 г. 11:08
Волчонок Над-Пропастью

Из кьюта приложение не хочет запускаться, аварийно завершается, но каких-либо ошибок не выдаёт. Оно открывается, после нажатия "старт" зависает и завершается. Если не из кьюта запускать дебаг ...
21 марта 2019 г. 15:49
Евгений Легоцкой

серьезно? Эта ошибка 404 уже даже не относится к данному вопросу. В каких-то urls в вашем проекте. Вопросы, которые не относятся непосредственно к статье, задавайте, пожалуйста на...
АБ
21 марта 2019 г. 15:00
Артем Бел

а это где? сейчас ошибка в debag такая: Page not found (404)Request Method: GETRequest URL: http://amadowshop.site/accounts/profile/
21 марта 2019 г. 12:47
Евгений Легоцкой

не вижу здесь проблемы, поменяйте url для callback в приложения oauth в социальных сетях https://amadowshop.site/auth/verify/complete/facebook/
Сейчас обсуждают на форуме
U
25 марта 2019 г. 12:43
Unreal_man

Как сделать чтоб при клике на ячейку(ос андроид) ее сразу можно было редактировать?QGuiApplication::inputMethod()->show(); показывает клавиатуру, а вот что до этого прописать чтоб текст в ...
m
24 марта 2019 г. 10:36
monevich

Отвечу на свой же вопрос, может кому то это пригодится. Да, можно в функции main использовать такую конструкцию. При запуске программы из Qt передаю свой аргумент в параметрах командной строк...
22 марта 2019 г. 12:29
Дмитрий

Да, мьютекс добавил, но в том потоке, где сигнал вызывается.
ВН
22 марта 2019 г. 9:04
Волчонок Над-Пропастью

Да, на эту проблему! Зато у меня теперь новая, ругается на подключение QMediaPlayer, пишет, что не находит подобного файла или библиотеки. Пока не нашла как исправить, только вариант с переуст...
22 марта 2019 г. 8:58
Михаиллл

4) это , похоже, для создания видоизмененных страниц, для анимации. 3,5) добавить фвйл/qt/ui.qml
Присоединяйтесь к нам в социальных сетях

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