我正在尝试制作一个 GUI,因此当您增加“文章”计数时,会显示更多文章输入。例如,如果我将文章计数更改为 2,我希望为文章 2 显示另一组输入,如果文章计数更改为 3,则将有三组输入,但因为这样会消耗更多空间比窗口有,它会开始滚动。
我正在考虑使用树、列表或表格小部件之一,但我不确定这是否是我应该去的正确方向。谁能把我推向正确的方向?
这是一张图片,因为我的描述不好。
我正在尝试制作一个 GUI,因此当您增加“文章”计数时,会显示更多文章输入。例如,如果我将文章计数更改为 2,我希望为文章 2 显示另一组输入,如果文章计数更改为 3,则将有三组输入,但因为这样会消耗更多空间比窗口有,它会开始滚动。
我正在考虑使用树、列表或表格小部件之一,但我不确定这是否是我应该去的正确方向。谁能把我推向正确的方向?
这是一张图片,因为我的描述不好。
您应该将一篇文章所需的所有小部件放入一个自定义小部件中。每当更改旋转框(插槽中的代码)时,您都可以将此类自定义小部件的一个实例添加/删除到滚动区域。
在这个自定义小部件类的构造函数中(我们称之为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;