QStackedWidget, как именно его использовать? - PullRequest
0 голосов
/ 11 июня 2018

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

Мой вопрос:

Из другого окна, как я могу переключиться на другое окно (отличное от текущего)?Нужно ли мне определять это 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

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()));
}

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

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

0 голосов
/ 11 июня 2018

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

#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);
}
...