-1

ねえ、私はこの機能を持っています。これはうまく機能し、画像を適切に拡大縮小し、UI からの正しいショートカットを指定して縮小および拡大します。

ただし、画像の元の倍率にズームバックすると、画質が低下します。グローバルな「const QPixmap*」である「orig」を作成してみました。'orig' は、画像が UI に読み込まれるときに定義されます。次に、'pixmap = orig' を設定します (以下のコードを参照)。

アイデアは、元のピックスマップを書き換えずにコピーを作成し、ピクセル品質を維持し、関数が呼び出されるたびに元のピックスマップをリロードすることです。

void FragTreeViewer::scaleImage(double factor)
{
  Q_ASSERT(imageLabel->pixmap());
  const QPixmap* pixmap = orig;
  scaleFactor *= factor;
  int w = (imageLabel->width())*scaleFactor;
  int h = (imageLabel->height())*scaleFactor;
  imageLabel->setPixmap(pixmap->scaled(w, h, Qt::KeepAspectRatio));


  adjustScrollBar(scrollArea->horizontalScrollBar(), scaleFactor);
  adjustScrollBar(scrollArea->verticalScrollBar(), scaleFactor);

  //zoomInAct->setEnabled(scaleFactor < 3.0);
  //zoomOutAct->setEnabled(scaleFactor > 0.333);
}

http://postimg.org/image/3ukrme54b/

4

1 に答える 1

5

関連するコードを表示していません。表示するものは問題ありません。私が収集できることから、ラベルに表示されているピックスマップとラベル自体の両方のサイズを変更しようとしています。両方ではなく、どちらか一方を行う必要があります。ラベルのサイズを変更し、スクロール領域を魔法のように機能させるのが最も簡単です。これにより、事件全体が簡単になります。

以下のコードは、修正に必要な変更はありませんが、質問に投稿する必要があるものです。

例のスクリーンショット

// https://github.com/KubaO/stackoverflown/tree/master/questions/image-view-scale-31619246
#include <QtWidgets>
#include <QtNetwork>

class FragTreeViewer : public QWidget {
   QGridLayout m_layout{this};
   QScrollArea m_area;
   QLabel m_imageLabel, m_scaleLabel;
   QPushButton m_zoomOut{"Zoom Out"}, m_zoomIn{"Zoom In"};
   double m_scaleFactor = 1.0;
public:
   void setImage(const QImage & img) {
      m_scaleFactor = 1.0;
      m_imageLabel.setPixmap(QPixmap::fromImage(img));
      scaleImage(1.0);
   }
   FragTreeViewer() {
      m_layout.addWidget(&m_area, 0, 0, 1, 3);
      m_layout.addWidget(&m_zoomOut, 1, 0);
      m_layout.addWidget(&m_scaleLabel, 1, 1);
      m_layout.addWidget(&m_zoomIn, 1, 2);
      m_area.setWidget(&m_imageLabel);
      m_imageLabel.setScaledContents(true);
      connect(&m_zoomIn, &QPushButton::clicked, [this]{ scaleImage(1.1); });
      connect(&m_zoomOut, &QPushButton::clicked, [this]{ scaleImage(1.0/1.1); });
   }
   void scaleImage(double factor) {
      m_scaleFactor *= factor;
      m_scaleLabel.setText(QStringLiteral("%1%").arg(m_scaleFactor*100, 0, 'f', 1));
      QSize size = m_imageLabel.pixmap()->size() * m_scaleFactor;
      m_imageLabel.resize(size);
   }
};

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   FragTreeViewer viewer;
   QNetworkAccessManager mgr;
   QScopedPointer<QNetworkReply> rsp(
            mgr.get(QNetworkRequest({"http://i.imgur.com/ikwUmUV.jpg"})));
   QObject::connect(rsp.data(), &QNetworkReply::finished, [&]{
      if (rsp->error() == QNetworkReply::NoError)
         viewer.setImage(QImage::fromData(rsp->readAll()));
   });
   viewer.show();
   return a.exec();
}
于 2015-07-24T20:37:49.383 に答える