2010-11-17 20 views
0

Fondamentalement, j'ai plusieurs widgets que j'essaie de basculer entre ... et la valeur par défaut est un QTabWidget. Mis à part quelques modifications, les deux exemples (QStackedWidget et QTabsExapmle) sont simplement mélangés. Je ne peux pas faire fonctionner la partie "connect" (obtenir une erreur: pas de fonction correspondante pour l'appel à QTabsExample :: connect), et rien ne s'affiche à l'écran sauf si stackedWidget->addWidget(tabWidget) est le premier dans la liste (et même la vue dans le coin supérieur gauche).Qt - QStackedWidget et l'aide QTabsExample

QTabsExample.h

#ifndef QTABSEXAMPLE_H 
#define QTABSEXAMPLE_H 

#include <QtGui/QMainWindow> 
#include <QtGui/QScrollArea> 
#include <QtGui/QFrame> 
#include <QtGui/QVBoxLayout> 
#include <QtGui/QPushButton> 
#include <QtGui/QLabel> 
#include <QtGui/QLineEdit> 
#include <QtGui/QGroupBox> 
#include <QtGui/QFormLayout> 
#include <QtGui/QMessageBox> 

#include <QtCore/QPointer> 
#include <QtCore/QFile> 
#include <QtCore/QIODevice> 
#include <QtCore/QList> 
#include <QtCore/QMap> 
#include <QtCore/QString> 

#include <QtXml/QXmlStreamReader> 
#include <QtDebug> 
#include <QBool> 
#include <QSignalMapper> 
#include <QStackedLayout> 

class QTabsExample: public QMainWindow { 

    Q_OBJECT 

public: 
    QTabsExample(QWidget *parent = 0); 
    ~QTabsExample(); 

private: 
    void buildTabMenuBar(int index); 

public slots: 
    void activeTabChanged(int index); 
    void setCurrentIndex(int); 

signals: 
    void activated(int); 

private: 
    QTabWidget* tabWidget; 
    QWidget* customWidget1; 
    QWidget* customWidget2; 
    QWidget* customWidget3; 

}; 

// --------------------------------------------------------------------------- 
// QMyWidget - Tab1 
// 
class QMyWidget: public QWidget { 

    Q_OBJECT 

public: 
    QMyWidget(QWidget *parent = 0); 
    ~QMyWidget(); 

public slots: 
    void runOnTabSelect(); 

private: 
    QPointer<QVBoxLayout> _layout; 

}; 

// --------------------------------------------------------------------------- 
// QMyWidget2 - Tab2 
// 
class QMyWidget2: public QWidget { 

    Q_OBJECT 

public: 
    QMyWidget2(QWidget *parent = 0); 
    ~QMyWidget2(); 

public slots: 
    void runOnTabSelect(); 
}; 

// --------------------------------------------------------------------------- 
// QMyWidget3 - Tab3 
// 
class QMyWidget3: public QWidget { 

    Q_OBJECT 

public: 
    QMyWidget3(QWidget *parent = 0); 
    ~QMyWidget3(); 

public slots: 
    void runOnTabSelect(); 

private: 
    QPointer<QVBoxLayout> _layout; 

}; 


#endif // QTABSEXAMPLE_H 

QTabsExample.cpp

#include <QtGui> 
#include <QApplication> 
#include "QTabsExample.h" 

QTabsExample::QTabsExample(QWidget *parent) : QMainWindow(parent) { 

    setContextMenuPolicy(Qt::NoContextMenu); 
    this->setWindowTitle("Main Window, I think"); 

    QStackedLayout *stackedLayout = new QStackedLayout; 

    //create tab widget 
    QTabWidget *tabWidget = new QTabWidget(); 
    tabWidget->setContextMenuPolicy(Qt::NoContextMenu); 

    QObject::connect(tabWidget, SIGNAL(currentChanged(int)),this, SLOT(activeTabChanged(int))); 

    QMyWidget* widget1 = new QMyWidget(); 
    tabWidget->addTab(widget1, "Tab1"); 
    QMyWidget2* widget2 = new QMyWidget2(); 
    tabWidget->addTab(widget2, "Tab2"); 
    QMyWidget3* widget3 = new QMyWidget3(); 
    tabWidget->addTab(widget3, "Tab3"); 

    //set programatically 
    tabWidget->setStyleSheet("QTabBar::tab { height: 70px; width: 80px; font-size: 15px;}"); 

    //create other widgets 
    QWidget* customWidget1 = new QWidget; 
    QWidget* customWidget2 = new QWidget; 
    QWidget* customWidget3 = new QWidget; 

    //add layouts to widgets 
    customWidget1->setContextMenuPolicy(Qt::NoContextMenu); 
    customWidget2->setContextMenuPolicy(Qt::NoContextMenu); 
    customWidget3->setContextMenuPolicy(Qt::NoContextMenu); 

    customWidget1->setWindowTitle("Widget 1"); 
    customWidget2->setWindowTitle("Widget 2"); 
    customWidget3->setWindowTitle("Widget 3"); 

    //insert content to make sure it's viewable 
    QPalette palette; 
    palette.setBrush(this->backgroundRole(), QBrush(QImage("c://default.png"))); 
    customWidget1->setPalette(palette); 
    palette.setBrush(this->backgroundRole(), QBrush(QImage("c://default2.png"))); 
    customWidget2->setPalette(palette); 
    palette.setBrush(this->backgroundRole(), QBrush(QImage("c://default3.png"))); 
    customWidget3->setPalette(palette); 

    //add widgets to stack 
    stackedLayout->addWidget(tabWidget); 
    stackedLayout->addWidget(customWidget1); 
    stackedLayout->addWidget(customWidget2); 
    stackedLayout->addWidget(customWidget3); 

    QComboBox *pageComboBox = new QComboBox; 
    pageComboBox->addItem(tr("Tab Page")); 
    pageComboBox->addItem(tr("page 2")); 
    pageComboBox->addItem(tr("page 3")); 
    pageComboBox->addItem(tr("page 4")); 
    connect(pageComboBox, SIGNAL(activated(int))), stackedLayout, SLOT(setCurrentIndex(int)); 

    QVBoxLayout *_layout = new QVBoxLayout; 

    _layout->addWidget(pageComboBox); 
    _layout->addLayout(stackedLayout); 
    setLayout(_layout); 

    //setCentralWidget(tabWidget); 

#ifdef Q_OS_SYMBIAN 
    QWidgetList widgets = QApplication::allWidgets(); 
    QWidget* w = 0; 
    foreach(w,widgets) { 
      w->setContextMenuPolicy(Qt::NoContextMenu); 
    } 
#endif  
} 

QTabsExample::~QTabsExample(){ 

} 

void QTabsExample::activeTabChanged(int index) { 

    buildTabMenuBar(index); 

} 

void QTabsExample::buildTabMenuBar(int index) { 

    QMenuBar* menubar = menuBar(); 
    menubar->clear(); 

    switch (index) { 

    case 0: 
    { 
     menubar->addAction("", tabWidget->widget(index), SLOT(runOnTabSelect())); 
     break; 
    } 
    case 1: 
    { 
     menubar->addAction("", tabWidget->widget(index), SLOT(runOnTabSelect())); 
     break; 
    } 
    case 2: 
    { 
     menubar->addAction("", tabWidget->widget(index), SLOT(runOnTabSelect())); 
     break; 
    } 
    default: 
    { 
     break; 
    } 
    }; 
} 

//tab1 
QMyWidget::QMyWidget(QWidget *parent) : QWidget(parent) { 

    setContextMenuPolicy(Qt::NoContextMenu); 

    QVBoxLayout* _layout = new QVBoxLayout(this); 

    //buttons get created 

    this->setLayout(_layout); 

} 

QMyWidget::~QMyWidget() { 

} 

void QMyWidget::runOnTabSelect() { 

} 

//tab2 
QMyWidget2::QMyWidget2(QWidget *parent) : QWidget(parent) { 

    setContextMenuPolicy(Qt::NoContextMenu); 

    QVBoxLayout* _layout = new QVBoxLayout(this); 

    //buttons get created 

    this->setLayout(_layout); 
} 

QMyWidget2::~QMyWidget2() { 

} 

void QMyWidget2::runOnTabSelect() { 

} 

//tab3 
QMyWidget3::QMyWidget3(QWidget *parent) : QWidget(parent) { 

    setContextMenuPolicy(Qt::NoContextMenu); 

    QVBoxLayout* _layout = new QVBoxLayout(this); 

    //buttons get created 

    this->setLayout(_layout); 

} 

QMyWidget3::~QMyWidget3() { 

} 

void QMyWidget3::runOnTabSelect() { 

} 

main.cpp

#include "QTabsExample.h"" 

#include <QtGui> 
#include <QApplication> 
#include <QtGui/QApplication> 
#include <QPixmap> 
#include <QWidget> 
#include <QMainWindow> 
#include <QSplashScreen> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QTabsExample w; 
    w.showMaximized(); 
    return a.exec(); 
} 

