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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Обращение к членам класса из другого класса  (Прочитано 11875 раз)
PulSar.CE3194694
Гость
« : Август 05, 2010, 08:43 »

Добрый день!
Есть два класса: class MainWindow и class MyWidget. В классе главного окна объявлены поле и массив:
Код:
int M;
QPointF *MyArray;
Случилось так, что некоторые функции из класса MyWidget должны обратиться к этому массиву и полю для счета данных из них. Подскажите, пожалуйста, каким образом это можно сделать? Запись вроде MainWindow::M и MainWindow::MyArray приводит к ошибке (массив и поле находятся в public секции).
« Последнее редактирование: Август 24, 2010, 15:50 от PulSar.CE3194694 » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Август 05, 2010, 09:21 »

Вариантов несколько:

1.

В конструкторе MyWidget добавить указатели на MainWindow::M и MainWindow::MyArray
Код:
class MyWidget : public QWidget {

    Q_OBJECT

public:
    ....
    MyWidget (int *pM, QPointF *pMyArray, QWidget *parent = 0)
        : QQWidget(parent), m_pM(pM), m_pMyArray(pMyArray){
    }
    ....
private:
    int *m_pM;
    QPointF *m_pMyArray;
    //
    int getM() const { return *m_pM; } // <== вот тут мы получаем значение m
 

но это кривое решение.

2.

1)В MyWidget  сделать

сигнал типа:
Код:
    void signalGetM();
слот типа:
Код:
public slots:
    void slotGetM(int m) { //тут используем значение переменной m }

2). В MainWindow сделать:
сингал типа:
Код:
    void signalGetM(int);
слот типа:
Код:
public slots:
    void slotGetM() { emit signalGetM(this->M); }

3. В конструкторе MainWindow (или где нить еще) коннектим:
Код:
    connect(MyWidget, SIGNAL(signalGetM()), this, SLOT(slotGetM()));
    connect(this, SIGNAL(signalGetM(int)), MyWidget, SLOT(slotGetM(int)));

4. Для того чтобы в MyWidget  получить данные от MainWindow , мы в каком либо методе MyWidget  делаем:
Код:
...
emit signalGetM();
...
и, следовательно после отправки этого сигнала мы в слот void MyWidget::slotGetM(int m) получим значение m и можем делать с ним что нам нужно.

т.е. обмен типа такой:
1. MyWidget говорит MainWindow-у : а дай ка мне значение M
2. MainWindow отвечает MyWidget-у : а на-ка тебе значение M

Улыбающийся
---

Можно придумать и еще шо нить..


« Последнее редактирование: Август 05, 2010, 09:24 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
PulSar.CE3194694
Гость
« Ответ #2 : Август 05, 2010, 09:32 »

Спасибо! А почему через конструктор - это кривое решение?))
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Август 05, 2010, 09:41 »

Потому что, раз виджеты - это объекты и т.п. - то обмениматься между ними данными нужно через сигналы/слоты.
Так надо! И всё тут! Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
BRE
Гость
« Ответ #4 : Август 05, 2010, 10:18 »

Спасибо! А почему через конструктор - это кривое решение?))
Потому, что эти классы становятся зависимыми друг от друга.
При изменении одного класса (например, поменялись имена этих переменных или способов их хранения), придется изменять оба класса.
Реализация каждого класса должна быть "закрыта" от внешнего мира и общаться с ним через заранее определенный интерфейс.
Записан
PulSar.CE3194694
Гость
« Ответ #5 : Август 05, 2010, 10:39 »

Понятно, спасибо, это видимо тонкости языка.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #6 : Август 05, 2010, 10:52 »

Цитировать
Запись вроде MainWindow::M и MainWindow::MyArray приводит к ошибке (массив и поле находятся в public секции).
Неудивительно)
Где вы видели, чтоб так обращались к членам класса?
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
BRE
Гость
« Ответ #7 : Август 05, 2010, 11:08 »

Неудивительно)
Где вы видели, чтоб так обращались к членам класса?
Не забывай про статические члены класса. Подмигивающий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Август 05, 2010, 13:33 »

Спасибо! А почему через конструктор - это кривое решение?))
Кривой не способ/принцип, а его конкретная реализация. Число элементов M и указатель на массив живут в MainWindow. Вы делаете их также и членами MyWidget. Если они будут изменены внутри MainWindow - тогда MyWidget остается со старыми невалидными данными, и надо будет как-то (коряво) это латать

Возьмите QVector <QPointF>, из которого всегда можно получить С массив. Подайте указатель на этот вектор в конструктор MyWidget - и проблем не будет

А также надо подумать нужен ли вообще такой член MyWidget. Может когда MyWidget собрался считать этот массив - тогда ему и дать его как аргумент ф-ции.
Записан
PulSar.CE3194694
Гость
« Ответ #9 : Август 05, 2010, 14:17 »

Уже разобрался, спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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