2011-04-08 115 views
0

我想顯示一個可滾動列表中的簡短html片段列表。因此,我把一個QVboxLayout成QScrollArea並添加多個QTextBrowsers:如何使QTextBrowser在QVBoxLayout中很好地縮放?

#include <QApplication> 
#include <QScrollArea> 
#include <QTextBrowser> 
#include <QVBoxLayout> 

int main(int argc, char *argv[]) { 
    QApplication app(argc, argv); 

    QScrollArea scrollArea; 
    scrollArea.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    scrollArea.setWidgetResizable(true); 
    QWidget *scrollWidget = new QWidget; 
    QVBoxLayout *layout = new QVBoxLayout; 

    for(int i=0;i<6;i++) { 
    QString text = "some <b>text</b> "; 
    for(int j=0;j<i;j++) text += text; 

    QTextBrowser *browser = new QTextBrowser(); 
    QTextDocument *doc = new QTextDocument(browser); 
    doc->setHtml(text); 
    browser->setDocument(doc); 

    layout->addWidget(browser); 
    } 

    scrollWidget->setLayout(layout); 
    scrollArea.setWidget(scrollWidget); 

    scrollArea.show(); 
    return app.exec(); 
} 

我的問題:這些盒子都具有相同的尺寸。我希望他們儘可能的大,但不是更大。我如何讓文本瀏覽器只佔用他們真正需要的空間?

回答

-1

而不是做

layout->addWidget(browser); 

你應該這樣做:

layout->addWidget(browser, 0, 0); 

這將QT告訴不是根據它的佈局舒展的小部件。

+0

嗯,我沒有看到任何結果的視覺變化。使用addWidget這種方式仍然使得vbox中的所有小部件具有相同的大小。有些比他們需要的更大,因爲他們只保留幾個文本,有些不夠大,並使用垂直滾動條。 – Till 2011-04-08 11:30:58

+0

試試這個:browser-> setSizePolicy(SizePolicy :: Fixed); – 2011-04-08 11:47:05

+0

這使得所有嵌入式TextBrowser都被固定在256x256的固定大小上,甚至更糟糕。 – Till 2011-04-08 12:05:01

0

好吧,我發現一個解決方案來自http://www.qtcentre.org/threads/39839-QTextBrowser-height-adjusted-to-content。有一個更簡單/優雅的解決方案嗎?

#include <QApplication> 
#include <QScrollArea> 
#include <QTextBrowser> 
#include <QVBoxLayout> 
#include <QGroupBox> 
#include <QDebug> 

#include <QShowEvent> 
#include <QResizeEvent> 

class MyBrowser : public QTextBrowser { 
private: 
    QTextDocument *doc; 

public: 
    MyBrowser(const QString &text, QWidget *parent = 0) : QTextBrowser(parent) { 
    doc = new QTextDocument(this); 
    doc->setHtml(text); 
    setDocument(doc); 
    } 

    void adjust() { 
    QMargins margins = contentsMargins(); 

    int width = size().width() - 
     margins.left() - margins.right() - doc->documentMargin()*2; 
    doc->setPageSize(QSizeF(width,-1)); 

    int height = doc->size().height() + margins.top() + margins.bottom(); 
    setMaximumHeight(height); 
    setMinimumHeight(height); 
    } 

    void showEvent(QShowEvent *) { 
    adjust(); 
    } 

    void resizeEvent(QResizeEvent *) { 
    adjust(); 
    } 
}; 

int main(int argc, char *argv[]) { 
    QApplication app(argc, argv); 

    QScrollArea scrollArea; 
    scrollArea.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    scrollArea.setWidgetResizable(true); 
    QWidget *scrollWidget = new QWidget; 
    QVBoxLayout *layout = new QVBoxLayout; 

    for(int i=0;i<6;i++) { 
    QString text = "some <b>text</b> "; 
    for(int j=0;j<i;j++) text += text; 

    MyBrowser *browser = new MyBrowser(text, scrollWidget); 
    layout->addWidget(browser, 0, 0); 
    } 

    scrollWidget->setLayout(layout); 
    scrollArea.setWidget(scrollWidget); 

    scrollArea.show(); 
    return app.exec(); 
} 
+0

我不這麼認爲,不。你面對的問題是QTextEdit派生自QAbstractScrollArea。 QAbstractScrollArea :: sizeHint()總是返回一個固定大小(256,192)像素 - 這就是爲什麼無論使用什麼尺寸策略(除QSizePolicy :: Ignored之外),無法縮小這些文本框的原因。 編輯:我可以提供的唯一的事情是,您可能可以通過重寫sizeHint()並使用固定的QSizePolicy來達到上述目的。 – Adam 2011-04-09 05:13:02

相關問題