【发布时间】:2018-06-11 05:34:07
【问题描述】:
我之前尝试过使用QStackedWidget,但我不明白如何使用。下面的代码使我了解如何将当前窗口从主窗口更改为另一个窗口,该窗口已在主窗口中调用,并且效果很好。我把当前索引改成其他所有窗口,每次窗口都不一样,这样就好了。
我的问题是:
如何从另一个窗口切换到另一个窗口(不同于当前窗口)?我是否必须在所有其他窗口中定义这个QStackedWidget,以便我可以像在这里使用它一样使用它?
我希望在单击窗口(其他窗口)上的按钮后,窗口切换到另一个窗口,我该怎么做?
例如,在这段代码中,我有 FenetrePrincipale,它允许我使用 setCurrentIndex 更改窗口,例如将 setCurrentIndex 设置为 3,使出现的第一个窗口是 MAFENETRE3。
例如,我希望从 MAFENTRE3 中使用一个允许我切换到另一个窗口的按钮。
(实际上在QStackedWidget 出现问题后,我只是正常实现了我的代码,而不是切换到另一个窗口,我只是在窗口调用底部打开窗口,这看起来不太好!
这里是测试代码:
fenetprincipale.h
#ifndef FENETRE_PRINCIPALE
#define FENETRE_PRINCIPALE
#include <QApplication>
#include <QtWidgets>
#include "MaFenetre.h"
#include "MaFenetre2.h"
#include "MaFenetre3.h"
#include "MaFenetre4.h"
class FenetrePrincipale : public QMainWindow
{
Q_OBJECT
public:
FenetrePrincipale();
~FenetrePrincipale();
public slots:
void slotDisplayFen(int fenIndex);
private:
QStackedWidget *stack;
MaFenetre *fen1;
MaFenetre2 *fen2;
MaFenetre3 *fen3;
MaFenetre4 *fen4;
};
#endif
fenetreprincipale.cpp
#include "FenetrePrincipale.h"
FenetrePrincipale::FenetrePrincipale() : QMainWindow()
{
stack = new QStackedWidget(this);
fen1 = new MaFenetre();
fen2 = new MaFenetre2 ();
fen3 = new MaFenetre3();
fen4 = new MaFenetre4();
stack->addWidget(fen1);
stack->addWidget(fen2);
stack->addWidget(fen3);
stack->addWidget(fen4);
this->setCentralWidget(stack);
stack->setCurrentIndex(0); // on affiche la première fenêtre à l'ouverture du programme
setWindowTitle("Test STACKEDLAYOUT");
resize(500,600);
connect(fen1, SIGNAL(askDisplayFen(int)), this, SLOT(slotDisplayFen(int)));
connect(fen2, SIGNAL(askDisplayFen(int)), this, SLOT(slotDisplayFen(int)));
connect(fen3, SIGNAL(askDisplayFen(int)), this, SLOT(slotDisplayFen(int)));
connect(fen4, SIGNAL(askDisplayFen(int)), this, SLOT(slotDisplayFen(int)));
}
FenetrePrincipale::~FenetrePrincipale()
{
}
void FenetrePrincipale::slotDisplayFen(int fenIndex)
{
if ((fenIndex < 0) || (fenIndex > 3)) {return;}
stack->setCurrentIndex(fenIndex);
}
这是 Mafenetre 的代码 MaFenetre.h
#ifndef DEF_MAFENETRE
#define DEF_MAFENETRE
#include <QtWidgets>
class MaFenetre : public QWidget // On hérite de QWidget (IMPORTANT)
{
public:
MaFenetre();
private:
QPushButton *m_bouton;
};
#endif
MaFenetre.cpp
#include "MaFenetre.h"
MaFenetre::MaFenetre() : QWidget()
{
setFixedSize(300, 150);
m_bouton = new QPushButton("Quitter", this);
m_bouton->setFont(QFont("Comic Sans MS", 14));
m_bouton->move(110, 50);
// Connexion du clic du bouton à la fermeture de l'application
QObject::connect(m_bouton, SIGNAL(clicked()), qApp, SLOT(quit()));
}
【问题讨论】:
-
感谢我编辑了它,希望它现在清楚
-
其他windows怎么用,或者叫它,这就是我想做的?
-
所以这意味着我每次都必须在我选择切换到它们的窗口上创建指针,并在这些窗口上实现相同的插槽? , 实际上这段代码我只是从互联网上复制的, 并在窗口之间切换, 我不清楚, 我每次都更改 setCurrentIndex , 看看哪个窗口会先出现, 但是发出的信号我看不到它们是如何工作的
-
其实我有点明白你说的意思,但这意味着我必须在每个窗口 slotDisplayFen 中定义另一个时间? ,如果是这样就清楚了,但这有点令人困惑,因为在网上搜索后,我发现这个窗口服务于所有其他窗口,并允许它们切换(可能我没有很好地得到它们)
-
关于slotDisplayFen 不清楚,看不到什么时候激活
标签: c++ qt qt5 qstackedwidget