当前位置: 首页 > article >正文

QT实现列表通过向上向下翻页按钮翻页,以及上下键逐行显示文本行,向左向右键翻页功能

概述

  • 效果
    • 编译环境
    • 代码实现
    • 运行效果
    • 备注

本篇文章的主旨如下:
在窗口中显示一个列表,通过点击界面上的向上翻页按钮和向下翻页按钮,进行翻页,点击键盘上的向上、向下按键实现逐行向上、向下移动选中项,点击向左按键和向右按键实现向前翻页和向后翻页,但向后翻页到最后一页时,若最后一页不够可显示的行数,则从最后一行向前显示,使最后一页显示时不留空行。
本文只要记录上述功能如何实现。

效果

程序运行的效果如下:

qt实现列表翻页,逐行显示功能

编译环境

在ubuntu下QtCreator4.11.0。
在这里插入图片描述

代码实现

这里主要附上该窗口实现的类代码。
mylistwidget.h

#ifndef MYLISTWIDGET_H
#define MYLISTWIDGET_H

#include <QObject>
#include <QWidget>
#include <QListWidget>

class MyListWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyListWidget(QWidget *parent = nullptr);

signals:
private:
    void initInterface();
    void updateVisibleItems();
protected:
    void keyPressEvent(QKeyEvent *event) override;
private slots:
    void slotUpPage();
    void slotDownPage();
private:
    QListWidget *listWidget;
    int currentPageStart = 0; // 当前页开始的索引
};

#endif // MYLISTWIDGET_H

mylistwidget.cpp

#include "mylistwidget.h"

#include <QKeyEvent>
#include <QListWidgetItem>
#include <QPushButton>
#include <QVBoxLayout>

MyListWidget::MyListWidget(QWidget *parent) : QWidget(parent)
{
    initInterface();
}

void MyListWidget::initInterface()
{
    auto *layout = new QVBoxLayout(this);

    listWidget = new QListWidget(this);

    // 填充一些示例数据
    for (int i = 0; i < 13; ++i) {
        QListWidgetItem *item = new QListWidgetItem(QString("项 %1").arg(i + 1));
        listWidget->addItem(item);
    }

    // 初始显示前5项
    currentPageStart = 0;
    updateVisibleItems();
    auto *prevPageButton = new QPushButton("向上翻页", this);
    auto *nextPageButton = new QPushButton("向下翻页", this);

    layout->addWidget(listWidget);
    layout->addWidget(prevPageButton);
    layout->addWidget(nextPageButton);

    connect(prevPageButton,&QPushButton::clicked,this,&MyListWidget::slotUpPage);
    connect(nextPageButton,&QPushButton::clicked,this,&MyListWidget::slotDownPage);
    // 设置焦点策略以便接收键盘事件
    setFocusPolicy(Qt::StrongFocus);
}

void MyListWidget::updateVisibleItems()
{
    // 隐藏所有项
    for (int i = 0; i < listWidget->count(); ++i) {
        listWidget->item(i)->setHidden(true);
    }

    // 显示当前页的项
    for (int i = 0; i < 5 && currentPageStart + i < listWidget->count(); ++i) {
        listWidget->item(currentPageStart + i)->setHidden(false);
    }

    // 确保滚动到可见项
    listWidget->scrollToItem(listWidget->item(currentPageStart));
}

void MyListWidget::keyPressEvent(QKeyEvent *event)
{
    switch (event->key()) {
    case Qt::Key_Up:
    {
        if (currentPageStart > 0) {
            currentPageStart--;
            updateVisibleItems();
        }
    }
        break;
    case Qt::Key_Down:
    {
        if (currentPageStart + 4 < listWidget->count()) { // 假设每页显示5项,但最后一页可能不足5项
            currentPageStart++;
            updateVisibleItems();
        }
    }
        break;
    case Qt::Key_Left: // 向上翻页
     {
        if(currentPageStart - 5 >= 0){
            currentPageStart -= 5;
        }else{
            currentPageStart = 0;
        }
        updateVisibleItems();
     }
        break;
    case Qt::Key_Right: // 向下翻页
    {
        int totalPages = 0;
        if(listWidget->count()%5){
            totalPages = listWidget->count() / 5 + 1;
        }


        if(currentPageStart/5*5 +currentPageStart+ 5 >= listWidget->count()){
            currentPageStart = listWidget->count() -5;
        }else{
             currentPageStart += 5;
        }
        updateVisibleItems();
    }
        break;
    default:
        QWidget::keyPressEvent(event);
    }
}

void MyListWidget::slotUpPage()//向上翻页
{
    if(currentPageStart-5 <= 0){
        currentPageStart = 0;
    }else{
        currentPageStart -= 5;
    }
    updateVisibleItems();
}

void MyListWidget::slotDownPage()//向下翻页
{

    if(currentPageStart + 5 >= listWidget->count()){
        return ;
    }else{
        currentPageStart +=5;
    }
    updateVisibleItems();
}

main.cpp

#include "mylistwidget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyListWidget widget;
    widget.show();

    return a.exec();
}

运行效果

程序运行效果如文章开头的视频所示。
在这里插入图片描述
可以点击向上翻页和向下翻页按钮来翻页,点击向上向下按键逐行选中显示,到最后一页时会调整所显示的行占满整个规定的行。

备注

此程序写的时间距离编写这篇文章较早,可能会有一些瑕疵。


http://www.kler.cn/a/404338.html

相关文章:

  • Ubuntu安装Electron环境
  • 泷羽sec学习打卡-网络七层杀伤链1
  • HarmonyOs鸿蒙开发实战(17)=>沉浸式效果第二种方案一组件安全区方案
  • 【MediaSoup】接收端反馈RTCP调用流程
  • 241120学习日志——[CSDIY] [InternStudio] 大模型训练营 [09]
  • 51c自动驾驶~合集31
  • 图论之最小生成树计数(最小生成树的应用)
  • 使用API有效率地管理Dynadot域名,删除账户中的whois联系人信息
  • 在 Linux 中,重启命令reboot
  • Linux 用户管理
  • Python简介以及解释器安装(保姆级教学)
  • 一文解读数据仓库的分层逻辑和原理
  • 【Linux从青铜到王者】Linux进程间通信(一)——待完善
  • Python设计模式详解之1 —— 单例模式
  • 例题10-4 冒泡排序 字符串排序
  • Web3游戏先锋 Big Time Studios 重磅推出 $OL 通证,赋能 Open Loot 游戏平台
  • Centos 7 安装 Docker 最新版本
  • 「OpenCV交叉编译」ubuntu to arm64
  • 刘艳兵-DBA042-下述哪些文件是在CREATE DATABASE命令中创建的?
  • 无重复字符的最长子串习题分析
  • 机器翻译基础与模型 之三:基于自注意力的模型
  • 实验室管理智能化:Spring Boot技术实现
  • JavaEE 线程安全
  • 新版Python 3.13官方支持Android 5.0及以上版本:详细解读及开发指南
  • element ui table 每行不同状态
  • 攻防世界 Web新手练习区