繁体   English   中英

如何使用 QT 中的两个信号执行插槽或 function?

[英]How to execute a slot or a function with two signals in QT?

我正在研究 QT 项目。 我想知道是否可以使用两个信号创建一个connection来执行一个方法。

我有三个班级:A、B 和 C。 Class A emit a signal when a button is pressed (connected in Class C), also in Class C a QProcess is created (from an instance of class B).

在 class C 我有一个connect来获取QProcess的 output 。 另外,当按下按钮时,我还有另一个connect来执行方法(Class A 中发出的信号)。

所以,我需要修改当前的行为, doSomething()方法应该在 QProcess output 准备好时执行,类似于if语句:

if(signalA && signal B){
  do something...
}

这是当前代码:

//This signal will get the output of a Qprocess
connect(objectC,&QProcess::readyReadStandardOutput, [=] (){
    QString out = objectB->readAllStandardOutput();
    qDebug() << out;
});

//When a button in Class A is pressed doSomething() is executed
//but now I must wait until the above signal generates an output.
connect(objectA, ClassA::buttonPressed, [=] (){
    doSomething();
});

objectC -> run(args); // This line execute an external process

关于如何实现这一目标的任何想法?

我在stackoverflow上发现,在 QT 中,我们可以在一个connect中有两个信号,如下所示:

connect(this,SIGNAL(someSignal()),this,SIGNAL(anotherSignal()));

但我不知道如何适应我的问题。

我的 QT 应用程序的流程如下:

  • 创建一个QProcess来启动一个 external.exe 文件

  • QProcess返回一个QString

  • 用户可以随时按下将执行特定方法( doSomething() )但需要QProcess的 output 的按钮。

  • 最大的问题是有时用户在 QProcess 结束之前按下按钮,所以我无法正确执行doSomething()

  • 期望的行为是:如果用户按下按钮执行doSomething() ,首先我必须等到 QProcess 的 output 准备好。 因此,如果我按下按钮并且QProcess需要 10 秒才能完成,那么doSomething()应该在这 10 秒之后执行。

您可以存储两个事件的 state 并在其中一个发生更改时检查它们。

// These should probably be defined in the header of your class.
bool processFinished = false;
bool buttonClicked = false;

void checkState() {
    if (buttonClicked && processFinished) {
        doSomething();
    }
}

connect(objectC,&QProcess::readyReadStandardOutput, [=] (){
    ...
    processFinished = true;
    checkState();
});

connect(objectA, ClassA::buttonPressed, [=] (){
    ...
    buttonClicked = true;
    checkState();
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM