Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在Qt中正确使用adjustSize()_C++_Qt_User Interface - Fatal编程技术网

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

C++ 如何在Qt中正确使用adjustSize(),c++,qt,user-interface,C++,Qt,User Interface,我是Qt新手,这个关于自动调整大小的问题让我抓狂 我创建了一个名为RenderArea的类,它继承了QWidget。在它的paintEvent()中,我使用QPainter绘制图像。为了使整个窗口与图像缩放,我在绘制之前调整大小。有关守则如下: if (image && !image->isNull()) { resize(image->size()); painter.drawImage(image->rect(), *image, image

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

我创建了一个名为
RenderArea
的类,它继承了
QWidget
。在它的
paintEvent()
中,我使用
QPainter
绘制图像。为了使整个窗口与图像缩放,我在绘制之前调整大小。有关守则如下:

if (image && !image->isNull())
{
    resize(image->size());
    painter.drawImage(image->rect(), *image, image->rect());
}
但是,
RenderArea
会通过其他小部件(如按钮和菜单)拉伸太多。它包含在一个垂直布局的
中心Widget
中。但是当我调用
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;
};

调整内部paintEvent的大小似乎无效(或至少不寻常)。除此之外,小部件通常不应该调整自身大小。您应该重新实现
sizeHint()
,让布局知道小部件的首选大小。当您想更改
sizeHint()
时,请调用
updateGeometry()
@PavelStrakhov:我尝试了您的建议,删除了
resize()
,覆盖
sizeHint()
,并在绘制图像之前调用了
updateGeometry
。没有发生自动缩放。我必须从父窗口小部件调用resize吗?有了你的代码和大量的尝试和错误,我终于让它工作了。仍然让我困惑的是,我必须使用
painter.drawImage(rect(),m_image,m_image.rect())并且不能使用
painter.drawImage(m_image.rect(),m_image,m_image.rect())。为什么?既然
sizeHint()
返回
m\u image.size()
,它们的大小不应该相同吗?此外,为什么只有当中心小部件具有布局时,这才起作用?即使小部件大小和图像大小最初相等,小部件大小也可以更改。例如,用户可以使用鼠标更改整个窗口的大小。没有任何布局的小部件不知道如何管理其子部件的几何体。