如何在 QStackedWidget 中动态添加小部件
How to dynamically add widget inside a QStackedWidget
为了重现这个问题,我准备了一个可验证的小例子。
我在 QGroupBox
中有 2 个 QStackedWidgets
,还有几个组件,如下所示:
我创建了另一个名为 QBoxForm
的小部件,它只带有一个 QComboBox
。
一旦 QCheckbox
被勾选,最后一个小部件应该出现在左侧的 QStackedWidget
上。
QStackedWidget
收到东西因为它变大了但是不显示QComboBox
。如何确保组件在 QStackedWidget
?
中完全可见
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
mCombo = new CBoxForm;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_checkBox_toggled(bool checked)
{
if(ui->checkBox->isChecked())
{
if(checked)
{
ui->stackedWidget->insertWidget(0, mCombo);
ui->stackedWidget->show();
}
}
if(!ui->checkBox->isChecked())
{
ui->stackedWidget->removeWidget(mCombo);
}
}
mainwindow.h
#include <QMainWindow>
#include "cboxform.h"
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_checkBox_toggled(bool checked);
private:
Ui::MainWindow *ui;
CBoxForm *mCombo;
};
最后由另一个小部件处理的附加组合框:
cboxform.h
#include <QWidget>
namespace Ui {
class CBoxForm;
}
class CBoxForm : public QWidget
{
Q_OBJECT
public:
explicit CBoxForm(QWidget *parent = nullptr);
~CBoxForm();
private:
Ui::CBoxForm *ui;
};
cboxform.cpp
CBoxForm::CBoxForm(QWidget *parent) :
QWidget(parent),
ui(new Ui::CBoxForm)
{
ui->setupUi(this);
}
CBoxForm::~CBoxForm()
{
delete ui;
}
到目前为止我做了什么:
1) 我完全按照official documentation and applied the method insertWidget()
as advised. In fact here 做的。这部分有效,可以通过 QStackedWidget
在我选中该框时变大这一事实得到证实。
因此,我也以类似的方式删除了小部件,应用了官方文档中提供的 removeWidget() 方法。
一切似乎都遵循正确的功能,但唯一缺少的部分是我不明白为什么 QComboBox
没有出现在 QStackedWidget
上,因为我完全按照官方文档进行操作。
关于我可能遗漏或忘记包含在上述代码中的内容有什么想法吗?
感谢您指出正确的方向来解决这个问题。
你应该在ui->stackedWidget->insertWidget( 0, mCombo) 使其可见。
为了重现这个问题,我准备了一个可验证的小例子。
我在 QGroupBox
中有 2 个 QStackedWidgets
,还有几个组件,如下所示:
我创建了另一个名为 QBoxForm
的小部件,它只带有一个 QComboBox
。
一旦 QCheckbox
被勾选,最后一个小部件应该出现在左侧的 QStackedWidget
上。
QStackedWidget
收到东西因为它变大了但是不显示QComboBox
。如何确保组件在 QStackedWidget
?
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
mCombo = new CBoxForm;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_checkBox_toggled(bool checked)
{
if(ui->checkBox->isChecked())
{
if(checked)
{
ui->stackedWidget->insertWidget(0, mCombo);
ui->stackedWidget->show();
}
}
if(!ui->checkBox->isChecked())
{
ui->stackedWidget->removeWidget(mCombo);
}
}
mainwindow.h
#include <QMainWindow>
#include "cboxform.h"
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_checkBox_toggled(bool checked);
private:
Ui::MainWindow *ui;
CBoxForm *mCombo;
};
最后由另一个小部件处理的附加组合框:
cboxform.h
#include <QWidget>
namespace Ui {
class CBoxForm;
}
class CBoxForm : public QWidget
{
Q_OBJECT
public:
explicit CBoxForm(QWidget *parent = nullptr);
~CBoxForm();
private:
Ui::CBoxForm *ui;
};
cboxform.cpp
CBoxForm::CBoxForm(QWidget *parent) :
QWidget(parent),
ui(new Ui::CBoxForm)
{
ui->setupUi(this);
}
CBoxForm::~CBoxForm()
{
delete ui;
}
到目前为止我做了什么:
1) 我完全按照official documentation and applied the method insertWidget()
as advised. In fact here 做的。这部分有效,可以通过 QStackedWidget
在我选中该框时变大这一事实得到证实。
因此,我也以类似的方式删除了小部件,应用了官方文档中提供的 removeWidget() 方法。
一切似乎都遵循正确的功能,但唯一缺少的部分是我不明白为什么 QComboBox
没有出现在 QStackedWidget
上,因为我完全按照官方文档进行操作。
关于我可能遗漏或忘记包含在上述代码中的内容有什么想法吗? 感谢您指出正确的方向来解决这个问题。
你应该在ui->stackedWidget->insertWidget( 0, mCombo) 使其可见。