0

我正在尝试制作一个 GUI,因此当您增加“文章”计数时,会显示更多文章输入。例如,如果我将文章计数更改为 2,我希望为文章 2 显示另一组输入,如果文章计数更改为 3,则将有三组输入,但因为这样会消耗更多空间比窗口有,它会开始滚动。

我正在考虑使用树、列表或表格小部件之一,但我不确定这是否是我应该去的正确方向。谁能把我推向正确的方向?

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

图片在这里

4

1 回答 1

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;
于 2012-06-03T21:05:04.993 回答