Qt отправляет данные из родительского в дочерний виджет - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть 2 виджета, унаследованных от QDialog .Один из этих виджетов вызывается другим виджетом.

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

Я могу сделать сигналы и слоты в обоих классах.Слот родительского класса виджетов - TransferList (QStringList) - заполняет мой QStringList.

Как мне установить соединение между сигналом и слотом?Дочерний виджет, конечно, ничего не знает о родителе.

// .h-file of parent widget. 
class ElectricIndicationDialog : public QDialog {

#include "PollIndication.h" // class of child widget
QSharedPointer <PollIndication> pollInd;

public slots:
    void transferList(QStringList);
signals:
    void listTfansfer(QStringList);
private:
    QStringList sendList;
};


// .cpp-file of parent widget
pollInd = QSharedPointer <PollIndication>(new PollIndication());
pollInd->show();

void ConfIndication::transferList(QStringList lst) {
    lst.append("str1");
    lst.append("str2");
}


// .h-file of child widget
class PollIndication : public QDialog {
public slots:
    void getList(QStringList);
signals:
    void listGet(QStringList);
private:
    QStringList recList; // We transfer data to it
}

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Обычно плохой идеей сделать родительский класс, чтобы знать, каковы его дети ....

вы можете в родительском классе определить абстрактный метод (подумайте о каком-то чисто виртуальном), чтобы каждый дочерний классвынужден реализовать это ... после этого родительский класс может вызывать метод, а дочерний будет реализовывать логин в зависимости от того, как он должен на него реагировать ...

0 голосов
/ 04 февраля 2019

Для этого вам не нужен сигнал / слот: ваш родитель знает тип своего потомка и имеет указатель на него.Таким образом, вы можете вызвать метод PollIndication, когда вам нужно отправить данные в ваш диалог.

void ConfIndication::transferList(QStringList lst) {
    lst.append("str1");
    lst.append("str2");
    pollInd->changeTransferList(lst);
}

Если ваш диалог модальный, вы также можете создать его только тогда, когда это необходимо, и указать свой список в качестве параметраконструктор.

void ConfIndication::transferList(QStringList lst) {
    lst.append("str1");
    lst.append("str2");
    PollIndication* pollInd = new PollIndication(lst, this);
    pollInd->exec();
}
...