QListWidget 自定义 item的图标和文字的位置

news2024/11/19 1:51:29

目录

    • 前言
    • 思路一
    • 思路二
    • 思路二缺陷
    • 思路三
    • 思路四

前言

楼主并没有完整的解决这个问题,如果你是着急寻找解决方案的就可以划走了,如果你对楼主的解决思路有兴趣,那么可以继续向下阅读。首先需求是可以控制QListWidgetItem的icon和text x轴的位置,但是同时保持icon在左text在右的基本布局,还要求styleSheet能够生效。

思路一

做一张两边透明中间显示的图片。这样就可以控制icon和text的位置了。楼主没有试过实际效果

思路二

使用QListWIdgetsetItemWIdget接口。
mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

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

    QListWidgetItem *item0 = new QListWidgetItem(ui->listWidget);   
    MyItemWidget *itemWidget = new MyItemWidget(QIcon(":/pic/rabbit.png"), QStringLiteral("兔子"), ui->listWidget);
    ui->listWidget->setItemWidget(item0, itemWidget);

    QListWidgetItem *item1 = new QListWidgetItem(ui->listWidget);
    item1->setIcon(QIcon(":/pic/tiger.png"));
    item1->setText(QStringLiteral("老虎"));

    ui->listWidget->addItem(item0);
    ui->listWidget->addItem(item1);
}

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

void MainWindow::on_pushButton_clicked()
{
    QListWidgetItem *item = ui->listWidget->item(0);
    QModelIndex index = ui->listWidget->currentIndex();
    qDebug() << index.data(Qt::DisplayRole).toString();
}

MyItemWidget::MyItemWidget(const QIcon &icon, const QString &name, QWidget *parent)
{
    iconLabel = new QLabel;
    iconLabel->setPixmap(icon.pixmap(QSize(15, 15)));
    iconLabel->setFixedSize(QSize(15, 15));

    nameLabel = new QLabel(name);

    hSpaceItem = new QSpacerItem(10, 10, QSizePolicy::Fixed);
    hSpaceItem1 = new QSpacerItem(20, 10, QSizePolicy::Fixed);

    layout = new QHBoxLayout;
    layout->setMargin(0);

    layout->addItem(hSpaceItem);
    layout->addWidget(iconLabel);

    layout->addItem(hSpaceItem1);

    layout->addWidget(nameLabel);

    this->setLayout(layout);
}

MyItemWidget::~MyItemWidget()
{

}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QListWidget>
#include <QListWidgetItem>
#include <QIcon>
#include <QSpacerItem>
#include <QLabel>
#include <QHBoxLayout>
#include "mydelegate.h"

namespace Ui {
class MainWindow;
}

class MyItemWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyItemWidget(const QIcon& icon, const QString& name, QWidget *parent = nullptr);
    ~MyItemWidget();
private:
    QLabel *iconLabel;
    QLabel *nameLabel;
    QSpacerItem *hSpaceItem;
    QSpacerItem *hSpaceItem1;
    QHBoxLayout *layout;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

思路二缺陷

因为对于QListWidget QTableWidget等。如果在stylesheet中把为状态为selecteditem背景色设置为深色那么前景色(字体的颜色)会变成比较浅的颜色来做一个区分。如果使用思路二那么将没有这种效果。
在这里插入图片描述
如果你想通过QlistWidget点击某个item的信号来控制label的颜色,那么这是可行的。只是你可能会在遇到一个坑,那就是伪状态为:selected:!actived没有进行控制。

思路三

通过delegate控制,将用于画图的rectangle左边缩短一截。这样导致的问题是,item区域有部分rectangle没法使用样式表控制,且只能控制icon相对于左侧的位置。
MyDelegate.cpp

#include "mydelegate.h"
#include <QDebug>

MyDelegate::MyDelegate(QObject *parent) : QStyledItemDelegate(parent)
{

}

void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
//    QPixmap icon = index.data(Qt::DecorationRole).value<QIcon>().pixmap(15 , option.rect.height() - 5);
//    QString text = index.data(Qt::DisplayRole).toString();
//    QAbstractItemModel *model = (QAbstractItemModel*)index.model();
//    model->setData(index, QVariant::fromValue(QIcon()), Qt::DecorationRole);
//    model->setData(index, QVariant::fromValue(QString()), Qt::DisplayRole);

//    QStyleOptionViewItem op(option);
//    QStyledItemDelegate::paint(painter, op, index);
//    painter->drawPixmap(op.rect.x() + 5, op.rect.y() + 5, 15, op.rect.height() - 5, icon);
//    painter->drawText(op.rect.x() + 5 + 15 + 30, op.rect.height() / 2, text);

    QStyleOptionViewItem op(option);
    op.rect = QRect(op.rect.x() + 30, op.rect.y(), op.rect.width(), op.rect.height());
    QStyledItemDelegate::paint(painter, op, index);
}

