篇首语:本文由小编为大家整理,主要介绍了Qt--堆栈窗口(QStackedWidget)的使用相关的知识,希望对你有一定的参考价值。
前言:
最近开发上位机需要用到切换窗口的功能,Qt上有多种方法可以实现窗口的切换,其中Qt提供了QStackedWidget类,可以方便地实现窗口切换。
QStackedWidget,顾名思义,就是将widget存放再堆栈中,每个widget都有索引,可以指定索引来显示某一层的widget。以下例程中,使用QListWidget来选择要显示的页面。
Qt Creator提供了丰富的示例和教程,在示例中搜索Stacked Widget便可以找到QStackedWidget的示例。
示例运行后的结果:
以下参照Qt Creator示例创建简单的QStackedWidget工程。
工程包括头文件mystackedwidget.h pages.h和CPP文件mystackedwidget.cpp pages.cpp main.cpp。
pages.h
#ifndef PAGES_H#define PAGES_H#include class Page1 : public QWidgetpublic: Page1(QWidget *parent = 0);;class Page2 : public QWidgetpublic: Page2(QWidget *parent = 0);;#endif // PAGES_H
pages.cpp
#include "pages.h"#include Page1::Page1(QWidget *parent) : QWidget(parent) QLabel *pageName = new QLabel(tr("Page1")); //页面设置 QHBoxLayout *myLayout = new QHBoxLayout; myLayout->addWidget(pageName, 1, Qt::AlignCenter); setLayout(myLayout);Page2::Page2(QWidget *parent) : QWidget(parent) QLabel *pageName = new QLabel(tr("Page2")); QHBoxLayout *myLayout = new QHBoxLayout; myLayout->addWidget(pageName, 1, Qt::AlignCenter); setLayout(myLayout);
mystackedwidget.h
#ifndef MYSTACKEDWIDGET_H#define MYSTACKEDWIDGET_H#include #include #include class MYStackedWidget : public QWidget Q_OBJECTprivate: QListWidget *list; QStackedWidget *pages; void setLists();public: MYStackedWidget(QWidget *parent = 0); ~MYStackedWidget();public slots: void changePage(QListWidgetItem *current, QListWidgetItem *previous);;#endif // MYSTACKEDWIDGET_H
mystackedwidget.cpp
#include "mystackedwidget.h"#include "pages.h"#include MYStackedWidget::MYStackedWidget(QWidget *parent) : QWidget(parent) list = new QListWidget; list->setCurrentRow(0); pages = new QStackedWidget; pages->addWidget(new Page1); //往堆栈窗口里面添加页面 pages->addWidget(new Page2); setLists(); QHBoxLayout *myLayout = new QHBoxLayout; myLayout->addWidget(list); //设置布局 myLayout->addWidget(pages); myLayout->setStretchFactor(list, 1); //设置显示列表和窗口的比例1:10 myLayout->setStretchFactor(pages, 10); setLayout(myLayout); setWindowTitle(tr("Example of QStackedWidget"));void MYStackedWidget::setLists() QListWidgetItem *page1Button = new QListWidgetItem(list); //设置显示列表 page1Button->setText(tr("Page1")); page1Button->setTextAlignment(Qt::AlignHCenter); page1Button->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *page2Button = new QListWidgetItem(list); page2Button->setText(tr("Page2")); page2Button->setTextAlignment(Qt::AlignHCenter); page2Button->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); connect(list, //将显示列表与堆栈窗口关联,点击列表中的按键,显示相应的窗口 SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(changePage(QListWidgetItem*,QListWidgetItem*)));void MYStackedWidget::changePage(QListWidgetItem *current, QListWidgetItem *previous) if (!current) current = previous; pages->setCurrentIndex(list->row(current));MYStackedWidget::~MYStackedWidget()
mian.cpp
#include "mystackedwidget.h"#include int main(int argc, char *argv[]) QApplication a(argc, argv); MYStackedWidget w; w.show(); return a.exec();
.pro
#-------------------------------------------------## Project created by QtCreator 2017-01-12T13:49:03##-------------------------------------------------QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = myStackedWidgetTEMPLATE = appSOURCES += main.cpp\ mystackedwidget.cpp \ pages.cppHEADERS += mystackedwidget.h \ pages.h
程序运行结果如下:
箭头1处为QListWidget,用于选择要显示的页面
箭头2处为QStackedWidget,用于显示不同页面
总结:用QStackedWidget结合QListWidget来实现页面切换比较简单,主要包括堆栈页面设置,窗口显示列表显示和信号与槽的连接等。Qt Creato给出的示例更加完善,还使用了图标按键,使得界面更加好看。
以上是关于Qt--堆栈窗口(QStackedWidget)的使用的主要内容,如果未能解决你的问题,请参考以下文章