我是Qt的新手,有关自动调整大小的问题使我发疯。

我创建了一个名为RenderArea的类,该类继承了QWidget。在其paintEvent()中,我使用QPainter绘制图像。为了使整个窗口随图像缩放,我在绘画之前调整了大小。相关代码是

if (image && !image->isNull())
{
    resize(image->size());
    painter.drawImage(image->rect(), *image, image->rect());
}

但是,RenderArea会在其他小部件(如按钮和菜单)中延伸太多。它包含在具有垂直布局的centralWidget中。但是,当我调用centralWidget->adjustSize()时,它并不能将所有内容缩放在一起,而是缩小RenderArea t并隐藏图像。

如何指示中央窗口小部件以及窗口以自定义窗口小部件的新大小缩放?我知道我可以使用QLabel并将其scaledContents设置为true,但是我需要很多其他复杂的渲染,因此仅使用QLabel是不够的。

最佳答案

sizeHint函数应返回建议的小部件尺寸。因此,RenderArea应该返回图像大小作为其sizeHint。更改图像后,应调用updateGeometry函数以更新缓存的sizeHint值:

class RenderArea : public QWidget
{
public:
    explicit RenderArea(const QImage &image, QWidget *parent = 0)
        : QWidget(parent), m_image(image)
    {
    }

    QSize sizeHint() const
    {
        return m_image.isNull() ? QWidget::sizeHint() : m_image.size();
    }

    void paintEvent(QPaintEvent *event)
    {
        QWidget::paintEvent(event);
        if (!m_image.isNull())
        {
            QPainter painter(this);
            painter.drawImage(rect(), m_image, m_image.rect());
        }
    }

    void setImage(const QImage &image)
    {
        m_image = image;
        updateGeometry();
    }

private:
    QImage m_image;
};

调整子窗口小部件的大小时,父窗口小部件不会自动执行此操作。幸运的是,有一个QWidget::adjustSize函数,它使我们能够调整父窗口小部件的大小以适合其内容:
class Window : public QWidget
{
    Q_OBJECT

private slots:
    void onImageChanged(const QString &fileName)
    {
        m_area->setImage(QImage(fileName));
        adjustSize();
    }

private:
    RenderArea *m_area;
};

08-26 19:42