思路四

通过delegate,让delegate不绘制icon和text。icon和text有自己来手动绘制。想法很美好但是现实根本行不通
MyDelegate.cpp

#include "mydelegate.h"
#include <QDebug>

MyDelegate::MyDelegate(QObject *parent) : QStyledItemDelegate(parent)
{

}

void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    qDebug() << index.row();
    QPixmap icon = index.data(Qt::DecorationRole).value<QIcon>().pixmap(15 , option.rect.height() - 5);
    QString text = index.data(Qt::DisplayRole).toString();
    QAbstractItemModel *model = const_cast<QAbstractItemModel*>(index.model());
    model->setData(index, QVariant::fromValue(QIcon()), Qt::DecorationRole);
    model->setData(index, QVariant::fromValue(QString()), Qt::DisplayRole);

    QStyleOptionViewItem op(option);
    painter->drawPixmap(op.rect.x() + 5, op.rect.y() + 5, 15, op.rect.height() - 5, icon);
    painter->drawText(op.rect.x() + 5 + 15 + 30, op.rect.height() / 2, text);

    QStyledItemDelegate::paint(painter, op, index);
}

思路四效果
在这里插入图片描述
效果就是没有任何效果。跪求大佬解答为什么没有效果。

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

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

相关文章

【树】树、二叉树的基础知识

树定义&#xff1a;树是n&#xff08;n≥0&#xff09;个结点的有限集合T。当n0时&#xff0c;称为空树&#xff1b;当n>0时&#xff0c;该集合满足如下条件&#xff1a; (1) 其中必有一个称为根&#xff08;root&#xff09;的特定结点&#xff0c;它没有直接前驱&#xff…

基于javaweb jsp+servlet学生宿舍管理系统

基于javaweb jspservlet学生宿舍管理系统 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 …

Mysql入门技能树-时间日期函数(一)-练习篇

DAY Joe 需要从日期中提取当天是几号&#xff0c;下列哪些函数可以实现这个功能&#xff1f; 1.DAY 2.DAYOFMONTH 3.DAYOFYEAR 4.TO_DAYS 答案是&#xff1a;C SELECT DAY(2023-02-14)SELECT DAYOFMONTH(2023-02-14)结果都是14 -- 返回 d 是一年中的第几天&#xff0c;范围…

【学习笔记】【Pytorch】九、非线性激活

【学习笔记】【Pytorch】九、非线性激活学习地址主要内容一、前言二、Pytorch的非线性激活三、nn.ReLU类的使用1.使用说明2.代码实现二、nn.Sigmoid类的使用1.使用说明2.代码实现学习地址 PyTorch深度学习快速入门教程【小土堆】. 主要内容 一、前言 我们知道人类大脑中的神…

【RabbitMQ】基础篇,学习纪录+笔记

目录 一.介绍 1.1MQ概述 1.2MQ优势和劣势 1.3常见的 MQ 产品 1.4RabbitMQ简介 1.5RabbitMQ中的相关概念 1.6RabbitMQ的安装 二.快速入门 2.1入门程序 2.2工作模式 2.2.1Work queues 工作队列模式 2.2.2Pub/Sub 订阅模式 2.2.3Routing 路由模式 2.2.4Topics 通配符…

vite 4.0 来了,带你手撕 create-vite 源码

通过本文你将了解到以下内容&#xff1a; 1&#xff0c;npm create 具体执行流程2&#xff0c;minimist、prompts、kolorist三个库3&#xff0c;create-vite 的源码分析 vite源码下载&#xff1a; //复制一份vite源码到自己的本地 git clone https://github.com/vitejs/vit…

抗击洪涝灾害,河道水雨情动态在线监测解决方案

一、项目背景我国是个多山的国家且位于东南季风区&#xff0c;降雨分布广泛还分布不均匀&#xff0c;这样一来使汛期高度集中。导致很多沿海城市以及临近河道的地区面临着河道决堤的威胁如何实时监测河道雨水情动态成了让人头疼的问题。在2022年1月&#xff0c;发改委、水利部在…

基于jsp+mysql+Spring的SpringBoot招聘网站项目(完整源码+sql)

基于jspmysqlSpring的SpringBoot招聘网站项目&#xff08;完整源码sql&#xff09;主要实现了管理员登录,简历管理,问答管理,职位管理,用户管理,职位申请进度更新,查看简历 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀…

