2009-06-09 3 views
1

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

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

ответ

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, это не полезно для этого кода.

Смежные вопросы