3.3 堆栈窗体类-QStackedWidget
3.3 堆栈窗体类(QStackedWidget)
我们之前讲过,在Qt中有很多的容器类(QVector,QList,QMap,QSet等),实际上这些容器时不能用来装Widget部件的(比如你
不能往QVector中插入一个QDialog的对话框对象[因为这些基于QWidget类的这些窗口类都没有重载operator=和拷贝构造函数])
但是Qt中又需要这样的特殊的可以用来装窗口部件的容器(来描述窗口和窗口之间的关系),这也就是所谓的QWidget容器的一系列类
而我们今天要讲的这个QStackedWidget类就是专用于装窗口部件的一种堆栈结构的容器
3.3.1 QStackedWidget类
常用的成员方法
QStackedWidget(QWidget *parent = nullptr)//构造器,用于构造一个QStackedWidget对象
virtual ~QStackedWidget()//析构器
int addWidget(QWidget *widget)//往这个堆栈窗体容器中添加一个任何基于QWidget类的窗口部件
int count() const//该堆栈容器中有多少个窗口部件
int currentIndex() const//默认的窗体部件的索引(这个描述的是当前默认的窗体部件)
QWidget *currentWidget() const//当前的窗体部件
int indexOf(QWidget *widget) const//根据窗体部件得到它在整个容器中的位置
int insertWidget(int index, QWidget *widget)//插入窗体部件
void removeWidget(QWidget *widget)//移除窗体部件
QWidget *widget(int index) const//根据索引返回窗体部件指针
常用的信号和槽
Public Slots:
void setCurrentIndex(int index)//根据索引设置默认的窗体
void setCurrentWidget(QWidget *widget)//根据窗体指针设置默认的窗体
Signals:
void currentChanged(int index)//默认的窗体被改变
void widgetRemoved(int index)//有窗体被移除
3.3.2 接下来我们将通过一个案例来初步了解QStackedWidget的使用(见QStackedWidgetDemo_00)
3.3.2.1 新建Qt的界面项目,将工程命名为QStackedWidgetDemo_00
3.3.2.2 勾选"创建UI界面"的勾选框,将类名设置为QStackedWidgetDemo
3.3.2.3 在qstackedwidgetdemo.h中添加下面代码
#ifndef QSTACKEDWIDGETDEMO_H
#define QSTACKEDWIDGETDEMO_H
#include <QWidget>
#include<QDebug>
#include <QStackedWidget>
#include <QLabel>
#include <QPushButton>
QT_BEGIN_NAMESPACE
namespace Ui { class QStackedWidgetDemo; }
QT_END_NAMESPACE
class QStackedWidgetDemo : public QWidget
{
Q_OBJECT
public:
QStackedWidgetDemo(QWidget *parent = nullptr);
~QStackedWidgetDemo();
private slots:
//用于处理4个PushButton的clicked信号的槽函数
void onClickShowLabelA(bool checked);
void onClickShowLabelB(bool checked);
void onClickShowLabelC(bool checked);
void onClickShowLabelD(bool checked);
private:
Ui::QStackedWidgetDemo *ui;
QStackedWidget*m_stackedWidget;//堆栈窗体指针
//4个Label指针
QLabel*m_labelA;
QLabel*m_labelB;
QLabel*m_labelC;
QLabel*m_labelD;
};
#endif // QSTACKEDWIDGETDEMO_H
3.3.2.4 在qstackedwidgetdemo.cpp中添加下面的代码
#include "qstackedwidgetdemo.h"
#include "ui_qstackedwidgetdemo.h"
QStackedWidgetDemo::QStackedWidgetDemo(QWidget *parent):QWidget(parent),ui(new Ui::QStackedWidgetDemo)
{
ui->setupUi(this);
//new出这些成员
m_stackedWidget = new QStackedWidget(this);
m_labelA = new QLabel(QString("LabelA"));
m_labelB = new QLabel(QString("LabelB"));
m_labelC = new QLabel(QString("LabelC"));
m_labelD = new QLabel(QString("LabelD"));
//将4个Label添加到堆栈容器中(添加之后,会默认第一个被添加进去的为默认的Widget)
m_stackedWidget->addWidget(m_labelA);
m_stackedWidget->addWidget(m_labelB);
m_stackedWidget->addWidget(m_labelC);
m_stackedWidget->addWidget(m_labelD);
//连接Button和对应的槽函数
connect(ui->showABtn,&QPushButton::clicked,this,&QStackedWidgetDemo::onClickShowLabelA);
connect(ui->showBBtn,&QPushButton::clicked,this,&QStackedWidgetDemo::onClickShowLabelB);
connect(ui->showCBtn,&QPushButton::clicked,this,&QStackedWidgetDemo::onClickShowLabelC);
connect(ui->showDBtn,&QPushButton::clicked,this,&QStackedWidgetDemo::onClickShowLabelD);
}
QStackedWidgetDemo::~QStackedWidgetDemo()
{
delete ui;
}
//点击显示LabeA
void QStackedWidgetDemo::onClickShowLabelA(bool checked)
{
this->m_stackedWidget->setCurrentIndex(0);//将默认的Widget的索引设置为第0个
}
//点击显示LabeB
void QStackedWidgetDemo::onClickShowLabelB(bool checked)
{
this->m_stackedWidget->setCurrentIndex(1);//将默认的Widget的索引设置为第1个
}
//点击显示LabeC
void QStackedWidgetDemo::onClickShowLabelC(bool checked)
{
this->m_stackedWidget->setCurrentIndex(2);//将默认的Widget的索引设置为第2个
}
//点击显示LabeD
void QStackedWidgetDemo::onClickShowLabelD(bool checked)
{
this->m_stackedWidget->setCurrentIndex(3);//将默认的Widget的索引设置为第3个
}
3.3.3 做完上面的案例之后,我们将讲解一个新的Widget容器--QListWidget容器,我们将使用它配合我们的
QStackedWidget类来实现一个简单的页面切换效果的界面(见QStackedWidgetDemo_01)
3.3.3.1 新建一个Qt桌面项目,将项目名称命名为见QStackedWidgetDemo_01,然后取消勾选"创建UI界面"勾选框
3.3.3.2 在qstackedwidgetdemo.h中添加以下代码
#ifndef QSTACKEDWIDGETDEMO_H
#define QSTACKEDWIDGETDEMO_H
#include <QWidget>
#include <QHBoxLayout>
#include <QStackedWidget>
#include <QListWidget>
#include <QLabel>
class QStackedWidgetDemo : public QWidget
{
Q_OBJECT
public:
QStackedWidgetDemo(QWidget *parent = nullptr);
~QStackedWidgetDemo();
private:
QStackedWidget*m_stackedwidget;//堆栈窗体对象
QListWidget*m_listwidget;//列表窗体对象
QLabel*m_labelA;//LabelA对象
QLabel*m_labelB;//LabelB对象
QLabel*m_labelC;//LabelC对象
QLabel*m_labelD;//LabelD对象
QHBoxLayout*m_mainLayout;//主布局,这里我们采用水平布局的方式
};
#endif // QSTACKEDWIDGETDEMO_H
3.3.3.3 在qstackedwidgetdemo.cpp中添加以下代码
#include "qstackedwidgetdemo.h"
QStackedWidgetDemo::QStackedWidgetDemo(QWidget *parent):QWidget(parent)
{
m_mainLayout = new QHBoxLayout(this);//new出主布局(水平布局),父窗口就是this
m_stackedwidget = new QStackedWidget;//new出堆栈窗体类(用来装那4个Label)
m_listwidget = new QListWidget;//列表窗体,这个用来选择要显示的窗体
m_listwidget->addItem(QString("LabelA"));//添加列表项A
m_listwidget->addItem(QString("LabelB"));//添加列表项B
m_listwidget->addItem(QString("LabelC"));//添加列表项C
m_listwidget->addItem(QString("LabelD"));//添加列表项D
m_labelA = new QLabel(QString("Label_A"));//new出LabelA
m_labelB = new QLabel(QString("Label_B"));//new出LabelB
m_labelC = new QLabel(QString("Label_C"));//new出LabelC
m_labelD = new QLabel(QString("Label_D"));//new出LabelD
m_stackedwidget->addWidget(m_labelA);//添加LabelA到堆栈窗体类容器中
m_stackedwidget->addWidget(m_labelB);//添加LabelB到堆栈窗体类容器中
m_stackedwidget->addWidget(m_labelC);//添加LabelC到堆栈窗体类容器中
m_stackedwidget->addWidget(m_labelD);//添加LabelD到堆栈窗体类容器中
m_mainLayout->addWidget(m_listwidget,0);//往主布局中添加堆栈窗体对象
m_mainLayout->addWidget(m_stackedwidget,1);//往主布局中添加列表窗体对象
//连接ListWidget的默认行被改变的这个信号和StackedWidget的设置默认显示窗体的下标的槽函数,如此一来,当我们点击ListWidget中的条目时,会有默认行改变这一
//信号产生,并且会将改变之后的行的下标通过参数传递给StackedWidget的槽函数(因为这里的信号和槽函数的参数列表都是一样的)
connect(m_listwidget,&QListWidget::currentRowChanged,this->m_stackedwidget,&QStackedWidget::setCurrentIndex);
}
QStackedWidgetDemo::~QStackedWidgetDemo()
{
}
3.3.2 QListWidget类的常用方法
QListWidget(QWidget *parent = nullptr)//构造器,用于构造一个QListWidget对象
virtual ~QListWidget()//虚析构器
void addItem(const QString &label)//添加一个列表项目(以QString的形式来添加)
void addItem(QListWidgetItem *item)//通过QListWidgetItem指针来添加一个列表项
void addItems(const QStringList &labels)//通过QStringList来批量添加列表项
void closePersistentEditor(QListWidgetItem *item)//关闭该Item的文本编辑器
int count() const//返回该ListWidget中有多少个Item
QListWidgetItem *currentItem() const//返回当前的Item的指针
int currentRow() const//返回有多少行
void editItem(QListWidgetItem *item)//编辑item指针
QList<QListWidgetItem *> findItems(const QString &text, Qt::MatchFlags flags) const//查找列表项(它会返回一个QList<QListWidgetItem*>的列表)
void insertItem(int row, QListWidgetItem *item)//插入列表项(通过QListWidgetItem指针往里面添加)
void insertItem(int row, const QString &label)//插入列表项(通过字符串的形式往里面插入)
void insertItems(int row, const QStringList &labels)//一次性在row之后插入多个列表项(通过字符串列表插入)
bool isPersistentEditorOpen(QListWidgetItem *item) const//判断item的文本编辑器是否被打开
bool isSortingEnabled() const//是否开启了列表的排序
QListWidgetItem *item(int row) const//通过行下标返回item指针
QListWidgetItem *itemAt(const QPoint &p) const//通过坐标的形式返回item指针
QListWidgetItem *itemAt(int x, int y) const//通过坐标的形式返回item指针
QWidget *itemWidget(QListWidgetItem *item) const//将QListWidgetItem指针转换为QWidget*后返回
void openPersistentEditor(QListWidgetItem *item)//打开item的文本编辑器
void removeItemWidget(QListWidgetItem *item)//通过item指针移除列表项
int row(const QListWidgetItem *item) const//通过item指针返回其在列表容器中的行下标
QList<QListWidgetItem *> selectedItems() const//选择的列表项(这会返回一个QList<QListWidgetItem*>的列表)
void setCurrentItem(QListWidgetItem *item)//设置默认的Item(通过QListWidgetItem指针来设置)
void setCurrentItem(QListWidgetItem *item, QItemSelectionModel::SelectionFlags command)//设置默认的Item(通过QListWidgetItem指针来设置),同时还可以指定选择的方式
void setCurrentRow(int row)//设置默认的行
void setCurrentRow(int row, QItemSelectionModel::SelectionFlags command)//设置默认的行(可以指定选择方式)
void setItemWidget(QListWidgetItem *item, QWidget *widget)//列表项设置到某个wiget指针上
void setSortingEnabled(bool enable)//设置列表排序
void sortItems(Qt::SortOrder order = Qt::AscendingOrder)//对列表项进行排序(可以指定排序方式)
QListWidgetItem *takeItem(int row)//通过行下标拿走列表中的item(这会将要拿走的列表项从列表中移除)
常用的信号和槽
Signals:
void currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)//当默认的列表项被改变时,会有此信号产生,并且会将在选择之前原来的列表项也一并通过形参返回
void currentRowChanged(int currentRow)//当列表项的默认行改变时,会有此信号产生
void currentTextChanged(const QString ¤tText)//当列表的文字框内容改变时,会产生此信号
void itemActivated(QListWidgetItem *item)//列表项有活动时会产生此信号(比如用户单击或双击列表项)
void itemChanged(QListWidgetItem *item)//当列表项里面的数据被改变时,会有此信号产生
void itemClicked(QListWidgetItem *item)//当列表项被点击时,会产生此信号(并且返回用户点击了哪一个列表项的指针)
void itemDoubleClicked(QListWidgetItem *item)//当列表项被双击时,会产生此信号(并返回用户双击了哪一个列表项的指针)
void itemEntered(QListWidgetItem *item)//当用户的鼠标光标进入到该列表项的区域中时,会有此信号产生
void itemPressed(QListWidgetItem *item)//当用户在某列表项上按下鼠标左键(不松开)时,此信号会产生
void itemSelectionChanged()//当用户选择的多个列表项重新改变时,会产生此信号
slots:
void clear()//清除列表中的所有的的item
void scrollToItem(const QListWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible)//滚动到列表中指定的item上
本文章的案例代码链接:https://files.cnblogs.com/files/blogs/792763/QStackedWidgetDemo.zip?t=1697426560&download=true

浙公网安备 33010602011771号