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 &currentText)//当列表的文字框内容改变时,会产生此信号
            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

 

posted @ 2023-10-16 11:23  蜡笔小新Pointer  阅读(1883)  评论(0)    收藏  举报