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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как связать все переменные одного класса сигналами и слотами между собой ?  (Прочитано 3976 раз)
UVD
Гость
« : Июль 01, 2016, 11:50 »

нужно такое:
при добавлении записи типа myrecord в конец любого вектора, чтобы другие векторы с записями того же типа myrecord, добавляли в свой конец значение своей последней записи

например есть
Код:
QVector <myrecord> val1;
QVector <myrecord> val2;
QVector <myrecord> val3;
...


и при добавлении записи в val1:
Код:
val1.push_back(new_myrecord);

надо чтобы в других векторах было:
Код:
val2.push_back(val2.last());
val3.push_back(val3.last());
...

и так для любого вектора, остальные должны добавлять последнее свое значение

начал делать с сигналами и слотами, но так и не понял как связать все вектора между собой
« Последнее редактирование: Июль 01, 2016, 11:52 от UVD » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Июль 01, 2016, 12:25 »

Не вектора надо связывать, а сделать контроллер, который будет их синхронизировать.
Т.е. он будет содержать все вектора внутри себя и иметь метод типа

AddRecord(myrecord& new_myrecord)
{
val1.push_back(new_myrecord);
val2.push_back(new_myrecord);
val3.push_back(new_myrecord);
}
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
UVD
Гость
« Ответ #2 : Июль 01, 2016, 12:29 »

должно быть не
AddRecord(myrecord& new_myrecord)
{
val1.push_back(new_myrecord);
val2.push_back(new_myrecord);
val3.push_back(new_myrecord);
}

а для val1
Код:
val1.push_back(new_myrecord);
val2.push_back(val2.last());
val3.push_back(val3.last());

для val2
Код:
val1.push_back(val1.last());
val2.push_back(new_myrecord);
val3.push_back(val3.last());

и т.д.

если таких векторов 100, то каждому контроллер?

а если я потом 101 вектор добавлю все остальные контроллеры переписывать надо?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Июль 01, 2016, 12:42 »

Не, контроллер только один будет.
Он должен все вектора в себе содержать.
Если надо только один обновлять, то тогда как то так:

MyVectorContoller::AddRecord(QVector<myrecord>* vecPtr, myrecord& new_myrecord)
{
val1.push_back(&val1 == vecPtr ? new_myrecord : val1.last());
val2.push_back(&val2 == vecPtr ? new_myrecord : val2.last());
val3.push_back(&val3 == vecPtr ? new_myrecord : val3.last());
...
}

Но у меня сразу вопрос: если вектора пустые, то val2.last() работать не будет.
Что тогда предполагается делать?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июль 01, 2016, 12:58 »

Лучше val1(2, 3) слить в контейнер напр

Код
C++ (Qt)
typedef QVector<myrecord> TVecl;
typedef QVector <TVec *> TControl;
TControl theControl;
theControl.push_back(&val1);
theControl.push_back(&val2);
theControl.push_back(&val3);  
...
 
Тогда добавление
Код
C++ (Qt)
void Add2All( TControl & theControl, TVec & dst, const myrecord & rec )
{
for (int i = 0; i < theControl.size(); ++i) {
 if (theControl[i] == &dst)
   theControl[i]->push_back(rec);
 else {
   Q_ASSERT(theControl[i]->size());
   theControl[i]->push_back(theControl[i]->back());
 }
}
}

нужно такое:
при добавлении записи типа myrecord в конец любого вектора, чтобы другие векторы с записями того же типа myrecord, добавляли в свой конец значение своей последней записи
Возникают сильные сомнения что так действительно "надо". Обычно в таких случаях используются индексы чтобы не дублить данные
Записан
UVD
Гость
« Ответ #5 : Июль 01, 2016, 13:12 »

Не, контроллер только один будет.
Он должен все вектора в себе содержать.

Но у меня сразу вопрос: если вектора пустые, то val2.last() работать не будет.
Что тогда предполагается делать?

сделаем так:
инициализировать вектора первым значением при создании, чтобы всегда было начальное значение для last()



а можно ли все таки через сигналы и слоты как то сделать? без контроллера?

например так (сорри за код т.к. не вполне могу свободно писать на С++):

Код:
someFunction { Sender.push_back(); }

class FVector : public QVector {

public slots:
    void push_back(value) {  
    emit valueChanged(value); //отсылаем всем кроме источника(как сделать?) на повтор последнего
}

signals:
    void valueChanged();

}

public:
 FVector() {
    connect(sender, &Sender::valueChanged, someFunction(&Sender));
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июль 01, 2016, 14:17 »

а можно ли все таки через сигналы и слоты как то сделать? без контроллера?
Можно, напр так
Код
C++ (Qt)
class FVec : public QObject, public QVector<myrecord>  {
Q_OBJECT
// тут рисуете слоты/сигналы
};
Но такое решение, мягко говоря, "неадекватно", а то и просто неграмотно, т.к. тратит массу ресурсов попусту, "зато" неудобно в использовании. Напр появился еще val4 - и придется связывать его сигналами со всеми уже имеющимися, причем дважды.
Записан
UVD
Гость
« Ответ #7 : Июль 01, 2016, 15:00 »

Можно, напр так
Код
C++ (Qt)
class FVec : public QObject, public QVector<myrecord>  {
Q_OBJECT
 
};

О! мне не хватало "public QObject, ", никак не мог победить ошибку "no matching function for call to 'QObject::connectImpl..."

теперь оно скопилировалось.
вот что я накорябал
Код
C++ (Qt)
class BUHRecords : public QObject, public QVector<buhrecord> {
     Q_OBJECT
public:
     BUHRecords() {
       QObject::connect(this, &BUHRecords::valueChanged, push_last);
     }
 
     void push_last() {
       QVector::push_back(QVector::last());
     }
 
public slots:
     void push_back(buhrecord irecord) {
       QVector::push_back(irecord);
       emit valueChanged();
       QVector::pop_back(); //remove duplicate because signal was worked
     }
 
signals:
     void valueChanged();
 
};
 

накорябал и как то сомнение начало грызть, что это заработает

p/s/ при объявлении переменной этого класса и компиляции - ошибка, пока отбросил данный вариант
« Последнее редактирование: Июль 01, 2016, 15:48 от UVD » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #8 : Июль 01, 2016, 22:28 »

с контроллером и сигналы не нужны, и векторов хоть 100500 можно наделать, а код не поменяется)
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Июль 02, 2016, 05:43 »

с контроллером и сигналы не нужны, и векторов хоть 100500 можно наделать, а код не поменяется)
Избегать жирных решений - это рефлекс, научить этому нельзя  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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