首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Qt中正确使用adjustSize()

如何在Qt中正确使用adjustSize()
EN

Stack Overflow用户
提问于 2013-12-25 18:20:52
回答 1查看 9.4K关注 0票数 3

我是Qt的新手,这个关于自动调整大小的问题让我抓狂。

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

代码语言:javascript
复制
if (image && !image->isNull())
{
    resize(image->size());
    painter.drawImage(image->rect(), *image, image->rect());
}

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-25 21:49:15

sizeHint函数应该返回推荐的小部件大小。所以RenderArea应该返回图像大小作为它的sizeHint。当图像改变时,应该调用updateGeometry函数来更新缓存的sizeHint值:

代码语言:javascript
复制
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函数可以让我们调整父窗口小部件的大小以适应它的内容:

代码语言:javascript
复制
class Window : public QWidget 
{
    Q_OBJECT

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

private:
    RenderArea *m_area;
};
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20771661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档