QStackedWidget, как именно его использовать?

Я пытался использовать QStackedWidget раньше, но не совсем понял, как это сделать. Приведенный ниже код помогает мне понять, как изменить текущее окно с главного окна на другое окно, уже вызываемое в основном окне, и это работает хорошо. Я изменил текущий индекс на все остальные окна, и каждый раз окно не то же самое, что хорошо.

Мой вопрос:

Как из другого окна переключиться на другое окно (отличное от текущего)? Должен ли я определять этот QStackedWidget во всех других окнах, чтобы я мог использовать его так же, как я использую его здесь? Мне бы хотелось, чтобы после нажатия кнопки в окне (других окнах) окно переключалось на другое. Как я могу это сделать?

Например, в этом коде у меня есть FenetrePrincipale, который позволяет мне изменять окна с помощью setCurrentIndex, например, установив setCurrentIndex на 3, чтобы первое появившееся окно было MAFENETRE3.

Я хотел бы, например, от MAFENTRE3 использовать кнопку, которая позволяет мне переключаться в другое окно. (на самом деле после проблем с QStackedWidget я просто нормально реализую свой код и вместо переключения в другое окно я просто открываю окно в нижней части вызова окна, что выглядит не очень хорошо!

PS ЗДЕСЬ КОД ТЕСТА:

fenetrprincipale.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

Мафенетре.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()));
}

person MadHer    schedule 11.06.2018    source источник
comment
спасибо, отредактировал, надеюсь теперь понятно   -  person MadHer    schedule 11.06.2018
comment
как использовать его в других окнах или назвать его, это то, что я хочу сделать?   -  person MadHer    schedule 11.06.2018
comment
так это означает, что я должен каждый раз создавать указатели на окна, которые я выбираю для переключения на них, и реализовывать один и тот же слот в этих окнах? на самом деле этот код, который я только что скопировал из Интернета, и переключаться между окнами, для меня непонятен, я просто каждый раз меняю setCurrentIndex и смотрю, какое окно появится первым, но испускаемые сигналы я не вижу, как они работают   -  person MadHer    schedule 11.06.2018
comment
на самом деле я как бы понимаю, что вы сказали, но это означает, что я должен определить другое время в каждом окне slotDisplayFen? , если это так, то все ясно, но это немного сбивает с толку, потому что после поиска в сети я обнаружил, что это окно служит для всех других окон и позволяет им переключаться (возможно, я их не так понял)   -  person MadHer    schedule 11.06.2018
comment
насчет слота DisplayFen нет не понятно , не вижу когда они будут активированы   -  person MadHer    schedule 11.06.2018
comment
возможный дубликат Как использовать QStackedWidget в графическом интерфейсе?   -  person eyllanesc    schedule 11.06.2018
comment
где вы определили сигнал askDisplayFen?   -  person eyllanesc    schedule 11.06.2018
comment
Я видел много примеров в Интернете, но ни один из них не показывает, как переключиться на другое окно из других окон, может быть, я не прав, но это то, что я нашел, они просто объясняют, что мы должны определить главное окно, подобное моему , но другой процесс не ясен после , я предполагаю , что правильный вопрос сейчас -- как использовать этот askdiplayFen в других окнах , и как будет называться slotDisplayFen ? кстати спасибо за все ваши ответы   -  person MadHer    schedule 11.06.2018
comment
По вашему объяснению я понял что код который работает работает но он вам не нравится но я вижу что этот код не работает рекомендую вам почитать примеры Qt вы хотите узнать новое не установив основы , до свидания.   -  person eyllanesc    schedule 11.06.2018
comment
насчет askDisplayFen, это хороший вопрос, здесь он не определен, угадайте, в чем дело, он должен быть определен в других окнах, но все еще пытается определить, какое это будет определение   -  person MadHer    schedule 11.06.2018
comment
Я не знаю, не спрашивайте меня об этом, это ваш код, а не мой. просмотрите пример того, где вы его взяли.   -  person eyllanesc    schedule 11.06.2018
comment
openclassrooms.com/forum/sujet/   -  person MadHer    schedule 11.06.2018
comment
спросите на форуме, попросите автора показать больше кода, я рекомендую вам проверить примеры, предоставленные Qt, их сотни. Не используйте неполные примеры, потому что, поскольку вы новичок, вы запутаетесь, ищите полные коды.   -  person eyllanesc    schedule 11.06.2018
comment
сэр, я знаю, что у вас нет точных представлений о моем коде, я ценю то, как вы мне помогли, но я просто сказал, что вы помогли мне понять, что нет определения сигнала askDisplayFen, и это на 70% ответ моего вопрос, так что еще раз спасибо!   -  person MadHer    schedule 11.06.2018


Ответы (2)


Я поделился с приведенным ниже примером кода, я надеюсь, что это поможет вам.

#include "test1.h"
#include "ui_test1.h"
#include<QDebug>

test1::test1(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::test1)
{
 ui->setupUi(this);
 stack = new QStackedWidget(this);
 tes = new test2();
 stack->addWidget(ui->pushButton);
 stack->addWidget(tes);
 this->setCentralWidget(stack);
 stack->setCurrentIndex(0);
 connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(slotDisplayFen()));

}

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

void test1::slotDisplayFen()
{
  qDebug()<<"test";
  stack->setCurrentIndex(1);
}
person Subrata Das    schedule 11.06.2018

Ответ заключается в том, чтобы просто определить пользовательский сигнал в нужном окне для переключения, и этот сигнал будет отправлен в главное окно, чтобы оно отображало правильный переключатель для вас.

person MadHer    schedule 11.06.2018