What I see when I run the app

+1

Pourriez-vous réduire la quantité de code et fournir un exemple minimal? –

+0

c'est un peu un exemple minimal ... mis à part la quantité d'onglets. Je vais éditer pour moins d'onglets. –

+0

j'ai enlevé quelques choses, mais il y a encore 3 onglets. Je dirais que c'est plutôt standard ... J'ai juste combiné 2 exemples. –

Répondre

0

Eh bien pour commencer, vous devez décommentez //QTabsExample w; dans main.cpp, mais je suppose, c'est juste une relique de l'expérimentation ...

Aussi, que voulez-vous dire par "rien ne s'affiche à l'écran."?

Voulez-vous dire qu'une fenêtre vide apparaît? Ou aucune fenêtre du tout ouverte? Ou l'écran devient-il noir?

Avez-vous éliminé la possibilité que le fichier "app.css" soit corrompu?

Avez-vous essayé de supprimer les fichiers Makefiles et moc_ *?

EDIT: J'ai essayé de simplifier le constructeur de QTabsExample

#include <QtGui> 
#include <QApplication> 
#include "QTabsExample.h" 

QTabsExample::QTabsExample(QWidget *parent) : QMainWindow(parent) { 

    setContextMenuPolicy(Qt::NoContextMenu); 
    this->setWindowTitle("Main Window, I think"); 

    //create tab widget 
    QTabWidget *tabWidget = new QTabWidget(); 
    tabWidget->setContextMenuPolicy(Qt::NoContextMenu); 

    //QObject::connect(tabWidget, SIGNAL(currentChanged(int)),this, SLOT(activeTabChanged(int))); // I have no experience with mobile developement 
    // can you manipulate the menubar on a mobile device? 

    QMyWidget* widget1 = new QLabel(tr("Widget1")); // simplification 
    tabWidget->addTab(widget1, "Tab1"); 
    QMyWidget2* widget2 = new QLabel(tr("Widget2")); 
    tabWidget->addTab(widget2, "Tab2"); 
    QMyWidget3* widget3 = new QLabel(tr("Widget3")); 
    tabWidget->addTab(widget3, "Tab3"); 

    //set programatically 
    tabWidget->setStyleSheet("QTabBar::tab { height: 70px; width: 80px; font-size: 15px;}"); 

    //create other widgets 
    QWidget* customWidget1 = new QLabel(tr("Hello1")); // simplification 
    QWidget* customWidget2 = new QLabel(tr("Hello2")); 
    QWidget* customWidget3 = new QLabel(tr("Hello3")); 

    // create stacked layout (closer to where it is actually used) 
    QStackedLayout *stackedLayout = new QStackedLayout; 

    //add widgets to stack 
    stackedLayout->addWidget(tabWidget); 
    stackedLayout->addWidget(customWidget1); 
    stackedLayout->addWidget(customWidget2); 
    stackedLayout->addWidget(customWidget3); 

    QComboBox *pageComboBox = new QComboBox; 
    pageComboBox->addItem(tr("Tab Page")); 
    pageComboBox->addItem(tr("page 2")); 
    pageComboBox->addItem(tr("page 3")); 
    pageComboBox->addItem(tr("page 4")); 
    connect(pageComboBox, SIGNAL(activated(int))), stackedLayout, SLOT(setCurrentIndex(int)); 

    QVBoxLayout *_layout = new QVBoxLayout; 

    _layout->addWidget(pageComboBox); 
    _layout->addLayout(stackedLayout); 
    setLayout(_layout); 

    //setCentralWidget(tabWidget); 

#ifdef Q_OS_SYMBIAN 
    QWidgetList widgets = QApplication::allWidgets(); 
    QWidget* w = 0; 
    foreach(w,widgets) { 
      w->setContextMenuPolicy(Qt::NoContextMenu); 
    } 
#endif  
} 

Comportement attendu:

  • une zone de liste déroulante sur le dessus avec des choix: page "Onglet", » 2 ", ...
  • ci-dessous un QTabWidget avec les onglets:" Tab1 "," Tab2 "," Tab3 "
  • Tab1 devrait b Lorsque vous sélectionnez un autre onglet, l'étiquette doit indiquer "WidgetX" // en fonction de votre choix
  • lorsque vous sélectionnez un autre widget dans la zone de liste déroulante, vous devriez voir "HelloX" "// en fonction de votre choix
+0

Je l'ai fait commenter, comme l'exemple QStackedWidget montre QWidget w; comme la fenêtre principale (puisque le QTabWidget ferait partie de la pile). –

+0

Par rien ne s'affiche à l'écran, je veux dire une fenêtre vide apparaît. Le fichier app.css n'est pas corrompu. J'ai essayé de nettoyer et d'exécuter qmake, mais je vais devoir regarder dans les fichiers moc_ *. –

+0

'QTabsExample' n'est pas' QTabWidget' ... 'QStackedWidget' est dans votre exemple créé dans le constructeur de' QTabsExample'. 'QWidget w;' crée juste un widget vide. – bjoernz