QT C ++,从子层次结构中调用main函数

时间:2019-07-11 12:29:12

标签: c++ qt

我目前正在开发需要这种架构的软件:

主程序-> OpcClient-> NodeConveyor-> NodeLoad

我知道在Main中创建了一个Client。 创建客户端后,他将创建xx NodeConveyors。 创建的每个NodeConveyor都会创建xx个NodeLoad。

创建NodeLoad后,我将检查一些参数,如果某些参数不好,请将信号传输到Main的插槽,以便在ui_mainwindow的QPlainText中显示它。

为此,我在NodeLoad类中创建了一个Signal,该信号连接到NodeConveyor类中的Slot。 NodeConveyor类的插槽发出一个连接到OpcClient类的插槽的信号。 OpcClient类的插槽发出连接到主程序插槽的信号。

但是,当我测试时,只有OpcClient类的信号与主程序的插槽之间的连接有效。

我正在使用MinGW 7.3.0 32位编译器来开发Qt 5.12.3

----- 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");
}

目前,仅当我发出一个clientIdError_Signal()时;直接从OPC_Client :: OPC_Client ...显示消息。

有人知道我的问题吗?

2 个答案:

答案 0 :(得分:0)

发射后连接信号和插槽。我的意思是,当信号发出时(在构造函数中),不存在任何连接。尝试在连接后发出信号(不是在构造函数中,而是在诸如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();
}

答案 1 :(得分:0)

是的,谢谢,这就是我昨天意识到的。我向对象的构造发出信号,或者在构造之后进行信号连接。

有没有一种方法可以将NodeConveyor的信号直接连接到主插槽?

我已经通过直接连接它们之间的信号来改进程序。然后我删除了中间插槽。