QT C ++, вызов функции в main из дочерних иерархий - PullRequest
0 голосов
/ 11 июля 2019

В настоящее время я занимаюсь разработкой программного обеспечения, которому требуется эта архитектура:

Основная программа -> OpcClient -> NodeConveyor -> NodeLoad

Зная, что в главном я создаю одного клиента.Когда клиент создан, он создает xx NodeConveyors.Каждый созданный NodeConveyor создает xx NodeLoads.

После создания NodeLoad я проверяю некоторые параметры и хотел бы, если они не подходят, передать сигнал в слот Main, чтобы отобразить его в QPlainText изui_mainwindow.

Для этого я создал Signal в классе NodeLoad, который подключен к слоту в классе NodeConveyor.Слот класса NodeConveyor излучает сигнал, подключенный к слоту класса OpcClient.Слот класса OpcClient излучает сигнал, подключенный к слоту основной программы.

Однако при тестировании работает только соединение между сигналом класса OpcClient и слотом основной программы.

Я работаю над Qt 5.12.3 с 32-битным компилятором MinGW 7.3.0

----- Класс NodeLoad -----

NodeLoad::NodeLoad(QOpcUaClient* client, int x, int y,QString opcNameSpace)
{
    if(QOpcUa::BadNodeIdUnknown) emit NodeIdError_Signal();
}

----- Класс NodeConveyor -----

NodeConveyor::NodeConveyor(QOpcUaClient* client,int x,QString opcNameSpace)
{
    for(int y(0);y<1;y++)
    {
        Load[y] = new NodeLoad(client,x,y,opcNameSpace);
        connect(Load[y],SIGNAL(NodeIdError_Signal()),this,SLOT  (ConveyorIdError_Slot()));
    }
}
void NodeConveyor::ConveyorIdError_Slot()
{
    emit ConveyorIdError_Signal();
}

----- Класс OPC_CLient -----

OPC_Client::OPC_Client(QString ServerUrl): m_servUrl(ServerUrl)
{
    for(int i(0);i<nbConveyors;i++)
    {
        conveyor[i] = new NodeConveyor(m_client,i,"ns=2;");
        connect(conveyor[i],SIGNAL(ConveyorIdError_Signal()),this,SLOT(ClientIdError_Slot()));
    }
}
void OPC_Client::ClientIdError_Slot()
{
    emit ClientIdError_Signal();
}

----- Класс OPC_Main-----

OPC_Main::OPC_Main(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::OPC_Main),
{
    OPC_client = new OPC_Client("opc.tcp://127.0.0.1:49320");
    connect(OPC_client,SIGNAL(ClientIdError_Signal()),this,SLOT(IdError_Slot()));
}
void iMPRESS_OPC_Main::IdError_Slot()
{
    ui->mLog->appendHtml(QTime::currentTime().toString("h:mm:ss ") + "<font color=\"Red\">" + " - Error Tag Names doesn't match");
}

В настоящее время, только когда я делаю emit clientIdError_Signal ();непосредственно из OPC_Client :: OPC_Client ... отображается сообщение.

Кто-нибудь есть идеи для моей проблемы?

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Да, спасибо, это то, что я понял вчера. Я посылаю сигнал на строительство объекта, или сигнальное соединение производится после строительства.

И есть ли способ напрямую подключить сигнал NodeConveyor к слоту в главном?

Я уже улучшаю программу, напрямую подключая сигналы между ними. И я удалил промежуточные слоты.

0 голосов
/ 11 июля 2019

Вы подключаете сигналы и слоты после излучения. Я имею в виду, когда сигнал излучает (в конструкторе), связь не существует. Попробуйте испустить сигнал после соединения (не в конструкторе, а в каком-то методе, например NodeLoad::CheckForErrors(), который вы будете вызывать после конструктора). Как то так

NodeConveyor::NodeConveyor(QOpcUaClient* client,int x,QString opcNameSpace)
{
    for(int y(0);y<1;y++)
    {
        Load[y] = new NodeLoad(client,x,y,opcNameSpace);
        connect(Load[y],SIGNAL(NodeIdError_Signal()),this,SLOT  (ConveyorIdError_Slot()));
        Load[y]->CheckForErrors();
    }
}

void NodeLoad::CheckForErrors()
{
    if(QOpcUa::BadNodeIdUnknown) emit NodeIdError_Signal();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...