可扩展的QT输入列表

时间:2012-06-03 19:19:06

标签: qt list user-interface show-hide

我正在尝试创建一个GUI,所以当你增加“文章”计数时,会出现更多的文章输入。例如,如果我将文章计数更改为2,我希望另一组输入显示为第2条,如果文章计数更改为3,则会有三组输入,但由于这会耗尽更多空间比窗口有的,它会开始滚动。

我正在考虑使用树,列表或表格小部件中的一个,但我不确定这是否是我应该去的正确方向。任何人都可以把我推向正确的方向吗?

这是一张照片,因为我的描述并不好。

Picture goes here

1 个答案:

答案 0 :(得分: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;
    ...
};

并在外部widget类中有一个向量:

QVector<ArticleData*> articles;