c++ - Qt中如何正确使用adjustSize()

标签 c++ qt user-interface

我是 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;
};

关于c++ - Qt中如何正确使用adjustSize(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20771661/

相关文章:

c++ - libboost 中的 undefined symbol

c++ - 错误: "va_start" used in Win64 ABI funtion getting thi seero in clang help me to solve this?

c++ - Qt creator 添加外部库(还是: Cannot open include file: 'GL/glew.h' )

需要 QT 布局提示

user-interface - 您可以在 Google 表格单元格中以编程方式生成按钮吗?

c++ - 内存填充问题

c++ - 在 Qt 中将 QVector 写入文本文件

qt - 如何在qt中使用默认图标

c++ - QT-Graphics - 如何限制项目的移动

python - wxPython:sizers,网格让我发疯