Как показать правильную страницу QStackedWidget после выбора QListWidget - PullRequest
0 голосов
/ 23 марта 2020

У меня есть 1 QListWidget и 1 QStackedWidget. У QstackedWidget есть три разных виджета, которые будут отображаться после выбора записей на QListWidget.

Проблема: при выборе первого варианта ничего не происходит и ничего не происходит, если я выбираю второй вариант, но когда я выбираю последний вариант, я вижу виджет на QStackedWidget. Этот виджет не появляется на третьем виджете, но он связан с первым виджетом.

Сигналы [QListWidget :: currentRowChanged ( C ++ - QListWidget выберите первый элемент ), похоже, не сработали правильно. Почему это происходит? В основном, кажется, что срабатывает только последний выбор вместо всех остальных.

Ниже фрагмента кода:

1 решение: работает частично, потому что из трех вариантов я могу см. только последнее QWidget, отображаемое в решении QStackedWidget:

OptionsDialog::OptionsDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::OptionsDialog)
{
    ui->setupUi(this);

    mVesPos = new VesselPosSystemWidget;
    mSonar = new SonarForm;
    mOutput = new OutputForm;
    ui->stackedWidget->addWidget(mVesPos);
    ui->stackedWidget->addWidget(mSonar);
    ui->stackedWidget->addWidget(mOutput);

    ui->horizontalLayout->addWidget(ui->stackedWidget);
    setLayout(ui->horizontalLayout);


    QObject::connect(ui->listWidget, &QListWidget::currentRowChanged,
            ui->stackedWidget, &QStackedWidget::setCurrentIndex);
}

OptionsDialog::~OptionsDialog()
{
    delete ui;
}

2: работает частично, поскольку из трех вариантов я вижу только последнее QWidget, отображаемое на QStackedWidget. Это решение было взято из официальной документации QStackedWidget :

OptionsDialog::OptionsDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::OptionsDialog)
{
    ui->setupUi(this);

    mVesPos = new VesselPosSystemWidget;
    mSonar = new SonarForm;
    mOutput = new OutputForm;
    ui->stackedWidget->addWidget(mVesPos);
    ui->stackedWidget->addWidget(mSonar);
    ui->stackedWidget->addWidget(mOutput);

    ui->horizontalLayout->addWidget(ui->stackedWidget);
    setLayout(ui->horizontalLayout);


    connect(ui->listWidget, QOverload<int>::of(&QListWidget::currentRowChanged),
        ui->stackedWidget, &QStackedWidget::setCurrentIndex);

}

OptionsDialog::~OptionsDialog()
{
    delete ui;
}

3: тот же точный эффект, показан только третий QWidget:

OptionsDialog::OptionsDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::OptionsDialog)
{
    ui->setupUi(this);

    mVesPos = new VesselPosSystemWidget;
    mSonar = new SonarForm;
    mOutput = new OutputForm;
    ui->stackedWidget->addWidget(mVesPos);
    ui->stackedWidget->addWidget(mSonar);
    ui->stackedWidget->addWidget(mOutput);

    ui->horizontalLayout->addWidget(ui->stackedWidget);
    setLayout(ui->horizontalLayout);


    connect(ui->listWidget, &QListWidget::currentRowChanged,
        [=](int index) { on_listWidget_currentRowChanged(index); });


}

OptionsDialog::~OptionsDialog()
{
    delete ui;
}

void OptionsDialog::on_listWidget_currentRowChanged(int currentRow)
{
    ui->stackedWidget->setCurrentIndex(currentRow);
}

Я не знаю, что еще можно сделать, чтобы переключить формы .ui после выбора элемента в QListWidget. Есть ли что-то, что мне не хватает? Я перепробовал все возможные комбинации connect, но, несмотря на это, могу показать только третий вариант.

1 Ответ

0 голосов
/ 30 марта 2020

Я надеюсь, что это может быть полезно для других пользователей. Я нашел решение этого вопроса. Это было непросто и требовало глубокого прочтения официальной документации. По сути дела, когда я пытался выбрать правильный QWidget на QlistWidget, выбор ошибочно переходил в неправильную форму. Я пытался

qDebug() << ui->stackedWidget->addWidget(mSonar);
qDebug() << ui->stackedWidget->addWidget(mOutput);

И получал индекс 3,4,5. Что объясняет, почему я видел только последний индекс. Теперь, после долгого и глубокого прочтения документации, я узнал о QStackedWidget::insertWidget отношениях со всеми возможными QWidget, которые вы хотите связать со стеком. Это в основном связывает все представления с формой при точном условии, что вы передаете QWidgets. Так, например, если вы хотите связать QDialog с QStackedWidget, это недопустимо, потому что QStackedWidgets наследует QWidgets. Поэтому решение состояло в том, чтобы вставить правильный виджет с самого начала, пропуская правильный индекс вручную (в моем случае).

Кодовое решение:

OptionsDialog::OptionsDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::OptionsDialog)
{
    ui->setupUi(this);
    mVesPos = new VesselPosSystemWidget;
    mSonar = new SonarForm;
    mOutput = new OutputForm;
    ui->stackedWidget->insertWidget(0, mVesPos);
    ui->stackedWidget->insertWidget(1, mSonar);
    ui->stackedWidget->insertWidget(2, mOutput);

    // This is how to link the choice according to the latest signals notation
    connect(ui->listWidget, &QListWidget::currentRowChanged,
            ui->stackedWidget, &QStackedWidget::setCurrentIndex);
}

Функция может быть найдена здесь и вы можете увидеть, если внимательно прочитаете, как работает наследование. Итак, снова int QStackedWidget::insertWidget(int index, QWidget *widget) из официальной документации решили проблему. Я надеюсь, что это может решить проблему для других пользователей. :)

...