Сделать миниатюры, указывающие на реальное изображение - PullRequest
1 голос
/ 09 июня 2009

У меня есть 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++;
}

Заранее благодарю за помощь.

1 Ответ

2 голосов
/ 09 июня 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...