首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT C++,从子层次结构调用main中的函数

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

Stack Overflow用户
提问于 2019-07-11 20:29:12
回答 2查看 58关注 0票数 0

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

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

知道了这一点,我基本上创建了一个客户端。当创建客户端时,他创建xx NodeConveyors。创建的每个NodeConveyor都会创建xx NodeLoads。

一旦创建了NodeLoad,我就会检查一些参数,如果有些参数不是很好,就向Main的一个插槽发送一个信号,以便在ui_mainwindow的QPlainText中显示出来。

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

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

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

-NodeLoad类

代码语言:javascript
复制
NodeLoad::NodeLoad(QOpcUaClient* client, int x, int y,QString opcNameSpace)
{
    if(QOpcUa::BadNodeIdUnknown) emit NodeIdError_Signal();
}

-NodeConveyor类

代码语言:javascript
复制
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类

代码语言:javascript
复制
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类

代码语言:javascript
复制
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");
}

目前,只有当我直接从OPC_Client ::OPC_Client中发出一个emit clientIdError_Signal ();此时将显示该消息。

有人对我的问题有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-12 00:36:33

您可以在发射后连接信号和插槽。我的意思是,当信号发出(在构造函数中)时,不存在连接。尝试在连接之后发出信号(不是在构造函数中,而是在一些方法中,比如在构造函数之后调用NodeLoad::CheckForErrors() )。像这样的东西

代码语言:javascript
复制
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();
}
票数 0
EN

Stack Overflow用户

发布于 2019-07-12 16:04:25

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

有没有办法将NodeConveyor的信号直接连接到电源插座上?

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56989226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档