[英]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
}
}
};
正确的答案是:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.