1

ディレクトリ内のすべての画像ファイルを反復処理してサムネイルを生成する QLabel を継承するカスタムウィジェットを備えた QHBox があります。

この部分は正常に動作していますが、画像を表示するための中央の 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++;
}

よろしくお願いいたします。

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 に答える