【问题标题】:How to show proper QStackedWidget page after QListWidget selection选择 QListWidget 后如何显示正确的 QStackedWidget 页面
【发布时间】:2020-03-23 16:13:52
【问题描述】:

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

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

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

代码的sn-p下面:

1 个解决方案: 部分有效,因为在三个选项中我只能看到QStackedWidget 上显示的最后一个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);


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

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

2 解决方案: 部分有效,因为在三个选项中我只能看到QStackedWidget 上显示的最后一个QWidget。此解决方案取自official documentation of 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);
}

在选择QListWidget 中的项目后,我不知道还有什么可以尝试让.ui 表单切换。有什么我想念的吗?我尝试了所有可能的 connect 组合,但尽管如此,我只能展示第三个选择。

【问题讨论】:

  • 你调试过你的代码吗?在 on_listWidget_currentRowChanged 函数中放置一个断点并检查currentRow 的值。我没有 qt 设置,因此无法检查您的代码。
  • 感谢您阅读这个问题。是的,我添加了qDebug() &lt;&lt; currentRow;,结果为 0。见here。这是在告诉你什么吗?
  • 此外,如您所见hereQListWidget 条目的选择是正确的。但我只看到QStackedWidget 上出现的最后一个.ui 表单。我不确定发生了什么。
  • @seleciii44,按照您的建议,我从一个基本示例开始,从那里开始。我找到了这个问题的解决方案,并在下面发布了详细的答案,以便其他用户可以从中受益。
  • 您非常好,感谢您花时间指出错误所在! :)

标签: c++11 qt5 qlistwidget qstackedwidget


【解决方案1】:

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

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);
}

函数可以在here 找到,如果你仔细阅读继承是如何工作的,你实际上可以看到。所以int QStackedWidget::insertWidget(int index, QWidget *widget) 来自official documentation 再次解决了这个问题。我希望这可以解决其他用户的问题。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2021-11-08
    相关资源
    最近更新 更多