Qt - QStackedWidget和QTabsExample帮助

时间:2010-11-17 21:56:46

标签: c++ qt qt4

基本上,我有多个小工具,我正在尝试切换...而默认是QTabWidget。除了一些修改之外,两个例子(QStackedWidget和QTabsExapmle)只是混合在一起。我无法使“连接”部分工作(得到一个错误:没有匹配函数来调用QTabsExample :: connect),除非stackedWidget->addWidget(tabWidget)是列表中的第一个,否则屏幕上不会显示任何内容(即使这样,我只看到左上角的视图。

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 个答案:

答案 0 :(得分:0)

首先,您需要在//QTabsExample w;中取消注释main.cpp,但我想,这只是实验中的遗留......

另外,“屏幕上没有显示任何内容”是什么意思?“

你的意思是,一个空窗口会弹出来吗?或者根本没有窗户打开?或者屏幕变黑了吗?

您是否已消除“app.css”文件可能已损坏的可能性?

您是否尝试删除Makefile和moc_ *文件?

修改 我试图简化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    
}

预期行为:

  • 顶部的组合框,包含选项:“标签页”,“第2页”,...
  • 在QTabWidget下方,带有标签:“Tab1”,“Tab2”,“Tab3”
  • Tab1应显示QLabel,其中显示“Widget1”
  • 当您选择另一个标签时,标签应该根据您的选择说出“WidgetX”
  • 当您从组合框中选择另一个小部件时,您应该看到“HelloX”//取决于您的选择