Exchanges

文章目录ExchangesExchanges的类型FanoutDirectTopicExchanges &#xff08;交换机&#xff09;RabbitMQ 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。 Exchanges的类型 直接(direct)&#xff0c;主题(topic),标题(headers)&#xff0c;扇出(fanout)&…

硅烷聚乙二醇硅烷,Silane-PEG-Silane同官能团科研试剂,化学结构式

产品名称&#xff1a;硅烷聚乙二醇硅烷&#xff0c;双硅烷聚乙二醇 中文别名&#xff1a;硅烷PEG硅烷&#xff0c;双硅烷聚乙二醇 英文名称&#xff1a;Silane-PEG-Silane 分子量&#xff1a;1k&#xff0c;2k&#xff0c;3.4k&#xff0c;5k&#xff0c;10k&#xff0c;20k…

面对一堆烂代码,重构,还是重新开发?

hello&#xff0c;大家好&#xff0c;我是张张&#xff0c;「架构精进之路」公号作者。 1、烂代码的形成 写烂代码很容易&#xff0c;但代码写成一坨屎&#xff0c;还能正常运行&#xff0c;那就要有点水平才行。 尤其是一些经验不足的新手&#xff0c;根本不在乎代码质量的重要…

小年 —— 送日历福利啦!(acwing)

acwing每日一题集日历除夕夜瓜分10000ac币啦&#xff01; 手慢就没了┗|&#xff40;O′|┛ 嗷~~ 上次在acwing上面留言送日历&#xff0c;结果送着送着&#xff0c;连老本都给送没了&#xff0c;这波集齐了把其他的也给发出来了 AcWing【集日历瓜分10000AC币活动】赠送1月日历…

基于Java SSM springboot健身管理系统设计和实现

基于Java SSM springboot健身管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联…

Uniswap v3 详解(四):交易手续费

以普通用户的视角来看&#xff0c;对比 Uniswap v2&#xff0c;Uniswap v3 在手续费方面做了如下改动&#xff1a; 添加流动性时&#xff0c;手续费可以有 3个级别供选择&#xff1a;0.05%, 0.3% 和 1%&#xff0c;未来可以通过治理加入更多可选的手续费率Uniswap v2 中手续费…

《啊哈算法》第三章--枚举很暴力

从无到有学算法&#xff08;看漫画学算法&#xff09; (๑•̀ㅂ•́)و✧ 爱要坦荡荡 - 萧潇 - 单曲 - 网易云音乐 一&#xff0c;坑爹的奥数 枚举算法又叫穷举算法&#xff0c;非常的暴力&#xff0c;它的基本思想是“有序地去尝试每一种可能” 题目1 □3 x 6528 3□ x …

【JavaEE】网络初识之网络通信基础

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaEE】 ✈️✈️本篇内容:网络初识之网络通信基础。 &#x1f680;&#x1f680;代码存放仓库gitee&#xff1a;JavaEE初阶代码存放&#xff01; ⛵⛵作者简介…

Uniswap v3 详解(二):创建交易对/提供流动性

前文已经说过 Uniswap v3 的代码架构。一般来说&#xff0c;用户的操作都是从 uniswap-v3-periphery 中的合约开始。 创建交易对 创建交易对的调用流程如下&#xff1a; 用户首先调用 NonfungiblePositionManager 合约的 createAndInitializePoolIfNecessary 方法创建交易对&…

【软件测试】软件测试分类

1. 按照测试对象划分 界面测试 界面测试&#xff08;简称UI测试)&#xff0c;测试用户界面的功能模块的布局是否合理、整体风格是否一致、各个控件的放置位置是 否符合客户使用习惯&#xff0c;此外还要测试界面操作便捷性、导航简单易懂性&#xff0c;页面元素的可用性&…

U3751频谱分析仪

18320918653 U3751 频谱分析仪爱德万U3751特点&#xff1a; 频率范围&#xff1a;9kHz&#xff5e;8GHz 大输入电平&#xff1a;30dBm RBW&#xff1a;300Hz&#xff5e;3MHz 体积小&#xff0c;重量轻(5.6公斤)&#xff0c;测量速度快 户外量测&#xff1a;W-CDMA&#xff…

unity日记10(无头盔开发vr XR Device Simulator操作说明| 模之屋模型导入unity )

目录 XR Device Simulator配置参考视频 XR Device Simulator操作方法参考视频 模之屋模型导入unity参考视频 XR Device Simulator操作方法&#xff08;个人心得&#xff09; 1.摄像机 1.摄像机左右移动 右键移动鼠标 2.摄像机前后移动 右键滚动滚轮 3.摄像…