0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 17
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Получить переменную из другого класса18.01.2018, 11:09. Показов 6903. Ответов 15
Метки нет (Все метки)
Помогите разобраться, как можно получить переменную которая объявлена в другом классе как public?
Есть некая переменная "x", объявленная в классе Widget как public, в этом классе значение этой переменной вычисляется, после чего необходимо передать её в другой класс ItemImage. файл "widget.h"
файл "widget.cpp"
файл "itemimage.h"
файл "itemimage.cpp"
Методом проб выяснилось что если присваивать какое либо значение переменной X, в обычной функции, то все отлично передается, но поскольку я присвоение значения переменной Х делаю через слот, то значение не передается, точнее передаётся но совсем не то. С чем это связано?? и как обойти?
0
|
18.01.2018, 11:09 | |
Ответы с готовыми решениями:
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"
файл "widget.cpp"
файл "itemimage.h"
файл "itemimage.cpp"
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"
а суть проекта вот в чем: по нажатию на кнопку загружается бинарный файл, после чего из него считываются данные. Далее из этих данных посредством вложенных циклов 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, все происходит следующим образом:
Все происходит в одной форме, изображение помещаетя в виджет 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 массив символов
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:
я определяю в классе ItemImage функцию
Добавлено через 12 минут так вроде бы разобрался, все получилось... спасибо за ответы))) Добавлено через 16 часов 21 минуту Извиняюсь за глупый вопрос, но что мне тогда мешает передать переменную на прямую?? почему необходимо передавать именно через функцию типа int? по вашему примеру я из класса widget передаю переменную функции типа 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
|
0
|
5 / 5 / 1
Регистрация: 05.06.2018
Сообщений: 31
|
|
19.06.2018, 13:21 | 16 |
Lolobotik, обычное явление на интересных форумах, никуда не денешься)))
0
|
19.06.2018, 13:21 | |
19.06.2018, 13:21 | |
Помогаю со студенческими работами здесь
16
Вызов функции из одного класса кнопкой из другого класса Как получить private переменную класса, функцей членом другого класса Не могу получить переменную из другого класса Как получить переменную из другого класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |