Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 17
1

Получить переменную из другого класса

18.01.2018, 11:09. Показов 6903. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите разобраться, как можно получить переменную которая объявлена в другом классе как public?

Есть некая переменная "x", объявленная в классе Widget как public, в этом классе значение этой переменной вычисляется, после чего необходимо передать её в другой класс ItemImage.


файл "widget.h"

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
 
namespace Ui {
class Widget;
}
 
class Widget : public QWidget
{
    Q_OBJECT
public:
    int x;
    int xIm();
 
public slots:
    void slotX();
 
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
 
private:
    Ui::Widget *ui;
};
 
#endif // WIDGET_H

файл "widget.cpp"

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "widget.h"
#include "ui_widget.h"
#include <QtWidgets>
 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
 
   QObject::connect(ui->m_pButton,SIGNAL(clicked(bool)), SLOT(slotX()));
}
 
Widget::~Widget()
{
    delete ui;
}
 
 
// Здесь по нажатию на кнопку происходят всякие вычисление (которые для простоты примера я исключи), после чего пытаюсь получить значение Х из другого класса.
 
void Widget::slotX()
{
    x = 349;
}
 
int Widget::maxIm()
{
    return x;
}


файл "itemimage.h"

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once
 
#include <QGraphicsItem>
#include <QPainter>
 
 
class ItemImage : public QGraphicsItem
{
public:
    ItemImage();
    ~ItemImage();
 
public:
    void pX();
 
 
protected:
    QRectF boundingRect() const;  
 
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
};

файл "itemimage.cpp"

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "itemimage.h"
#include "widget.h"
#include <QGraphicsSceneWheelEvent>
 
 
ItemImage::ItemImage() :
    QGraphicsItem()
{
       per();  // Вызываем функцию для получения переменной
 
       spriteImage = new QPixmap(640,512);
 
}
 
ItemImage::~ItemImage()
{
 
}
 
QRectF ItemImage::boundingRect() const
{
    return QRectF(0,0,640,512);  
}
 
void ItemImage::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
 
        painter->drawPixmap(0,0,640,512,*spriteImage);
 
        Q_UNUSED(option);
        Q_UNUSED(widget);
 
}
 
 
void ItemImage::per()
{
    Widget w = new Widget;
    
    // выводим окно с сообщением где отображается полученная нами переменная
    QMessageBox::about(0," _________", QString::number(w->maxIm()));
}
Добавлено через 1 час 23 минуты
Методом проб выяснилось что если присваивать какое либо значение переменной X, в обычной функции, то все отлично передается, но поскольку я присвоение значения переменной Х делаю через слот, то значение не передается, точнее передаётся но совсем не то.

С чем это связано?? и как обойти?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.01.2018, 11:09
Ответы с готовыми решениями:

Получить указатель на окно верхнего уровня из другого класса
Всем привет! Могу путаться в терминологии, поправьте если что-) Необходимо получить указатель на...

Как получить доступ к переменным одного класса из методов другого
Есть класс MainWindow с переменными в pablic, и кьютешный QGraphicsView. Нужно вот тут void...

Как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса?
Подскажите, пожалуйста, как связать сигнал одного класса со слотом другого класса, содержащего...

Ошибка при обращении из одного класса к методу другого класса
Структура проекта, 2 класса: класс графики MainWindow класс логики Сannibals при обращении из...

15
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
18.01.2018, 11:37 2
Тут конечно код не полный, но подозреваю, что проблема в том, что читаете вы переменную раньше, чем выполняется ваш слот.
Наверное самым правильным было бы создать в Widget сигнал. Создать слот в ItemImage. Связать эти сигнал и слот.
И в slotX() делать вызов сигнала. Тогда все будет отображаться как надо.
0
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 17
18.01.2018, 12:09  [ТС] 3
Наиболее удобным способом было бы обращаться напрямую через ссылку на экземпляр класса, поскольку в самой программе передаваемых переменных полно, как обычные так и двумерные массивы.

вот весь код программы (сокращенный, но передающий суть вопроса).
с этим кодом проги на данный момент и отрабатываю данный вопрос.

файл "widget.h"

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
#include "itemimage.h"
#include "widget.h"
 
 
namespace Ui {
class Widget;
}
 
class Widget : public QWidget
{
    Q_OBJECT
public:
    ItemImage* itemImg;
    int max;
 
public slots:
    void slotF();
 
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
 
private:
    Ui::Widget *ui;
};
 
#endif // WIDGET_H

файл "widget.cpp"

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "widget.h"
#include "ui_widget.h"
#include <QtWidgets>
 
 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
 
 
    QObject::connect(ui->m_pButton,SIGNAL(clicked(bool)), SLOT(slotF()));
}
 
