2012-06-03 78 views
0

我正在嘗試製作GUI,因此當您增加「文章」數量時,則會顯示更多文章輸入。例如,如果我將Articles數更改爲2,我希望另一組輸入顯示爲第2條,並且如果條款將更改計數爲3,則會有三組輸入,但由於這會導致更多用量空間比窗口,它會開始滾動。QT的可擴展輸入列表

我正在考慮使用樹,列表或表格小部件之一,但我不確定這是否是我認爲正確的方向。任何人都可以把我推向正確的方向嗎?

這是一張圖片,因爲我的描述不好。

Picture goes here

+0

看看http://qt-project.org/doc/qt-4.8/qscrollarea.html – sgibb

+2

注意:它是畫廊,而不是畫廊。 – leemes

回答

1

你應該把需要的一篇文章爲一個單獨的定製插件的所有部件。只要旋轉框被更改(插槽中的代碼),您可以將這種自定義小部件的一個實例添加/移除到滾動區域。

在這個自定義小部件類的構造函數中(我們稱之爲ArticleWidget),您應該在自定義小部件中定義通知其子部件所做更改的信號。您的自定義窗口小部件內將其中:

ArticleWidget::ArticleWidget(QWidget *parent) : 
     QWidget(parent) 
{ 
    ui->setupUi(this); // when you use QtDesigner to design the widget 

    // propagate signals from my inner widgets to myself: 
    connect(ui->title, SIGNAL(textChanged(QString)), 
      SIGNAL(titleChanged(QString))); 
} 

在外部部件,只要建立這樣一個自定義窗口小部件,它的信號連接到您的處理槽:

void OuterWidget::articleCountChanged(int) 
{ 
    ... 
    if(/*increased*/) 
    { 
     ArticleWidget *article = new ArticleWidget(this); 
     connect(article, SIGNAL(titleChanged(QString)), 
       SLOT(art_titleChanged(QString))); 
     ui->scrollAreaViewport->layout()->addWidget(article); 
    } 
    ... 
} 

您可以訪問使用sender()文章插件:

void OuterWidget::art_titleChanged(QString) 
{ 
    ArticleWidget *articleWidget = qobject_cast<ArticleWidget*>(sender()); 
    Q_ASSERT(articleWidget); // make sure the signal comes from an ArticleWidget 

    // if you want to store articles in a vector of custom types, 
    // you could give this type a pointer to the widget, so you can 
    // find the index if you have the widget pointer: 
    foreach(Article *article, articles) 
     if(article->widget == articleWidget) 
      article->title = title; // make some changes 
} 

此代碼假定你持有的所有您的文章在類似這樣的一個結構:

struct ArticleData 
{ 
    ArticleWidget *widget; 
    QString title; 
    ... 
}; 

,並讓它們的載體在你的外構件類:

QVector<ArticleData*> articles;