【发布时间】:2020-03-23 16:13:52
【问题描述】:
我有1 QListWidget 和1 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() << currentRow;,结果为 0。见here。这是在告诉你什么吗? -
此外,如您所见here,
QListWidget条目的选择是正确的。但我只看到QStackedWidget上出现的最后一个.ui表单。我不确定发生了什么。 -
@seleciii44,按照您的建议,我从一个基本示例开始,从那里开始。我找到了这个问题的解决方案,并在下面发布了详细的答案,以便其他用户可以从中受益。
-
您非常好,感谢您花时间指出错误所在! :)
标签: c++11 qt5 qlistwidget qstackedwidget