Widget::~Widget()
{
    delete ui;
}
 
 
void Widget::slotF()
{
   max = 123;
   itemImg = new ItemImage();
}

файл "itemimage.h"

C++ (Qt)
1
2
3
4
5
6
7
8
#pragma once
 
class ItemImage
{
public:
    ItemImage();
    ~ItemImage();
};

файл "itemimage.cpp"

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "itemimage.h"
#include "widget.h"
#include <QtWidgets>
 
 
ItemImage::ItemImage()
{
   Widget w;
    QMessageBox::about(0,"__________", QString::number(w.max));
}
 
ItemImage::~ItemImage()
{
}
То есть я имею на форме одну кнопку, по нажатию на неё, я переменной типа max задаю значение 123, после чего вызываю конструктор другого класса и из через ссылку на экземпляр класса во втором классе получаю значение переменной max. Но значение выводится не то... а вот если при инициализации класса Widget переменной указать какое то значение, то все работает... то есть суть в том, что я переменной max задаю значение в самом слоте от этого он её читает не верно
0
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
18.01.2018, 12:22 4
Что то у вас в программе вообще жесть какая то....
В классе Widget по нажатию кнопки вы создаете объект ItemImage. (видимо объект класса Widget уже где то создан?)
В конструкторе ItemImage вы создаете опять статически объект класса Widget.
То есть сколько у вас нажатий на кнопку, столько у вас вложенных объектов.
И получается выводите вы на экран значение из нового объекта, а устанавливаете значение для старого, который выше по иерархии.
Вообщем бред какой то.

Объясните, что вы конкретно хотите сделать, для чего все это? Пока я не понимаю даже зачем такой странный код.
Только тогда я смогу подсказать, как сделать правильно.
0
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 17
18.01.2018, 12:56  [ТС] 5
Класс Widget это стандартный класс созданный Qt creator... стандартно создается класс Widget унаследованный от QWidget, к которому крепится форма, форма вызывается из функции main где кокраз таки и создается объект класса Widget и выводится все на экран.

файл "main.cpp"

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
#include "widget.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    Widget        wgt;
    wgt.show();
 
    return a.exec();
}

а суть проекта вот в чем:

по нажатию на кнопку загружается бинарный файл, после чего из него считываются данные.
Далее из этих данных посредством вложенных циклов for формируется двумерный массив типа int размером 640х512 (все эти действия происходят в классе Widget),

По нажатию на другую кнопку, этот массив и некоторые значения полученные из этого массива требуется передать классу ItemImage, где посредством некого преобразования формируется изображение размером 640x512, где каждое значение данного массива это пиксель определенного цвета. после всех преобразований изображение выводится на экран.

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

Добавлено через 2 минуты
Но вот как передать массив и другие значения типа int другому классу разобраться не могу
0
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
18.01.2018, 13:05 6
Для начала нужно определиться со структурой объектов в программе.
То есть есть у тебя форма с кнопкой. Ты хочешь по нажатию кнопки отобразить картинку.

Где ты хочешь отобразить картинку? На той же форме? На новой форме, разной для каждого нажатия (сколько нажатий, столько появится и форм)? На новой форме, но картинка будет меняться при нажатии?
Выбери вариант!

В зависимости от этого можно будет уже думать что, куда и как передавать, а главное какие объекты и в какой иерархии тебе вообще нужны.
0
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 17
18.01.2018, 13:18  [ТС] 7
На форме находится виджет GraphicsView, который в свою очередь крепится к сцене, после чего на сцену устанавливается изображение собранное в классе ItemImage унаследованном от QGraphicsItem, все происходит следующим образом:

C++ (Qt)
1
2
3
4
5
    itemImg = new ItemImage();      // в файле "widget.h" значится как  ItemImage* itemImg;    
    scene = new QGraphicsScene();   // в файле "widget.h" значится как  QGraphicsScene  *scene;
 
    ui->graphicsView->setScene(scene);  // Устанавливаем графическую сцену в graphicsView
    scene->addItem(itemImg);   // Добавляем на сцену созданную картинку.
нажатий на кнопку одно, изображение одно.
Все происходит в одной форме, изображение помещаетя в виджет GraphicsView, и рядом с ним находится кнопка.

Нажал на кнопку, файл считался, данные обработались и на виджете показалась картинка
0
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
18.01.2018, 13:33 8
Из этого следует, что в ItemImage никаких созданий объектов Widget быть не может.

Далее, если изображение одно, зачем создавать много itemImg? Достаточно и одного как правило, тем более если оно добавляется на сцену.
Соответственно создание сцены и itemImg никак не может быть в слоте. Правильнее было бы его создать заранее (например в конструкторе Widget ), а по нажатию только модифицировать.

