Qt:如何创建可滚动的,所有者绘制的小部件

时间:2014-03-07 16:57:04

标签: c++ qt

我需要创建一个可滚动的,所有者绘制的小部件,其行为很像QPlainTextEdit,带有包装文字,在高度取决于宽度的意义上 - 随着内容宽度的减小,内容高度增加。

这样做的最佳方法是什么?我正在考虑将QWidget-derived课程放在QScrollArea内,但QPlainTextEdit来自QScrollArea,而不是我应该走那条路?

另外,我只想在paintEvent()中绘制可见区域,否则会浪费。

现在我正在检查QPlainTextEdit的代码,但它相当复杂且不易阅读,所以如果有人知道在网络上更简单的代码示例,你可以给我一个链接,它会有很大的帮助。

1 个答案:

答案 0 :(得分:1)

我会发布我想出的解决方案。这不是最好的,但它主要起作用。

我最终没有从QAbstractScrollArea派生,而只是将我的小部件嵌入到QScrollArea中,并采用垂直布局,效果非常好。

我实现了resizeEvent()(我在QPlainTextEdit实现中看到了这一点),每次宽度发生变化时,我都会重新计算高度,并将小部件的最小高度设置为该高度。由于布局的工作原理,我设置了最小高度。

void MyWidget::resizeEvent(QResizeEvent *e)
{
    // If the widget's width has changed, we recalculate the new height
    // of our widget.
    if (e->size().width() == e->oldSize().width()) {
        return;
    }

    setMinimumHeight(calculateHeightFromWidth(e->size().width()));
}

仅绘制可见区域,请参阅Get visible area of QPainter