我正在尝试创建一个GUI,所以当你增加“文章”计数时,会出现更多的文章输入。例如,如果我将文章计数更改为2,我希望另一组输入显示为第2条,如果文章计数更改为3,则会有三组输入,但由于这会耗尽更多空间比窗口有的,它会开始滚动。
我正在考虑使用树,列表或表格小部件中的一个,但我不确定这是否是我应该去的正确方向。任何人都可以把我推向正确的方向吗?
这是一张照片,因为我的描述并不好。
答案 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;