C++ 如何根据QListWidget上的选择在QStackedWidget上显示正确的GUI
如何根据C++ 如何根据QListWidget上的选择在QStackedWidget上显示正确的GUI,c++,qt,qt5,qstackedwidget,C++,Qt,Qt5,Qstackedwidget,如何根据QListWidget上的选择在QStacked小部件上正确显示正确的用户界面 下面我有一个QDialog,其中包含: 1 QListWidget 1 QStackedWidget 根据列表的选择,例如,船舶定位系统或输出界面应如下所示,但问题是不幸的是,QStacked小部件当前没有改变QWidgets,因为我选择了QListWidgets,实际上没有显示任何内容。只要克隆它,它就会工作: 代码如下: 选项对话框.h #include <QDialog> #includ
QListWidget
上的选择在QStacked小部件上正确显示正确的用户界面
下面我有一个QDialog
,其中包含:
1 QListWidget
1 QStackedWidget
根据列表的选择,例如,船舶定位系统或输出界面应如下所示,但问题是不幸的是,QStacked小部件
当前没有改变QWidgets
,因为我选择了QListWidgets
,实际上没有显示任何内容。只要克隆它,它就会工作:
代码如下:
选项对话框.h
#include <QDialog>
#include "vesselpossystemwidget.h"
#include "outputdialog.h"
#include "sonarsystem.h"
namespace Ui {
class OptionsDialog;
}
class OptionsDialog : public QDialog
{
Q_OBJECT
public:
explicit OptionsDialog(QWidget *parent = nullptr);
~OptionsDialog();
private:
Ui::OptionsDialog *ui;
VesselPosSystemWidget *mVesPos;
OutputDialog *mOutput;
SonarSystem *mSonar;
};
#endif // OPTIONSDIALOG_H
#include "optionsdialog.h"
#include "ui_optionsdialog.h"
OptionsDialog::OptionsDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::OptionsDialog)
{
ui->setupUi(this);
switch(ui->stackedWidget->currentIndex()){
case 0:
// Go to positioning system
mVesPos = new VesselPosSystemWidget();
mVesPos->show();
break;
case 1:
// Go to sonar set up...
mSonar = new SonarSystem();
mSonar->show();
break;
case 2:
// Go to output
mOutput = new OutputDialog();
mOutput->show();
break;
default:
break;
}
}
OptionsDialog::~OptionsDialog()
{
delete ui;
}
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class VesselPosSystemWidget; }
QT_END_NAMESPACE
class VesselPosSystemWidget : public QWidget
{
Q_OBJECT
public:
VesselPosSystemWidget(QWidget *parent = nullptr);
~VesselPosSystemWidget();
private:
Ui::VesselPosSystemWidget *ui;
};
#endif // VESSELPOSSYSTEMWIDGET_H
#include <QDialog>
namespace Ui {
class OutputDialog;
}
class OutputDialog : public QDialog
{
Q_OBJECT
public:
explicit OutputDialog(QWidget *parent = nullptr);
~OutputDialog();
private:
Ui::OutputDialog *ui;
};
#endif // OUTPUTDIALOG_H
vesselposwidget.h
#include <QDialog>
#include "vesselpossystemwidget.h"
#include "outputdialog.h"
#include "sonarsystem.h"
namespace Ui {
class OptionsDialog;
}
class OptionsDialog : public QDialog
{
Q_OBJECT
public:
explicit OptionsDialog(QWidget *parent = nullptr);
~OptionsDialog();
private:
Ui::OptionsDialog *ui;
VesselPosSystemWidget *mVesPos;
OutputDialog *mOutput;
SonarSystem *mSonar;
};
#endif // OPTIONSDIALOG_H
#include "optionsdialog.h"
#include "ui_optionsdialog.h"
OptionsDialog::OptionsDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::OptionsDialog)
{
ui->setupUi(this);
switch(ui->stackedWidget->currentIndex()){
case 0:
// Go to positioning system
mVesPos = new VesselPosSystemWidget();
mVesPos->show();
break;
case 1:
// Go to sonar set up...
mSonar = new SonarSystem();
mSonar->show();
break;
case 2:
// Go to output
mOutput = new OutputDialog();
mOutput->show();
break;
default:
break;
}
}
OptionsDialog::~OptionsDialog()
{
delete ui;
}
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class VesselPosSystemWidget; }
QT_END_NAMESPACE
class VesselPosSystemWidget : public QWidget
{
Q_OBJECT
public:
VesselPosSystemWidget(QWidget *parent = nullptr);
~VesselPosSystemWidget();
private:
Ui::VesselPosSystemWidget *ui;
};
#endif // VESSELPOSSYSTEMWIDGET_H
#include <QDialog>
namespace Ui {
class OutputDialog;
}
class OutputDialog : public QDialog
{
Q_OBJECT
public:
explicit OutputDialog(QWidget *parent = nullptr);
~OutputDialog();
private:
Ui::OutputDialog *ui;
};
#endif // OUTPUTDIALOG_H
输出.h
#include <QDialog>
#include "vesselpossystemwidget.h"
#include "outputdialog.h"
#include "sonarsystem.h"
namespace Ui {
class OptionsDialog;
}
class OptionsDialog : public QDialog
{
Q_OBJECT
public:
explicit OptionsDialog(QWidget *parent = nullptr);
~OptionsDialog();
private:
Ui::OptionsDialog *ui;
VesselPosSystemWidget *mVesPos;
OutputDialog *mOutput;
SonarSystem *mSonar;
};
#endif // OPTIONSDIALOG_H
#include "optionsdialog.h"
#include "ui_optionsdialog.h"
OptionsDialog::OptionsDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::OptionsDialog)
{
ui->setupUi(this);
switch(ui->stackedWidget->currentIndex()){
case 0:
// Go to positioning system
mVesPos = new VesselPosSystemWidget();
mVesPos->show();
break;
case 1:
// Go to sonar set up...
mSonar = new SonarSystem();
mSonar->show();
break;
case 2:
// Go to output
mOutput = new OutputDialog();
mOutput->show();
break;
default:
break;
}
}
OptionsDialog::~OptionsDialog()
{
delete ui;
}
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class VesselPosSystemWidget; }
QT_END_NAMESPACE
class VesselPosSystemWidget : public QWidget
{
Q_OBJECT
public:
VesselPosSystemWidget(QWidget *parent = nullptr);
~VesselPosSystemWidget();
private:
Ui::VesselPosSystemWidget *ui;
};
#endif // VESSELPOSSYSTEMWIDGET_H
#include <QDialog>
namespace Ui {
class OutputDialog;
}
class OutputDialog : public QDialog
{
Q_OBJECT
public:
explicit OutputDialog(QWidget *parent = nullptr);
~OutputDialog();
private:
Ui::OutputDialog *ui;
};
#endif // OUTPUTDIALOG_H
到目前为止我所做的:
我正在探索使用QStacked Widget
的可能性,因为我对它不太熟悉,想用一个基本的例子来练习。我在调查,而且
另外,从源代码中,我还阅读了更多的文档。然而,我不能完全清楚地理解这个特定小部件的使用
除此之外,我还尝试了一个开关盒
循环,如我在代码上所示,但我不确定为什么它不起作用
根据QListWidget
上的选择,任何人都可以提供一些关于如何在QStacked Widget
上正确显示用户界面的指导吗?任何解决这个问题的方法都值得赞赏。A是一个容器小部件,用于多个子小部件,一次只显示其中一个
因此,应立即添加所有子窗口小部件
currentIndex
可用于控制其中哪些当前可见
A为了演示这一点–testQStackedWidgetMin.cc
:
// Qt header:
#include <QtWidgets>
// main application
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// setup GUI
QWidget qWinMain;
QHBoxLayout qHBox;
QListWidget qList;
qList.addItem(QString::fromUtf8("Config. 1"));
qList.addItem(QString::fromUtf8("Config. 2"));
qList.addItem(QString::fromUtf8("Output"));
qHBox.addWidget(&qList);
QStackedWidget qStack;
QLabel qConfig1(QString::fromUtf8("<b>Config Page 1</b>"));
qStack.addWidget(&qConfig1);
QLabel qConfig2(QString::fromUtf8("<b>Config Page 2</b>"));
qStack.addWidget(&qConfig2);
QLabel qOutput(QString::fromUtf8("<b>Output Page</b>"));
qStack.addWidget(&qOutput);
qHBox.addWidget(&qStack, 1);
qWinMain.setLayout(&qHBox);
qWinMain.show();
// install signal handlers
QObject::connect(&qList, &QListWidget::currentRowChanged,
&qStack, &QStackedWidget::setCurrentIndex);
// runtime loop
return app.exec();
}
// Qt header:
#include <QtWidgets>
class Config1: public QWidget {
private:
// GUI
QVBoxLayout _qVBox;
QLabel _qLbl;
public:
// constructor.
Config1();
// destructor.
virtual ~Config1() = default;
// disabled:
Config1(const Config1&) = delete;
Config1& operator=(const Config1&) = delete;
};
Config1::Config1(): QWidget()
{
// setup GUI
_qLbl.setText(QString::fromUtf8("<b>Config Page 1</b>"));
_qVBox.addWidget(&_qLbl);
setLayout(&_qVBox);
}
class Config2: public QWidget {
private:
// GUI
QVBoxLayout _qVBox;
QLabel _qLbl;
public:
// constructor.
Config2();
// destructor.
virtual ~Config2() = default;
// disabled:
Config2(const Config2&) = delete;
Config2& operator=(const Config2&) = delete;
};
Config2::Config2(): QWidget()
{
_qLbl.setText(QString::fromUtf8("<b>Config Page 2</b>"));
_qVBox.addWidget(&_qLbl);
setLayout(&_qVBox);
}
class Output: public QWidget {
private:
// GUI
QVBoxLayout _qVBox;
QLabel _qLbl;
public:
// constructor.
Output();
// destructor.
virtual ~Output() = default;
// disabled:
Output(const Output&) = delete;
Output& operator=(const Output&) = delete;
};
Output::Output(): QWidget()
{
_qLbl.setText(QString::fromUtf8("<b>Output Page</b>"));
_qVBox.addWidget(&_qLbl);
setLayout(&_qVBox);
}
class OptionDialog: public QDialog {
private:
// GUI
QHBoxLayout _qHBox;
QListWidget _qList;
QStackedWidget _qStack;
Config1 _qConfig1;
Config2 _qConfig2;
Output _qOutput;
public:
// constructor.
OptionDialog();
// destructor.
virtual ~OptionDialog() = default;
// disabled:
OptionDialog(const OptionDialog&) = delete;
OptionDialog& operator=(const OptionDialog&) = delete;
};
OptionDialog::OptionDialog(): QDialog()
{
// setup GUI
_qList.addItem(QString::fromUtf8("Config. 1"));
_qList.addItem(QString::fromUtf8("Config. 2"));
_qList.addItem(QString::fromUtf8("Output"));
_qHBox.addWidget(&_qList);
_qStack.addWidget(&_qConfig1);
_qStack.addWidget(&_qConfig2);
_qStack.addWidget(&_qOutput);
_qHBox.addWidget(&_qStack, 1);
setLayout(&_qHBox);
// install signal handlers
QObject::connect(&_qList, &QListWidget::currentRowChanged,
&_qStack, &QStackedWidget::setCurrentIndex);
}
// main application
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// setup GUI
OptionDialog qDlgOpt;
qDlgOpt.show();
// runtime loop
return app.exec();
}
QListWidget qList
的信号连接到QStackedWidget qStack
的功能。
这负责更新qList
中任何(交互式)行更改的qStack
根据OP–testQStackedWidget.cc
的意图,这是一个不太简单的示例:
// Qt header:
#include <QtWidgets>
// main application
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// setup GUI
QWidget qWinMain;
QHBoxLayout qHBox;
QListWidget qList;
qList.addItem(QString::fromUtf8("Config. 1"));
qList.addItem(QString::fromUtf8("Config. 2"));
qList.addItem(QString::fromUtf8("Output"));
qHBox.addWidget(&qList);
QStackedWidget qStack;
QLabel qConfig1(QString::fromUtf8("<b>Config Page 1</b>"));
qStack.addWidget(&qConfig1);
QLabel qConfig2(QString::fromUtf8("<b>Config Page 2</b>"));
qStack.addWidget(&qConfig2);
QLabel qOutput(QString::fromUtf8("<b>Output Page</b>"));
qStack.addWidget(&qOutput);
qHBox.addWidget(&qStack, 1);
qWinMain.setLayout(&qHBox);
qWinMain.show();
// install signal handlers
QObject::connect(&qList, &QListWidget::currentRowChanged,
&qStack, &QStackedWidget::setCurrentIndex);
// runtime loop
return app.exec();
}
// Qt header:
#include <QtWidgets>
class Config1: public QWidget {
private:
// GUI
QVBoxLayout _qVBox;
QLabel _qLbl;
public:
// constructor.
Config1();
// destructor.
virtual ~Config1() = default;
// disabled:
Config1(const Config1&) = delete;
Config1& operator=(const Config1&) = delete;
};
Config1::Config1(): QWidget()
{
// setup GUI
_qLbl.setText(QString::fromUtf8("<b>Config Page 1</b>"));
_qVBox.addWidget(&_qLbl);
setLayout(&_qVBox);
}
class Config2: public QWidget {
private:
// GUI
QVBoxLayout _qVBox;
QLabel _qLbl;
public:
// constructor.
Config2();
// destructor.
virtual ~Config2() = default;
// disabled:
Config2(const Config2&) = delete;
Config2& operator=(const Config2&) = delete;
};
Config2::Config2(): QWidget()
{
_qLbl.setText(QString::fromUtf8("<b>Config Page 2</b>"));
_qVBox.addWidget(&_qLbl);
setLayout(&_qVBox);
}
class Output: public QWidget {
private:
// GUI
QVBoxLayout _qVBox;
QLabel _qLbl;
public:
// constructor.
Output();
// destructor.
virtual ~Output() = default;
// disabled:
Output(const Output&) = delete;
Output& operator=(const Output&) = delete;
};
Output::Output(): QWidget()
{
_qLbl.setText(QString::fromUtf8("<b>Output Page</b>"));
_qVBox.addWidget(&_qLbl);
setLayout(&_qVBox);
}
class OptionDialog: public QDialog {
private:
// GUI
QHBoxLayout _qHBox;
QListWidget _qList;
QStackedWidget _qStack;
Config1 _qConfig1;
Config2 _qConfig2;
Output _qOutput;
public:
// constructor.
OptionDialog();
// destructor.
virtual ~OptionDialog() = default;
// disabled:
OptionDialog(const OptionDialog&) = delete;
OptionDialog& operator=(const OptionDialog&) = delete;
};
OptionDialog::OptionDialog(): QDialog()
{
// setup GUI
_qList.addItem(QString::fromUtf8("Config. 1"));
_qList.addItem(QString::fromUtf8("Config. 2"));
_qList.addItem(QString::fromUtf8("Output"));
_qHBox.addWidget(&_qList);
_qStack.addWidget(&_qConfig1);
_qStack.addWidget(&_qConfig2);
_qStack.addWidget(&_qOutput);
_qHBox.addWidget(&_qStack, 1);
setLayout(&_qHBox);
// install signal handlers
QObject::connect(&_qList, &QListWidget::currentRowChanged,
&_qStack, &QStackedWidget::setCurrentIndex);
}
// main application
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// setup GUI
OptionDialog qDlgOpt;
qDlgOpt.show();
// runtime loop
return app.exec();
}
目前还没有。在MCVE中,您将删除既不是QStackedWidget
也不是QListWidget
的所有小部件。堆叠一些简单的QLabel
s就足以说明QStackedWidget
是否显示了所需的页面。您是否知道您试图将QDialog
“OutputDialog”添加到QStackedWidget
?我怀疑这是否会产生预期的结果。您应该制作另一个类的“OutputDialog”,例如QWidget
。非常感谢您抽出时间来编写这个非常详细的示例。不同的版本让我更好地理解了QStackedWidget
的使用,以及显示正确界面的逻辑是如何工作的!非常非常感谢!!:)