1

我有一个带有自定义小部件的 QHBox,它继承了 QLabel,它遍历目录中的所有图像文件并生成缩略图。

这部分工作正常,但是我需要实现显示原始图像的功能,在中央 QLabel 小部件中生成缩略图以显示图片。

这样做的最佳方法是什么?现在 clicked() 信号只显示来自 QLabel(thumbnail) 的 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++;
}

预先感谢您的帮助。

4

1 回答 1

2

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

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

  • 将像素图路径存储在 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 的使用,它对该代码没有用。

于 2009-06-09T08:45:40.897 回答