在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 - 来区分参数。 但我想知道是否有办法只使用一个信号和一个参数?
答案 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)
这里的正确答案是: