开发者

Qt - QStackedWidget and QTabsExample help

开发者 https://www.devze.com 2023-01-26 03:43 出处:网络
Basically, I have multiple widgets I\'m trying to switch between... and the default is a QTabWidget.Aside from some modification, the two examples (QStackedWidget and QTabsExapmle) are just mingled to

Basically, I have multiple widgets I'm trying to switch between... and the default is a QTabWidget. Aside from some modification, the two examples (QStackedWidget and QTabsExapmle) are just mingled together. I can't get the "connect" portion to work (get an error: no matching function for call to QTabsExample::connect), and nothing displays on screen unless stackedWidget->addWidget(tabWidget) is the first in the list (and even then, I only see the view in the upper left hand corner).

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

Qt - QStackedWidget and QTabsExample help


Well for starters you need to uncomment //QTabsExample w; in main.cpp, but I guess, that is just a relict from experimenting...

Also, what do you mean by "nothing displays on screen."?

Do you mean, that an empty window pops up? Or does no window at all open? Or does the screen turn black?

Have you eliminated the possibility that the "app.css" file might be corrupt?

Have you tried deleting the Makefiles and moc_* files?

EDIT: I tried to simplify the constructor of 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    
}

Expected behaviour:

  • a combo box on the top with choices: "Tab Page", "page 2", ...
  • below a QTabWidget witht the tabs: "Tab1", "Tab2", "Tab3"
  • Tab1 should be displayed with a QLabel, which says "Widget1"
  • when you select another tab, the label should say "WidgetX" // depending on your choice
  • when you select another widget from the combo box you should see "HelloX" // depending on your choice
0

精彩评论

暂无评论...
验证码 换一张
取 消