C++ 如何在Qt中正确使用adjustSize()
我是Qt新手,这个关于自动调整大小的问题让我抓狂 我创建了一个名为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
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()
,它们的大小不应该相同吗?此外,为什么只有当中心小部件具有布局时,这才起作用?即使小部件大小和图像大小最初相等,小部件大小也可以更改。例如,用户可以使用鼠标更改整个窗口的大小。没有任何布局的小部件不知道如何管理其子部件的几何体。