Russian Qt Forum

Qt => Вопросы новичков => Тема начата: UVD от Июль 01, 2016, 11:50



Название: Как связать все переменные одного класса сигналами и слотами между собой ?
Отправлено: 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());
...

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

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


Название: Re: Как связать все переменные одного класса сигналами и слотами между собой ?
Отправлено: Racheengel от Июль 01, 2016, 12:25
Не вектора надо связывать, а сделать контроллер, который будет их синхронизировать.
Т.е. он будет содержать все вектора внутри себя и иметь метод типа

AddRecord(myrecord& new_myrecord)
{
val1.push_back(new_myrecord);
val2.push_back(new_myrecord);
val3.push_back(new_myrecord);
}


Название: Re: Как связать все переменные одного класса сигналами и слотами между собой ?
Отправлено: UVD от Июль 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 вектор добавлю все остальные контроллеры переписывать надо?


Название: Re: Как связать все переменные одного класса сигналами и слотами между собой ?
Отправлено: Racheengel от Июль 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() работать не будет.
Что тогда предполагается делать?


Название: Re: Как связать все переменные одного класса сигналами и слотами между собой ?
Отправлено: Igors от Июль 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, добавляли в свой конец значение своей последней записи
Возникают сильные сомнения что так действительно "надо". Обычно в таких случаях используются индексы чтобы не дублить данные


Название: Re: Как связать все переменные одного класса сигналами и слотами между собой ?
Отправлено: UVD от Июль 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));
}


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


Название: Re: Как связать все переменные одного класса сигналами и слотами между собой ?
Отправлено: UVD от Июль 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/ при объявлении переменной этого класса и компиляции - ошибка, пока отбросил данный вариант


Название: Re: Как связать все переменные одного класса сигналами и слотами между собой ?
Отправлено: Racheengel от Июль 01, 2016, 22:28
с контроллером и сигналы не нужны, и векторов хоть 100500 можно наделать, а код не поменяется)


Название: Re: Как связать все переменные одного класса сигналами и слотами между собой ?
Отправлено: Igors от Июль 02, 2016, 05:43
с контроллером и сигналы не нужны, и векторов хоть 100500 можно наделать, а код не поменяется)
Избегать жирных решений - это рефлекс, научить этому нельзя  :)