Сделайте так, чтобы миниатюры указывали на реальное изображение

У меня есть QHBox с пользовательским виджетом, который наследует QLabel, который перебирает все файлы изображений в каталоге и создает миниатюру.

Эта часть работает нормально, однако мне нужно реализовать функциональность для отображения исходного изображения, из которого была создана миниатюра, в центральном виджете QLabel для отображения изображений.

Как лучше всего это сделать? Прямо сейчас сигнал clicked() отображает только QPixmap из QLabel (миниатюра), мне нужно, чтобы он загружал исходное полноразмерное изображение в 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++;
}

Спасибо заранее за вашу помощь.


person Community    schedule 09.06.2009    source источник


Ответы (1)


Вообще говоря, создавать сложные объекты через сигнал и слоты — плохая идея. Если вам нужно выдавать сложные объекты, лучше хранить их в QMap и выдавать ключ QMap (строку или целое число).

Для вашей проблемы, я думаю, вам нужно использовать следующий подход:

  • сохраните путь растрового изображения в вашей метке изображения, чтобы узнать, какая метка изображения была нажата, было достаточно информации для отображения полной картины.
  • используйте 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, для этого кода это было бесполезно.

person Philippe F    schedule 09.06.2009