2014-03-07 24 views
2

我需要創建一個滾動的,自行繪製的窗口小部件,其行爲很像0​​與自動換行文本,在高度依賴於寬的意義 - 爲內容寬度減小,內容高度增加。的Qt:如何創建一個滾動的,自行繪製控件

這樣做的最佳方法是什麼?我正在考慮將我的QWidget-derived類放在QScrollArea之內,但是QPlainTextEdit是從QScrollArea派生的,我應該走那條路線嗎?

另外,我想在paintEvent()畫只可見區域,這將是浪費的,否則。

現在我正在檢查QPlainTextEdit的代碼,但它相當複雜且不易閱讀,所以如果有人知道在網絡上更簡單的代碼示例,您可以給我一個鏈接,它會幫助很多。

+0

你肯定希望它是一個'QScrollArea'除非你喜歡你自己的滾動重新實現。我認真看待'QListView',因爲它幾乎完成了所有這些工作,並且可以完全控制渲染每段文本時想要的效果。它比'QPlainTextEdit'執行得更好(帶[警告](http://stackoverflow.com/a/18579171/1329652))。獲得編輯功能會有點棘手。一個顯示'QStringListModel'的裸列表視圖就像一個用於常量數據的純文本編輯:) –

回答

1

我會發布我想出的解決方案。這不是最好的,但它主要是有效的。

最後,我並沒有從QAbstractScrollArea中得出結果,而是我簡單地將我的小部件嵌入到QScrollArea中,其垂直佈局非常好。

我實現了resizeEvent()(我從QPlainTextEdit的實現中看到了這個),每次寬度改變時,我都會重新計算高度,並且我將widget的最小高度設置爲該值。由於佈局的工作原理,我設置了最小高度。

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