すでに似たような質問がありましたが、明確な回答が得られなかったので再度質問します。内部に QMainWindow と QScrollArea があるとします。プログラムで QScrollArea のサイズを変更し、それに応じてウィンドウのサイズを変更します。次のコードはほぼ正しく動作します。新しい画像が古い画像よりも大きい場合、ウィンドウのサイズが大きくなります。ただし、新しい画像が小さくなっても、ウィンドウは小さくなりません。代わりに、QScrollArea だけが小さくなり、QScrollArea と他の要素 (ラベル、ボタン) の間に大きなスペースが表示されます。
class PictureDialog : public QMainWindow {
Q_OBJECT
public:
PictureDialog() : QMainWindow() {
QWidget* canvas = new QWidget(this);
setCentralWidget(canvas);
QVBoxLayout* layout = new QVBoxLayout(canvas);
imageLabel = new QLabel(" ");
imageLabel->setStyleSheet("QLabel { background-color : white; color : black; }");
scrollArea = new QScrollArea(this);
scrollArea->resize(300, 300);
scrollArea->setBackgroundRole(QPalette::Dark);
scrollArea->setWidget(imageLabel);
layout->addWidget(scrollArea);
imgnamelabel = new QLabel(tr("Picture: "), this);
layout->addWidget(imgnamelabel);
QHBoxLayout *hlayout = new QHBoxLayout();
layout->addLayout(hlayout);
yesButton = new QPushButton(QPixmap(":pics/yes.png"), QString::null, this);
yesButton->setShortcut(Qt::Key_Plus);
yesButton->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
hlayout->addWidget(yesButton);
noButton = new QPushButton(QPixmap(":pics/no.png"), QString::null, this);
noButton->setShortcut(Qt::Key_Minus);
noButton->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
hlayout->addWidget(noButton);
hlayout->addStretch();
connect(yesButton, SIGNAL(clicked()), SLOT(hide()));
connect(noButton, SIGNAL(clicked()), SLOT(hide()));
}
void setPicture(QString imagePath, bool showNo) {
imgnamelabel->setText(tr("Picture: ") + imagePath);
if (!QFile::exists(imagePath)) {
imageLabel->setText(tr("Picture file not found: ") + imagePath);
imageLabel->resize(imageLabel->fontMetrics().boundingRect(imageLabel->text()).width(),
imageLabel->fontMetrics().boundingRect(imageLabel->text()).height());
} else {
QImage image(imagePath);
if (image.isNull()) {
imageLabel->setText(tr("Failed to open picture file: ") + imagePath);
imageLabel->resize(imageLabel->fontMetrics().boundingRect(imageLabel->text()).width(),
imageLabel->fontMetrics().boundingRect(imageLabel->text()).height());
} else {
imageLabel->setPixmap(QPixmap::fromImage(image));
imageLabel->resize(image.width(), image.height());
}
}
scrollArea->setFixedSize(mini(imageLabel->width() + 20, QApplication::desktop()->screenGeometry().width() * 8 / 10),
mini(imageLabel->height() + 20, QApplication::desktop()->screenGeometry().height() * 8 / 10));
adjustSize();
updateGeometry();
if (showNo)
noButton->setEnabled(true);
else
noButton->setEnabled(false);
}
QPushButton *yesButton, *noButton;
private:
QLabel *imageLabel;
QLabel *imgnamelabel;
QScrollArea* scrollArea;
};