Siy*_*Ren 4 c++ user-interface qt
我是 Qt 新手,这个关于自动调整大小的问题让我发疯。
我创建了一个名为RenderArea
继承的类QWidget
。在其中paintEvent()
,我使用 aQPainter
来绘制图像。为了使整个窗口与图像一起缩放,我在绘画之前调整大小。相关代码是
if (image && !image->isNull())
{
resize(image->size());
painter.drawImage(image->rect(), *image, image->rect());
}
Run Code Online (Sandbox Code Playgroud)
但是,RenderArea
会通过其他小部件(如按钮和菜单)拉伸太多。它包含在centralWidget
垂直布局中。但是当我调用它时centralWidget->adjustSize()
,它不会将所有内容缩放到一起,而是缩小RenderArea
t 并隐藏图像。
如何指示中央小部件以及窗口根据自定义小部件的新尺寸进行缩放?我知道我可以使用 aQLabel
并将其设置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;
};
Run Code Online (Sandbox Code Playgroud)
当子窗口小部件调整大小时,父窗口小部件不会自动执行此操作。幸运的是,有一个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;
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12541 次 |
最近记录: |