0

「記事」の数を増やすと、より多くの記事の入力が表示されるように、GUI を作成しようとしています。たとえば、記事の数を 2 に変更すると、別の入力グループが記事 2 に表示されるようになり、記事の数が 3 に変更された場合、入力のグループは 3 つになりますが、それはより多くを使用するためです。ウィンドウが持っているよりもスペースがあると、スクロールが開始されます。

ツリー、リスト、またはテーブル ウィジェットのいずれかを使用することを考えていましたが、それが正しい方向であるかどうかはわかりません。誰かが私を正しい方向に押し進めることができますか?

説明が下手なので画像です。

画像はこちら

4

1 に答える 1

1

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 に答える