Widget::slotF() не должен создавать еще один экземпляр ItemImage, он должен воспользоваться тем, который вы создали перед этим в конструкторе.

ItemImage должен иметь какую то public функцию для того, что бы в нее можно было передать массив. Массив обычно передается по ссылке. Перед передачей, массив создается в классе Widget и заполняется из файла.

Как я понимаю, передавать назад ничего не надо, так как itemImg, используя полученный массив, модифицирует свои графические элементы, что и так отобразится на сцене.
0
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 17
18.01.2018, 14:00  [ТС] 9
За советы по правильной реализации спасибо, но как передать массив так и не понимаю.

Вот допустим создал некую функцию в классе ItemImage, как в неё передать массив? по ссылке это понятно, но как это выглядит в коде?
0
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
18.01.2018, 14:11 10
Ну вот пример из кода
Это определение функции. msg массив символов
C++ (Qt)
1
2
3
4
int comOpros::CreateMsgKLS(char *msg,int line, int block,int com)
{
...
}
А вот здесь создается массив и передается в функию
C++ (Qt)
1
2
char *msg=new char[6];
CreateMsgKLS(msg,line,block,command);
1
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 17
18.01.2018, 15:21  [ТС] 11
прошу прощения за тупняк, но как этот массив потом вытащить из функции в классе??

как потом в классе обратиться к переменной msg?
0
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
18.01.2018, 15:39 12
Как к обычному массиву. Почитай лучше книги по С и С++. Это основы, их нужно знать.
0
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 17
19.01.2018, 08:54  [ТС] 13
да книга уже прочитана и не одна, но вот как дело доходит до практики..

объявил я в классе ItemImage принимающую функцию типа int:

C++ (Qt)
1
2
public:
    int massI(int x);
передал я значение в эту функцию в классе Widget:

C++ (Qt)
1
2
3
4
5
void Widget::newX()
{
    int max = 123;
    itemImg->massI(max);
}
а вот как мне к этой переменной обратиться в классе ItemImage?

я определяю в классе ItemImage функцию

C++ (Qt)
1
2
3
4
    int massI(int x)
    {
      return x;
    }
так в Х ничего не передается

Добавлено через 12 минут
так вроде бы разобрался, все получилось... спасибо за ответы)))

Добавлено через 16 часов 21 минуту
Извиняюсь за глупый вопрос, но что мне тогда мешает передать переменную на прямую??

почему необходимо передавать именно через функцию типа int?

по вашему примеру я из класса widget передаю переменную функции типа int классу ItemImage:


C++ (Qt)
1
2
3
4
5
void Widget::newX()
{
    int max = 123;
    itemImg->massI(max);  // где massI(int x) - это функция типа int класса ItemImage
}

не проще ли сделать так?

C++ (Qt)
1
2
3
4
5
void Widget::newX()
{
    int max = 123;
    itemImg->massI = max;  // где massI - это переменная типа int класса ItemImage
}
0
5 / 5 / 1
Регистрация: 05.06.2018
Сообщений: 31
15.06.2018, 14:20 14
Если пофантазировать, то да. Казалось бы есть Widget и класс ItemImage.
На форме Widget поставил кнопку.
Говоришь классу "знакомься, Widget.h!", а виджету "знакомься, itemimage.h!".

В коде widget.cpp пишешь
int x = 123;
ui->pButton->setText( "transferring "+QString::number(x) );

А в классе itemimage.cpp:
QMessageBox::about( 0,"____", ui->pButton->text() );

И ни сигналов тебе, ни слотов)))
0
Lolobotik
15.06.2018, 15:15
  #15

Не по теме:

Цитата Сообщение от VladQtCr Посмотреть сообщение
Если пофантазировать, то да.
Археолог в разделе. Всё больше и больше полугодовалых (в лучшем случае) тем выплывает на поверхность.

0
5 / 5 / 1
Регистрация: 05.06.2018
Сообщений: 31
19.06.2018, 13:21 16
Lolobotik, обычное явление на интересных форумах, никуда не денешься)))
0
19.06.2018, 13:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.06.2018, 13:21
Помогаю со студенческими работами здесь

Вызов функции из одного класса кнопкой из другого класса
Доброго времени суток. Помогите разобраться с сигналами и слотами. Уже устал перечитывать не могу...

Как получить private переменную класса, функцей членом другого класса
Игра змейка: Есть класс поле в котором содержится размеры поля: class field { private: ...

Не могу получить переменную из другого класса
Здравствуйте. Учу ООП. Создаю сайт. В каждом экшене сайта есть переменная public $page_title;...

Как получить переменную из другого класса?
У меня в неком классе возникает событие и я хочу при возникновении этого события присвоить значение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru