как работать с данными из двух .cpp

256
05 марта 2017, 08:39

Создал проект, который состоит из двух окон : в первом окне заполняем переменные , в втором мы выводим заполненные переменные. В одном исполняемом файле (dialog.cpp) , беру переменные и задаю им параметры , беру их из заголовочного файла (peremennie1.h). После заполнения их я хочу их вывести в исполняемом файле (mainwindow.cpp), НО этого не происходит они полностью обнулены 0_o .

Что я делаю не так ????

//-----------------------------------------------

Вот весь код, он очень простой там три кнопки и пару строк кода, мне главное понять механизм.

Файл welik_oshibka.pro

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = welik_oshibka
TEMPLATE = app

SOURCES += main.cpp\
        mainwindow.cpp \
    dialog.cpp \
    peremennie1.cpp
HEADERS  += mainwindow.h \
    dialog.h \
    peremennie1.h
FORMS    += mainwindow.ui \
    dialog.ui

Файл peremennie1.h

 #ifndef PEREMENNIE1_H
 #define PEREMENNIE1_H
 class peremennie1
 {
  public:
  //    peremennie1();
     explicit peremennie1();
     virtual  ~peremennie1();
     int WRE ;
     int WRE_PR;
     int wre_izL;
     double WRE_DABL;
     int *K2I_IZ;
 };
 #endif // PEREMENNIE1_H

peremennie1.cpp

 #include "peremennie1.h"
peremennie1::peremennie1()
{
     WRE = 0;
     WRE_PR = 0;
     wre_izL = 0;
     WRE_DABL = 0;
     // массивчик
      K2I_IZ=0;
}
peremennie1::~peremennie1()
{
    if(K2I_IZ) delete []K2I_IZ;
}

Файл dialog.h

#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
    Q_OBJECT
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
signals:
    void signal_dialog_show();
private:
    Ui::Dialog *ui;
};
#endif // DIALOG_H

Файл dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include "peremennie1.h"
#include "QDebug"
peremennie1 per;
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}
Dialog::~Dialog()
{
    delete ui;
}
void Dialog::on_pushButton_clicked()
{
    qDebug() << "per.WRE = " << per.WRE;
    qDebug() << "per.WRE_PR =" << per.WRE_PR;
    qDebug() << "per.wre_izL =" << per.wre_izL;
    qDebug() << "per.WRE_DABL =" << per.WRE_DABL;
    emit signal_dialog_show();
    this->hide();
}
void Dialog::on_pushButton_2_clicked()
{
    // тут заполняем данные
    per.WRE = 25;
    per.WRE_PR = 26;
    per.wre_izL = 27;
    per.WRE_DABL = 28.55;
    ui->label->setText("zapolnili");
}

Файл main.cpp

#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
//    w.show();
    return a.exec();
}

Файл mainwindows.h

   #ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void select_peremennie1();
private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
    void on_pushButton_3_clicked();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

Файл mainwindows.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
#include "peremennie1.h"
#include "QDebug"
Dialog *glsso1_d = 0;
peremennie1 *per = new peremennie1;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
//    this->hide();
    // Инициализировать диалоги выбора режима и типа антенны
        glsso1_d = new Dialog(this);
        glsso1_d->show();
            qDebug() << "!!!per->WRE = " << per->WRE;
            qDebug() << "!!!per->WRE_PR =" << per->WRE_PR;
            qDebug() << "!!!per->wre_izL =" << per->wre_izL;
            qDebug() << "!!!per->WRE_DABL =" << per->WRE_DABL;
        // штука что бы прыгать между кнопками
        connect(glsso1_d, SIGNAL(signal_dialog_show()), this, SLOT(select_peremennie1()));
}
// выбирается режим в котором будет работать основной  блок программы
void MainWindow::select_peremennie1()
{
    this->show();
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_pushButton_clicked()
{
    // возвращаем диалог
    glsso1_d->show();
    this->hide();
}
void MainWindow::on_pushButton_2_clicked()
{
    ui->spinBox->setValue(per->WRE);
    ui->spinBox_2->setValue(per->WRE_PR);
    ui->spinBox_3->setValue(per->wre_izL);
    ui->doubleSpinBox->setValue(per->WRE_DABL);
}
void MainWindow::on_pushButton_3_clicked()
{
    qDebug() << "!!!+_+!!!per->WRE = " << per->WRE;
    qDebug() << "!!!+_+!!!per->WRE_PR =" << per->WRE_PR;
    qDebug() << "!!!+_+!!!per->wre_izL =" << per->wre_izL;
    qDebug() << "!!!+_+!!!per->WRE_DABL =" << per->WRE_DABL;
}

Файл dialog.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>305</width>
    <height>352</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <widget class="QPushButton" name="pushButton">
   <property name="geometry">
    <rect>
     <x>80</x>
     <y>60</y>
     <width>111</width>
     <height>41</height>
    </rect>
   </property>
   <property name="text">
    <string>задаем данные</string>
   </property>
  </widget>
  <widget class="QPushButton" name="pushButton_2">
   <property name="geometry">
    <rect>
     <x>80</x>
     <y>150</y>
     <width>111</width>
     <height>71</height>
    </rect>
   </property>
   <property name="text">
    <string>заполняем данные</string>
   </property>
  </widget>
  <widget class="QLabel" name="label">
   <property name="geometry">
    <rect>
     <x>90</x>
     <y>260</y>
     <width>111</width>
     <height>31</height>
    </rect>
   </property>
   <property name="text">
    <string/>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

Файл mainwindows.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>40</x>
      <y>20</y>
      <width>101</width>
      <height>51</height>
     </rect>
    </property>
    <property name="text">
     <string>возвращение</string>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton_2">
    <property name="geometry">
     <rect>
      <x>40</x>
      <y>110</y>
      <width>75</width>
      <height>23</height>
     </rect>
    </property>
    <property name="text">
     <string>вывод</string>
    </property>
   </widget>
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>160</x>
      <y>100</y>
      <width>61</width>
      <height>21</height>
     </rect>
    </property>
    <property name="text">
     <string>WRE</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_2">
    <property name="geometry">
     <rect>
      <x>160</x>
      <y>130</y>
      <width>71</width>
      <height>21</height>
     </rect>
    </property>
    <property name="text">
     <string>WRE_PR</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_3">
    <property name="geometry">
     <rect>
      <x>160</x>
      <y>160</y>
      <width>61</width>
      <height>21</height>
     </rect>
    </property>
    <property name="text">
     <string>WRE_izl</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_4">
    <property name="geometry">
     <rect>
      <x>160</x>
      <y>190</y>
      <width>71</width>
      <height>21</height>
     </rect>
    </property>
    <property name="text">
     <string>WRE_DABL</string>
    </property>
   </widget>
   <widget class="QSpinBox" name="spinBox">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>250</x>
      <y>100</y>
      <width>42</width>
      <height>22</height>
     </rect>
    </property>
   </widget>
   <widget class="QSpinBox" name="spinBox_2">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>250</x>
      <y>130</y>
      <width>42</width>
      <height>22</height>
     </rect>
    </property>
   </widget>
   <widget class="QSpinBox" name="spinBox_3">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>250</x>
      <y>160</y>
      <width>42</width>
      <height>22</height>
     </rect>
    </property>
   </widget>
   <widget class="QDoubleSpinBox" name="doubleSpinBox">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>240</x>
      <y>190</y>
      <width>62</width>
      <height>22</height>
     </rect>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton_3">
    <property name="geometry">
     <rect>
      <x>40</x>
      <y>150</y>
      <width>75</width>
      <height>23</height>
     </rect>
    </property>
    <property name="text">
     <string>разведка</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>400</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>
Answer 1

Когда Вы подключаете заголовочный файл, это, если грубо, простая подстановка всего файла в то место, где написана директива include. То есть включили в двух местах, в двух местах у Вас оказалась строка int var;. Чтобы использовать одну и ту же переменную в нескольких местах, нужно в одном месте объявить её как обычно (int var;), а в других extern int var; Как-то так.

Answer 2

В разных единицах трансляции (читай .cpp-файлах) вы работаете с разными переменными-экземплярами класса peremennie1.

В dialog.cpp вы определяете одну глобальную переменную:

peremennie1 per;

а в mainwindows.cpp - вторую (и почему-то размещаете её в "куче"):

peremennie1 *per = new peremennie1;

Определите эту переменную где-нибудь в одном месте и обращайтесь к ней из разных объектов.

Например, определите вашу переменную в функции main и передайте её вашему объекту MainWindow:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    peremennie1 per;
    MainWindow w;
    w.setContext(&per);
    w.show();
    return a.exec();
}

Определите в классе MainWindow метод setContext(peremennie1* per) и поле peremennie1* m_per:

class Mainwindow ...
{
private:
    peremennie1* m_per = nullptr;
    ...
public:
    void setContext(peremennie1* per)
    {
        m_per = per;
    }
};

Дальше из методов MainWindow обращайтесь к этой переменной через локальный указатель m_per.

В ваш класс Dialog передать эту переменную можно подобным же способом.

Answer 3

aleks.andr и Алексей Саровский спасибо ваши ответы очень помогли. НО я все же дам развернутый ответ.

в файле peremennie1.h

  #ifndef PEREMENNIE1_H
#define PEREMENNIE1_H
class peremennie1
{
public:
//    peremennie1();
    explicit peremennie1();
    virtual  ~peremennie1();
    int WRE ;
    int WRE_PR;
    int wre_izL;
    double WRE_DABL;
    int *K2I_IZ;
};
extern peremennie1 per;

В файле dialog.cpp заменяем код (на такой :3)

#include "dialog.h"
#include "ui_dialog.h"
#include "peremennie1.h"
#include "mainwindow.h"
#include "QDebug"
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}
Dialog::~Dialog()
{
    delete ui;
}
void Dialog::on_pushButton_clicked()
{
    qDebug() << "per.WRE = " <<  per.WRE;
    qDebug() << "per.WRE_PR =" << per.WRE_PR;
    qDebug() << "per.wre_izL =" << per.wre_izL;
    qDebug() << "per.WRE_DABL =" << per.WRE_DABL;
    emit signal_dialog_show();
    this->hide();
}
void Dialog::on_pushButton_2_clicked()
{
    // тут заполняем данные
    per.WRE = 25;
    per.WRE_PR = 26;
    per.wre_izL = 27;
    per.WRE_DABL = 28.55;
    ui->label->setText("zapolnili");
}

В файле mainwindow.cpp

удаляем строчку

peremennie1 *per = new peremennie1;

И заменяем строки вызов per->WRE на на такой вариант per.WRE.

Пример : Было

void MainWindow::on_pushButton_2_clicked()
{
    ui->spinBox->setValue(per->WRE);
    ui->spinBox_2->setValue(per->WRE_PR);
    ui->spinBox_3->setValue(per->wre_izL);
    ui->doubleSpinBox->setValue(per->WRE_DABL);
}
void MainWindow::on_pushButton_3_clicked()
{
    qDebug() << "!!!+_+!!!per->WRE = " << per->WRE;
    qDebug() << "!!!+_+!!!per->WRE_PR =" << per->WRE_PR;
    qDebug() << "!!!+_+!!!per->wre_izL =" << per->wre_izL;
    qDebug() << "!!!+_+!!!per->WRE_DABL =" << per->WRE_DABL;
}

Стало

void MainWindow::on_pushButton_2_clicked()
{
    ui->spinBox->setValue(per.WRE);
    ui->spinBox_2->setValue(per.WRE_PR);
    ui->spinBox_3->setValue(per.wre_izL);
    ui->doubleSpinBox->setValue(per.WRE_DABL);
}
void MainWindow::on_pushButton_3_clicked()
{
    qDebug() << "!!!+_+!!!per.WRE = " << per.WRE;
    qDebug() << "!!!+_+!!!per.WRE_PR =" << per.WRE_PR;
    qDebug() << "!!!+_+!!!per.wre_izL =" << per.wre_izL;
    qDebug() << "!!!+_+!!!per.WRE_DABL =" << per.WRE_DABL;
}
READ ALSO
Вставка точки в полигон

Вставка точки в полигон

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

254
Книги по Windows Forms C++

Книги по Windows Forms C++

Посоветуйте, пожалуйста, книги по Windows Forms C++

328
Кросскомпиляция проектов на основе ActiveMQ-cpp

Кросскомпиляция проектов на основе ActiveMQ-cpp

Откомпилировал и инсталлировал ActiveMQ-cpp на стороннем устройстве (ARM'e)Запустил на нем бинарные файлы примеров; они работают

341