Я использую QGraphicsView и QGraphicsScene, чтобы отобразить загруженное изображение, а затем показать на нем некоторый рисунок.Я загружаю и изображение выглядит так:
void MeasuresWidget::on_openAction_triggered()
{
QString fileName = QFileDialog::getOpenFileName(this,tr("Open File"), QDir::currentPath());
if (!fileName.isEmpty())
{
QImage image(fileName);
if (image.isNull())
{
QMessageBox::information(this, tr("Measures Application"), tr("Cannot load %1.").arg(fileName));
return;
}
scene->clear();
scene->addPixmap(QPixmap::fromImage(image).scaledToWidth(w, Qt::SmoothTransformation));
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что если я загружаю изображение, которое меньше, чем то, которое было загружено ранее, кажется, что есть пустое пространство, т.е.сцена сохраняет размер предыдущего изображения (больше) и больше текущего.Я пытался сохранить исходный размер сцены в отдельной переменной и использовать setSceneRect()
в каждом действии загрузки:
//in constructor
originalRect = ui->graphicsView->rect();
//in upload action
scene->setSceneRect(originalRect);
, но в результате размер сцены всегда остается неизменным и, если он больше, чем фактическое изображение,режет это.Я использовал QLabel для отображения изображения раньше, и я использовал функцию QLabel::setScaledContents()
, и она работала нормально для меня.Итак, мой вопрос: могу ли я добиться того же поведения с QGraphicsScene?
Обновление 1: Приложение ведет себя так, как я хочу, если я создаю новую сцену при каждом действии загрузки.Код теперь выглядит так:
void MeasuresWidget::on_openAction_triggered()
{
scene = new QGraphicsScene(this);
ui->graphicsView->setScene(scene);
QString fileName = QFileDialog::getOpenFileName(this,tr("Open File"), QDir::currentPath());
if (!fileName.isEmpty())
{
QImage image(fileName);
if (image.isNull())
{
QMessageBox::information(this, tr("Image Viewer"), tr("Cannot load %1.").arg(fileName));
return;
}
scene->clear();
scene->addPixmap(QPixmap::fromImage(image).scaledToWidth(w, Qt::SmoothTransformation));
}
}
Это нормально?Могу ли я достичь желаемого поведения без необходимости создавать новую сцену при каждом загрузке?