【问题标题】:QStackedWidget how to use it exactly?QStackedWidget究竟如何使用呢?
【发布时间】: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


【解决方案1】:

我分享了下面的示例代码,希望对您有所帮助。

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

【讨论】:

    【解决方案2】:

    答案只是在想要切换的窗口上定义一个自定义信号,该信号将被发送到主窗口,以便为您显示正确的开关

    【讨论】:

      猜你喜欢
      • 2011-09-17
      • 1970-01-01
      • 2011-04-16
      • 2019-08-21
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多