QT中的StackedWidget控件,通过绑定键盘事件实现窗口的滑动切换

QT中的StackedWidget控件实现窗口的滑动切换

一、StackedWidget控件的简介

StackedWidget是一个容器类控件,它允许我们在里面堆叠多个页面或者面板,并且每个页面内部都可以有自己的布局和内容

二、StackedWidget控件的使用

1.搜索添加控件

StackedWidget控件需要搜索找到,我们可以打开Creator,然后在上方的搜索框中搜索控件名字,然后把控件拖出来就可以了
在这里插入图片描述

控件拖出来之后,右侧的树状图会出现以下内容,其中page和page_2就是两个堆叠的页面了,也可以选择这个控件,然会右键,添加新的页面。
在这里插入图片描述

2.在page中添加控件

page是一个窗口容器,我们可以在里面添加其他控件,并且可以设置这个页面自己的布局方式。下面是我添加的控件,在这里我们把布局方式同样设置成水平布局。
在这里插入图片描述

3.在page_2添加控件

在右侧的树状图中选择page_2,页面会自动切换到一个新的页面中,第二个页面我们设置的简单一些,只添加一个textBrowser_2控件,并且修改其样式表如图所示。
在这里插入图片描述

三、StackedWidget控件的窗口切换-绑定键盘事件

目前UI的设计我们已经完成了,接下来就是写代码,一方面调用StackedWidget的函数切换页面,另一方面绑定键盘事件。键盘事件需要编写事件过滤器,我们的窗口类的名字是MainWindow,那么我们就可以重写这个类的过滤器函数,让他拦截键盘事件。
过滤器的工作原理是在父类中编写过滤器函数,当某一事件要触达该父类的子类时,在到达子类之前会被父类的过滤器拦截处理,若过滤器返回false,则经过过滤器处理后,事件会继续往下传递,否则事件被拦截,不往子类传递。

//在.h文件中声明函数
protected:
    bool eventFilter(QObject *obj, QEvent * eve);
    
//在.cpp文件中编写函数
bool MainWindow::eventFilter(QObject *obj, QEvent * eve)
{
	//页面1过滤器处理
    if((obj == ui->pushButton) | (obj == ui->textBrowser) | (obj == ui->textEdit) | (obj == ui->lineEdit))
    {
        if(eve->type() == QEvent::KeyPress)
        {
            QKeyEvent * event = static_cast<QKeyEvent*>(eve);
            
             //方向键检测-右箭头
             if (event->key() == Qt::Key_Right)
             {
                 ui->stackedWidget->setCurrentIndex(1);
                 return true;
             }
        }
    }

    //页面2过滤器处理
    if(obj == ui->textBrowser_2)
    {
        if(eve->type() == QEvent::KeyPress)
        {
            QKeyEvent * event = static_cast<QKeyEvent*>(eve);

             //方向键检测-左箭头
             if (event->key() == Qt::Key_Left)
             {
                   ui->stackedWidget->setCurrentIndex(0);
                   return true;
            	}
         }
   	}
	return false;
}

//在MainWindow类的构造函数中将过滤器添加到控件
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    //给控件添加事件过滤器
    //页面1
    ui->textEdit->installEventFilter(this);
    ui->textBrowser->installEventFilter(this);
    ui->lineEdit->installEventFilter(this);    
    ui->pushButton->installEventFilter(this);

	//页面2
    ui->textBrowser_2->installEventFilter(this);
}

其中:

  • StackedWidget控件切换面板的函数:setCurrentIndex(index)。其中参数(index)为页面的标号,从0开始,例如:第一个页面的标号为0,第二个页面的标号为1…。这个函数允许我们在程序运行时,根据需要来切换到指定的页面。
  • 对象obj为事件传递的目标对象,我们用着对象判断事件的目标对象是不是我们选定的对象

四、可以优化的地方

Qt中也提供了动画框架,我们在窗口切换的过程中可以添加动画效果,使得窗口切换更加自然美观。这一部分还没有实现,但是后续可以操作一番。

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏夜2029

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值