Создал проект, который состоит из двух окон : в первом окне заполняем переменные , в втором мы выводим заполненные переменные. В одном исполняемом файле (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>
Когда Вы подключаете заголовочный файл, это, если грубо, простая подстановка всего файла в то место, где написана директива include
. То есть включили в двух местах, в двух местах у Вас оказалась строка int var;
. Чтобы использовать одну и ту же переменную в нескольких местах, нужно в одном месте объявить её как обычно (int var;
), а в других extern int var;
Как-то так.
В разных единицах трансляции (читай .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
передать эту переменную можно подобным же способом.
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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть некоторая ломаная кривая, заданная в виде набора точекПытаюсь придумать алгоритм вставки новой точки в эту кривую
Откомпилировал и инсталлировал ActiveMQ-cpp на стороннем устройстве (ARM'e)Запустил на нем бинарные файлы примеров; они работают