Qt:从一个对象发出相同的信号,但参数不同;插槽通过接收的参数进行区分

时间:2013-12-11 15:44:59

标签: c++ qt opencv arguments signals-slots

在C ++中使用opencv我捕获图像并在处理完图像后我有四个图像: 原始的黄色,蓝色和绿色阈值图像。 最后,这些图像从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以某种方式用于设置相应的图像。

我可以想到使用多个信号来发射每个图像。 或者在captureImage信号中使用第二个参数 - int或enum - 来区分参数。 但我想知道是否有办法只使用一个信号和一个参数?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

你对将其归结为一个信号的痴迷有点不自然 - 在这种情况下没有理由这样做。

如果您真的希望,请不要忘记您正在使用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
    }
  }
};

答案 2 :(得分:1)

这里的正确答案是:

  • 创建4个单独的信号反而使您的生活变得复杂。
  • 或者添加一些值,这些值将定义应该发射的内容并使用特定值发出一次信号。