3

すでに似たような質問がありましたが、明確な回答が得られなかったので再度質問します。内部に 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;
};
4

1 に答える 1

1

数か月前に同様の問題に直面しました(Qt SQLテーブルビューを使用)。

要するに: CentralWidget->adjustSize(); を追加してみてください。MainWindow のサイズを調整するの行。

例:

...
scrollArea->setFixedSize(...);
canvas->adjustSize();
adjustSize();
updateGeometry();
...

説明: 私の場合、重要な要因は、UI を表示するために MainWindow + CentralWidget の組み合わせを使用していたことです。

「CentralWidgeted」 MainWindow のサイズをそのコンテンツのサイズに調整しようとすると、CentralWidget のサイズがコンテンツ サイズとして使用されます。このような状況では、MainWindow の adjustSize() メソッドはウィンドウを CentralWidget に合わせてサイズ変更しようとしますが、CentralWidget は元のサイズ [1] のままであるため、MainWindow は元のサイズを保持します。

[1]: 一部のウィジェットは自動的にサイズを変更できる可能性があります (特に思い出すことはできませんが、いくつかあると確信しています)。ただし、コードでは単純な QWidget を CentralWidget として使用しており、QWidget にはこの機能がありません ( QMainWindows と同じです)。このような「自動サイズ変更」ウィジェットを使用する場合、CentralWidget のサイズの調整は省略できます。

于 2014-08-28T07:47:31.690 に答える