繁体   English   中英

Qt:从一个物体发出相同的信号,但是参数不同; 插槽按收到的参数区分

[英]Qt: Emit same signal from one object but with different arguments; Slot distinguish by received argument

在使用opencv的C ++中,我捕获了一个图像,并且在处理完图像后,我得到了四个图像:原始的黄色,蓝色和绿色阈值图像。 最后,这些图像从ImageProcessing类发出:

Q_EMIT capturedImage(iImageOriginal);
Q_EMIT capturedImage(iImageYellowThreshold);
Q_EMIT capturedImage(iImageBlueThreshold);
Q_EMIT capturedImage(iImageGreenThreshold);

其中iImage ...是QImage。

要在MainWindow类中显示图像,有一个插槽应根据所选的comboBox(cbSelectCameraImage)索引显示“正确的”图像:

void MainWindow::setImage(QImage iImage)
{
    if (ui->cbSelectCameraImage->currentText() == "Original Camera Image")
    {   
        // Here I need to set the corresponding image only if the 
        // signal cpaturedImage was emitted with argument iImageOriginal
        ui->lblCamera->setPixmap(QPixmap::fromImage(iImage));
    }
    else if (ui->cbSelectCameraImage->currentText() == "Yellow Threshold")
    {
        // Here I need to set the corresponding image only if the 
        // signal cpaturedImage was emitted with argument iImageYellowThreshold
        ui->lblCamera->setPixmap(QPixmap::fromImage(iImage));
    }
    else if (ui->cbSelectCameraImage->currentText() == "Blue Threshold")
    {
        ui->lblCamera->setPixmap(QPixmap::fromImage(iImage));
    }
    else if (ui->cbSelectCameraImage->currentText() == "Green Threshold")
    {
        ui->lblCamera->setPixmap(QPixmap::fromImage(iImage));
    }
}

其中lblCamera是QLabel

主要问题是是否有一种方法可以通过接收到的参数来区分? 或者,是否可以通过某种方式获取文本iImageYellowThreshold来设置相应的图像。

我可以想到使用多个信号来发射每个图像。 对于我们来说,也可以在captureedImage信号中使用第二个参数-int或enum-来区分参数。 但是我想知道是否有一种方法可以只使用一个信号和一个参数?

枚举或整数可以用作第二个参数,或者可以使用QSignalMapper和多个信号。

无法通过接收到的参数来区分,因为在所有情况下接收到的参数都将是QImage,除非QImage中有一些信息可以让您唯一地区分图像类型-例如图像格式或可以从中检索的颜色托盘QImage,

您对将其降低到一个信号的痴迷有些不自然-在这种情况下没有理由。

如果您确实希望,请不要忘记您正在使用C ++。 您可以在运行时通过多态传递类型信息。

class ImageOriginal : public QImage {
  ImageOriginal(const QImage & img) : QImage(img) {}
};

class ImageYellowThreshold : public QImage {
  ImageYellowThreshold(const QImage & img) : QImage(img) {}
};

class Sender : public QObject {
  Q_OBJECT
public:
  Q_SIGNAL void signal(const QImage &);
  void test() {
    QImage img;
    emit signal(ImageOriginal(img));
};

class Receiver : public QObject {
  Q_OBJECT
public:
  Q_SLOT void slot(const QImage & image) {
    if (dynamic_cast<ImageOriginal*>(&image)) {
      // this is the original image
    }
    else if (dynamic_cast<ImageYellowThreshold*>(&image)) {
      // this is the yellow threshold image
    }
    else {
      // generic image
    }
  }
};

正确的答案是:

  • 创建4个单独的信号会使您的生活变得复杂。
  • 或添加一些值,该值将定义应发射的信号并以特定值发射一次信号。

暂无
暂无

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

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