-1

我有1 QListWidget1 QStackedWidgetQstackedWidget选择 上的条目后,将显示三个不同的小部件QListWidget

问题:当我选择第一个选项时,没有任何反应,如果我选择第二个选项,也没有任何反应,但是当我选择最后一个选项时,我会在QStackedWidget. 此小部件不属于第三个小部件,但它属于第一个小部件。

[QListWidget::currentRowChanged( C++ - QListWidget select first item ) 的信号似乎没有被正确触发。为什么会这样?基本上似乎只触发了最后一个选择而不是所有其他选择。

在代码片段下方:

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组合,但尽管如此,我只能展示第三个选择。

4

1 回答 1

0

我希望这对其他用户有用。我找到了这个问题的解决方案。这并不容易,需要深入阅读官方文档。基本上发生的事情是,当我尝试在 上选择正确QWidget的时QlistWidget,选择错误地转到了不正确的形式。我试过了

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

并获得索引 3,4,5。这就解释了为什么我只看到最后一个索引。现在,在对文档进行了长期深入的阅读之后,我发现了与您想要链接到堆栈QStackedWidget::insertWidget的所有可能的关系。QWidget它基本上在您传递的确切条件下将所有视图链接到表单QWidgets。因此,例如,如果您想将 a 链接QDialogQStackedWidgetthis 是不允许的,因为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)官方文档解决了这个问题。我希望这可以解决其他用户的问题。:)

于 2020-03-30T14:34:25.317 回答