使缩略图指向真实图像

时间:2009-06-09 00:35:14

标签: c++ qt4

我有一个带有自定义小部件的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++;
}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

一般来说,通过信号和插槽发射复杂对象是个坏主意。如果需要发射复杂对象,最好将它们存储在QMap中并发出QMap的键(字符串或整数)。

对于您的问题,我认为您需要采取以下方法:

  • 将pixmap路径存储在ImageLabel中,以便了解单击哪个ImageLabel是足以显示完整图片的信息
  • 使用QSignalMapper,文档中的示例与您想要的内容非常接近。

基本上,您可以安排信号映射器发出一个信号,该信号的属性是发出信号的小部件的一部分。在您的情况下,您可以将每个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的使用,它对该代码没用。