我有一个带有自定义小部件的QHBox,它继承了QLabel,它遍历dir中的所有图像文件并生成缩略图。
这部分工作正常,但是我需要实现这个功能,以便在中央QLabel小部件中显示生成缩略图的原始图像,用于绘制图片。
这样做的最佳方法是什么?现在clicked()信号只显示来自QLabel(缩略图)的QPixmap,我需要它做的是将原始的全尺寸图像加载到位于中心的QLabel上。
我猜我需要一个列表来识别每个缩略图及其独特的全尺寸图像,但我不知道如何实现这样的事情。
请告诉我应该如何执行此操作,因为我觉得我有点迷失了该怎么做。
我的代码现在看起来像这样:
QList<ImageLabel *> labels;
int imagenum = 0;
foreach(const QString &path, files) {
QPixmap px(path);
labels.append(new ImageLabel);
labels[imagenum]->setPixmap(px.scaledToHeight(90));
qhbox->addWidget(labels[imagenum]);
connect(labels[imagenum], SIGNAL(clicked(const QPixmap&)), this, SLOT(setImage(const QPixmap &)));
imagenum++;
}
提前感谢您的帮助。
答案 0 :(得分:2)
一般来说,通过信号和插槽发射复杂对象是个坏主意。如果需要发射复杂对象,最好将它们存储在QMap中并发出QMap的键(字符串或整数)。
对于您的问题,我认为您需要采取以下方法:
基本上,您可以安排信号映射器发出一个信号,该信号的属性是发出信号的小部件的一部分。在您的情况下,您可以将每个ImageLabel映射到路径(如果它正在显示图像),并让信号映射器将路径作为信号的一部分发出。
一些未经测试的代码尝试:
QList<ImageLabel *> labels;
signalMapper = new QSignalMapper( this );
foreach(const QString &path, files) {
QPixmap px(path);
imgLabel = new ImageLabel();
labels.append( imgLabel );
imgLabel->setPixmap(px.scaledToHeight(90));
qhbox->addWidget(imgLabel);
connect(imgLabel, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping( imgLabel, path );
}
connect( signalMapper, SIGNAL(mapped(const QString &)),
this, SLOT(setImagePath()));
我删除了imagenum的使用,它对该代码没用。