Russian Qt Forum
Ноябрь 23, 2024, 22:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменение переменых в родительском классе  (Прочитано 2927 раз)
FalloutST
Гость
« : Апрель 07, 2017, 01:05 »

В одном классе есть фунция: void init();
В нем же переменная int val;
объявлены в *.h

этот клас вызывает новое окно, из которого я получаю новое значение val

как мне знаписать его для дальнейшего использования в родительском классе.

-------------------------- вопрос окончен, теперь лирика---------------------------
дочерним классом я посылаю сигнал на запуск фунции обработки ряда переменных
и каково было мое удивление когда переменные не изменились вовсе.
работал я так:
Код:
class MainWindow : public QMainWindow {
public:
 int val;
...

в дочернем классе:
Код:
include mainwindow.h

MainWinow mw;
mw.val = 2;
блин я наверное из пещеры выполз но если запускать фунцию обработки из дочернего класса выражением mw.init(); то получаю закрытый сериал порт. Когда кнопка запуска аналогичной функции из окна родительского работает норм.
Мне все равно нужно изменять значения не работающее(работающее но меняющее его в пределах дочернего класса) mw.qbytearray.append(newval); Ребята как это сделать, я в & и * уже перестал понимать... или это просто третий час чтения абсолютной ереси не потеме....
Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #1 : Апрель 07, 2017, 09:29 »

Хотелось бы больше кода, но мой внутренний телепат подозревает, что Вы меняете val у объекта только что созданного на стеке, и не имеющего никакого отношения к окну приложения, которое у Вас есть.

Если Вы наследуетесь от MainWindow - то имеете прямой доступ к переменной val дочернего.
Или вам нужен указатель на необходимый Вам объект класса MainWindow (т.е. MainWindow* mw).
Записан
FalloutST
Гость
« Ответ #2 : Апрель 07, 2017, 10:04 »

Код:
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    QByteArray data;
   char sp_ar_address[4] = {17,0,0,1};
    QByteArray sp_ar_dataToSend;
    QByteArray sp_arDataToRead;
    int sp_arDataToReadLengh = 0;
    int sp_dataLength;
}
.....
connect(hardware, &showlist::callcollectData, this, &MainWindow::collectData);
...

showlist *hardware;
...
hardware = new showlist;
....

connect(ui->getAddress, &QAction::triggered, hardware, &MainWindow::show);
....
void MainWindow::collectData() {
тут обработка переменных
}

Код:
class showlist : public qDialog {
sihnals: callcollectData ()
public slots:
void   showlist::reload(){
    MainWindow* mw;   
    char addressToSend[4] = {17,0,0,1}
    for (int i=0; i<4;i++) {
->>>  sp_ar_address[i]=addressToSend[i];
    }
->>> sp_dataLength = 1;
->>> sp_ar_dataToSend.append(((const char*)(&data), sizeof(char)));
    emit callcollectData ();
}
}

->>> это проблемные места которые не могу решить...


все это находится в разных файлах...
« Последнее редактирование: Апрель 07, 2017, 10:06 от FalloutST » Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #3 : Апрель 07, 2017, 11:02 »

Чтобы заработал Ваш код, поступать надо примерно так:
Код:
class showlist : public qDialog {
public:
    MainWindow* mw;
signals: callcollectData ()
public slots:
void   showlist::reload(){
    char addressToSend[4] = {17,0,0,1}
    for (int i=0; i<4;i++) {
mw->sp_ar_address[i]=addressToSend[i];
    }
mw->sp_dataLength = 1;
mw->sp_ar_dataToSend.append(((const char*)(&mw->data), sizeof(char)));
    emit callcollectData ();
}
}
И при создании объекта hardware, проинициализировать указатель, чтобы он указывал на нужный Вам экземпляр класса MainWindow:
Код:
hardware = new showlist;
hardware->mw = this;

Но в целом, такое решение выглядит попросту ужасно.
Уж лучше будет передавать необходимые данные через механизм сигнал-слот.
Код:
class showlist : public qDialog {
signals:
void callcollectData (QByteArray Data, char Address[]);

И соответствующий этому сигналу принимающий слот у MainWindow сам модифицирует свои внутренние переменные.
Записан
FalloutST
Гость
« Ответ #4 : Апрель 07, 2017, 12:10 »

hardware->mw = this;
то, что надо!!!! обрадовало несказанно!!!
Данная операция мне понадобится еще не в одном случае, и лучшее, что я нашел это использовать именно такой вариант обработчика. Понимаю выглядит ужасно, но обработка происходит из разных фунций в разных файлах по одному сигналу, нужно общее место для хранения данных... Я выписал не конкретный код а только необходимое для понимания процесса... ~10% замыленные глаза просто не догодались передать ссылку на работающий класс....
СПАСИБО
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.098 секунд. Запросов: 23.