创建一个自己的列表窗口

news2024/11/15 2:22:37

文章目录

  • 背景:
    • 在QT的设计中,对于控件库提供的控件满足不了项目的需求,就像自定义一些控件,本文是自定义一个列表窗口。
    • 效果展示
  • 一、创建基本的QT模板:
    • 1.创建mainwindow
    • 2.创建VerticalTextDelegate
  • 二: 插入图片:
  • 三:代码填充:
  • 四:总结:


背景:

在QT的设计中,对于控件库提供的控件满足不了项目的需求,就像自定义一些控件,本文是自定义一个列表窗口。

效果展示

在这里插入图片描述
在这里插入图片描述
下面是本文的正文部分了,如果你也想创建一个炫酷的控件,跟着操作就可以了。

一、创建基本的QT模板:

1.创建mainwindow

在这里插入图片描述
在这里插入图片描述右键添加新文件
在这里插入图片描述
在这里插入图片描述

2.创建VerticalTextDelegate

名称选择这个:VerticalTextDelegate
在这里插入图片描述
在这里插入图片描述

如果前面的步骤都正确,目录应该如上图所示,打开mainwindow.ui,插入一个listweight。
在这里插入图片描述

二: 插入图片:

准备放在列表窗口里面的图片,文件夹命名qrc,放在你创建的qt文件目录下
在这里插入图片描述
右键项目:添加现有文件:
在这里插入图片描述
选择打开,出现如下页面:
在这里插入图片描述
点击是即可
在这里插入图片描述
继续添加资源文件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三:代码填充:

按照顺序和最上面一行填充代码:

// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QListWidgetItem>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    void addListWidgetItem(const QString &iconPath, const QString &text);
};

#endif // MAINWINDOW_H
// verticaltextdelegate.h
#ifndef VERTICALTEXTDELEGATE_H
#define VERTICALTEXTDELEGATE_H

#include <QStyledItemDelegate>

class VerticalTextDelegate : public QStyledItemDelegate
{
    Q_OBJECT

public:
    explicit VerticalTextDelegate(QObject *parent = nullptr);
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};

#endif // VERTICALTEXTDELEGATE_H
// verticaltextdelegate.cpp
#include "verticaltextdelegate.h"
#include <QPainter>
#include <QApplication>
#include <QBrush>
#include <QRect>

VerticalTextDelegate::VerticalTextDelegate(QObject *parent) : QStyledItemDelegate(parent) {}

void VerticalTextDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
    QStyleOptionViewItem opt = option;
    initStyleOption(&opt, index);
    int x = opt.rect.left();
    int y = opt.rect.top();

    // 绘制图标
    const QIcon &icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
    QRect iconRect(x, y, opt.rect.height(), opt.rect.height());
    QPixmap pixmap = icon.pixmap(iconRect.size());
    painter->drawPixmap(iconRect, pixmap);

    // 绘制位于图标右侧的文本描述(姓名,年龄,性别)
    QString text = index.data(Qt::DisplayRole).toString();
    QStringList lines = text.split("\n");
    x = iconRect.right() + 10;
    int lineHeight = painter->fontMetrics().height();
    int textWidth = opt.rect.width() - x - 20; // 减去一些边距
    int extraSpace = 30; // 额外的间距

    // 姓名、年龄、性别
    foreach (const QString &line, lines) {
        QRect textRect(x, y, textWidth, lineHeight);
        painter->fillRect(textRect, QBrush(QColor(255, 255, 0))); // 黄色背景
        painter->drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter, line);
        y += lineHeight; // 移动到下一行文本的基线位置

        // 绘制文本行之间的空白处为黄色
        QRect spaceRect(x, y, textWidth, extraSpace);
        painter->fillRect(spaceRect, QBrush(QColor(255, 255, 0))); // 黄色填充
        y += extraSpace; // 增加额外的间距,为下一行文本做准备
    }
}

// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "verticaltextdelegate.h"
#include <QIcon>
#include <QPixmap>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->listWidget->setItemDelegate(new VerticalTextDelegate(ui->listWidget));

    // 设置图标大小
    int iconSize = 144;
    ui->listWidget->setIconSize(QSize(iconSize, iconSize));

    // 添加多个图片到列表
    addListWidgetItem(":/images/qrc/rabbit_leg1.png", "姓名: 张三\n年龄: 30\n性别: 男");
    addListWidgetItem(":/images/qrc/rabbit_leg2.png", "姓名: 李四\n年龄: 25\n性别: 女");
    addListWidgetItem(":/images/qrc/rabbit_leg3.png", "姓名: 李四\n年龄: 25\n性别: 女");
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::addListWidgetItem(const QString &iconPath, const QString &text)
{
    QListWidgetItem *item = new QListWidgetItem;
    QPixmap pixmap(iconPath);
    QIcon icon(pixmap.scaled(ui->listWidget->iconSize(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
    item->setIcon(icon);
    item->setText(text);
    ui->listWidget->addItem(item);
}

在这里插入图片描述

QListWidget QScrollBar:vertical {  
        width: 30px;  
        background-color: white;  
    }  
  
    QListWidget QScrollBar::handle:vertical {  
        background-color: #ADD8E6;  
        min-height: 30px;  
    }  
  
    QListWidget QScrollBar::add-line:vertical {  
        border: 2px solid grey;  
        background-color: #32CC99;  
        height: 20px;  
        subcontrol-position: bottom;  
        subcontrol-origin: margin;  
    }  
  
    QListWidget QScrollBar::sub-line:vertical {  
        border: 2px solid grey;  
        background-color: #32CC99;  
        height: 20px;  
        subcontrol-position: top;  
        subcontrol-origin: margin;  
    }  

在这里插入图片描述

四:总结:

文章流程图:背景,设置框架,填充图片,填充代码,展示效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1993818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零拷贝的发展历程

零拷贝 零拷贝是指计算机执行 IO 操作时&#xff0c;CPU 不需要将数据从一个存储区域复制到另一个存储区域&#xff0c;从而可以减少上下文切换以及 CPU的拷贝时间。它是一种I/O 操作优化技术。 传统IO的执行流程&#xff1a;传统的 IO 流程&#xff0c;包括 read 读 和 write…

2024.8.08(python)

一、搭建python环境 1、检查是否安装python [rootpython ~]# yum list installed | grep python [rootpython ~]# yum list | grep python3 2、安装python3 [rootpython ~]# yum -y install python3 安装3.12可以使用源码安装 3、查看版本信息 [rootpython ~]# python3 --vers…

C++(类和对象.下)

类型转换 先给出以下代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; class B { private:int _a1; public:B(int a){_a1 a;}void Print() {cout << _a1<< endl;} }; int main() {//实例化对象1B b(1);b.Pri…

video-retalking部署安装,在服务器Ubuntu22.04系统下

video-retalking部署安装&#xff0c;在服务器Ubuntu22.04系统下 一、ubuntu基本环境配置1.更新包列表&#xff1a;2. 安装英伟达显卡驱动2.1 使用wget在命令行下载驱动包2.2 更新软件列表和安装必要软件、依赖2.2 卸载原有驱动2.3 安装驱动2.4 安装CUDA2.5 环境变量配置 二、安…

基于YOLOv10深度学习的交通信号灯检测识别系统【python源码+Pyqt5界面+数据集+训练代码】红绿灯检测、目标检测、人工智能

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

易语言窗口1以及其它子窗口在任务栏显示的方法以及源代码

大家都知道在启动子程序中载入窗口里&#xff0c;窗口就不在任务栏中显示了 用什么办法可以解决这个问题呢 本例程教源码教你如何解决

零拷贝:原理与实现

1. 简介 I/O 或输入/输出通常意味着中央处理器 (CPU) 与外部设备&#xff08;如磁盘、鼠标、键盘等&#xff09;之间的读写。在深入研究零拷贝之前&#xff0c;有必要指出磁盘 I/O&#xff08;包括磁盘设备和其他块导向设备&#xff09;和网络 I/O 之间的区别。 磁盘 I/O 的常…

Vue3简单介绍和快速体验

目录 前言 1. Vue3介绍 1.1 Vue的两个核心功能&#xff1a; 1.2 Vue作者介绍 2. Vue3快速体验(非工程化方式) 2.1 所有代码 2.2 导入js 2.3 一些基本指令 2.4 app对象的创建和挂载 ​ 前言 在学习Vue3之前,自己已经学习过的vue2了,在学习Vue3后还是能感觉到2和3在使用…

媒体资讯视频数据采集-yt-dlp-python实际使用-下载视频

对于视频二创等一些业务场景&#xff0c;可能要采集youtube等的相关媒体视频资源&#xff0c;使用[yt-dlp](https://github.com/yt-dlp/yt-dlp)是一个不错的选择&#xff0c;提供的命令比较丰富&#xff0c;场景比较全面yt-dlp 是一个用 Python 编写的命令行工具&#xff0c;主…

数据结构和算法|递归算法那些事(递归算法的时间复杂度和尾递归优化)

对于文章的第一部分&#xff0c;递归算法的时间复杂度&#xff0c;来自于代码随想录文章:通过一道面试题目&#xff0c;讲一讲递归算法的时间复杂度&#xff01; 对于第二节尾递归优化来自于B站&#xff1a;尾递归优化&#xff1a;你的递归调用是如何被优化的&#xff1f; 关于…

什么是占空比?什么是周期?什么是频率?

一、什么是占空比&#xff1f; 占空比(Duty Cycle)是脉冲信号中高电平持续时间与整个周期时间的比率。它通常用于描述脉冲宽度调制(PWM)信号&#xff0c;其中信号在一定频率下在高电平和低电平之间切换。 图1.1 60%占空比信号 占空比计算公式如下&#xff1a; 脉冲高电平持续时…

护眼首选,一线智联!AOC Q27E12C商用显示器,摆脱束缚高效办公!

摘要&#xff1a;QHD广色域护眼显示器&#xff0c;减负提效商务利器&#xff01; 不管是日常处理报表、制作方案还是进行文字创作、设计剪辑&#xff0c;都离不开商用显示器的身影。相较于传统显示器&#xff0c;商用显示器往往更有助于减负提效&#xff0c;提高企业生产力&am…

开源24Mhz采样逻辑分析仪-信息搜集

引用&#xff1a; 开源4Mhz采样逻辑分析仪-信息搜集&#xff1a; Sigrok逻辑分析仪软件(基于CY7C68013A)-CSDN博客 迷你逻辑分析仪TYPE C接口单片机ARM FPGA调试工具24M采样8通道_逻辑分析仪24m能测stm32吗-CSDN博客 nanoDLA逻辑分析仪上手教程-CSDN博客 基于cy7c68013的逻…

嵌入式初学-C语言-练习四

一维数组练习题 1.键盘录入一组数列&#xff0c;利用冒泡排序将数据由大到小排序 代码&#xff1a; 1 /*2 需求&#xff1a;一维数组案例-冒泡排序3 */4 #include <stdio.h>5 6 int main()7 {8 //创建一个数组&#xff0c;用来存储排序的数列9 int arr[10];1…

Redis远程字典服务器(2) —— 全局命令

一&#xff0c;使用官方文档 学会使用文档&#xff0c;是一个优秀程序员的必备技能。Redis的命令非常多&#xff08;上百个&#xff09;&#xff0c;因为Redis是通过键值对存储数据的&#xff0c;key为string类型&#xff0c;但是value可以是其它的数据类型&#xff08;字符串…

javascript-动态增加和删除表格的行

本地环境&#xff1a;win10 / centos6 &#xff0c; python3 实现效果 点击添加峰图按钮即可增加一行&#xff0c;点击每行右侧的删除按钮即可删除行。 初始状态&#xff1a; 点击后&#xff1a; 实际生成的html内容类似下图&#xff0c;可以看到&#xff0c;只有id这样需要…

VMware capacity mismatch for disk错误解决办法

因为业务或者学习很多时候我们要用到虚拟机&#xff0c;当我们使用vmware去打开VirtualBox导出的文件虚拟机镜像时会发生capacity mismatch for disk错误&#xff0c;同时在网上查询没有完整通俗易懂的解决方案&#xff0c;我本人也遇到了这个错误&#xff0c;经过测试以后写下…

arcgis server 发布地图服务相关问题

地图类型选择feature access 发布后&#xff0c;存在个别图层失败&#xff0c; 配置符号后&#xff0c;发布地图服务时&#xff0c;选择了Map Server 和Feature Access后&#xff0c;地图发布成功&#xff0c;但是对于feature server 类型中部分图层失败&#xff0c;在服务目录…

【题解】【数学】—— [CSP-J2019 江西] 次大值

【题解】【数学】—— [CSP-J2019 江西] 次大值 [CSP-J2019 江西] 次大值题目描述输入格式输出格式输入输出样例输入 #1输出 #1输入 #2输出 #2输入 #3输出 #3 提示 解法1.暴力枚举(非正解)1.1.题意分析1.2.代码 解法2.总结规律(正解)2.1.题意分析2.1.1.解题思路2.2.2.功能拆解 …

5个适用于Linux系统的PDF转Word工具

凭借其跨平台和设备的统一标准、兼容性和规模小巧等主要优点&#xff0c;可携带文档格式&#xff08;PDF&#xff09;可谓最主流的文件格式之一。 市面上有许多查看PDF文件的强大工具&#xff0c;因此所有Linux系统的用户都可以根据自身喜好找到合适的PDF查看工具。然而&#x…