首页 > 其他分享 >给QTreeWidgetItem设置第二个图标

给QTreeWidgetItem设置第二个图标

时间:2024-07-21 16:09:43浏览次数:16  
标签:opt item QTreeWidgetItem 第二个 QIcon icon rect 图标

之前的项目中需要在QTreeWidgetItem原本图标的前面额外设置一个状态图标。

基本思路是在QStyledItemDelegate::paint()中压缩text区域,扩大icon区域,然后重新绘制图标
以下是实现方式

/*!
    其他图标来自 宏 ITEMVIEW_OTHER_ICONROLE (Qt::UserRole + 11)
    仅支持第二图标,如果要支持3个及以上的图标,需要改一改
    第二图标默认放在原本图标前面,可以视情况调整icon_list中的图标顺序
*/
void DoubleIconDelegate::paint(QPainter *painter,
                               const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QList<QIcon> icon_list; //图标列表,视情况调整顺序
    icon_list.append(index.data(ITEMVIEW_OTHER_ICONROLE).value<QIcon>()); //第二图标
    icon_list.append(index.data(Qt::DecorationRole).value<QIcon>());      //原本图标

    int icon_count = icon_list.size();
    int icon_size = 16; //图标尺寸,Qt默认就是这个

    QStyleOptionViewItem opt = option;
    initStyleOption(&opt, index);

    //没有图标时也占位,并设置空位宽度
    opt.features |= QStyleOptionViewItem::HasDecoration;
    opt.decorationSize = QSize(icon_size * icon_count, icon_size);
    opt.icon = QIcon();

    const QWidget *widget = option.widget;
    QStyle *style = widget ? widget->style() : QApplication::style();

    //调用原本的绘制方法
    style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget);

    //以下开始绘制多图标
    painter->save();
    painter->setClipRect(opt.rect); //处理鼠标拖动压缩列宽时的遮挡效果

    QRect icon_rect = style->subElementRect(QStyle::SE_ItemViewItemDecoration, &opt, widget);
    int icon_margin = (icon_rect.width() - opt.decorationSize.width());
    icon_rect.setLeft(icon_rect.left() + icon_margin); //恢复左侧间隔

    for (int i = 0; i < icon_count; ++i)
    {
        const QIcon& icon = icon_list.at(i);
        if (icon.isNull())
        {
            continue;
        }
        
        QRect temp_icon_rect = icon_rect;
        temp_icon_rect.setLeft(icon_rect.left() + icon_size * i);
        temp_icon_rect.setWidth(icon_size);

        QIcon::Mode mode = QIcon::Normal;
        if (!(opt.state & QStyle::State_Enabled))
        {
            mode = QIcon::Disabled;
        }
        else if (opt.state & QStyle::State_Selected)
        {
            mode = QIcon::Selected;
        }
        QIcon::State state = opt.state & QStyle::State_Open ? QIcon::On : QIcon::Off;

        icon.paint(painter, temp_icon_rect, opt.decorationAlignment, mode, state);
    }
    painter->restore();
}

调用方式

    QTreeWidget* tree = new QTreeWidget(this);
    tree->setColumnCount(2);
    tree->setItemDelegate(new DoubleIconDelegate(this));

    QTreeWidgetItem* item = new QTreeWidgetItem(tree);
    item->setText(0, "Test1");
    item->setIcon(0, MakeIcon(Qt::red)); //常规设置图标方式
    item->setData(0, ITEMVIEW_OTHER_ICONROLE, MakeIcon(Qt::black));//设置第二图标方式

    item = new QTreeWidgetItem(tree);
    item->setText(0, "");
    item->setIcon(0, MakeIcon(Qt::cyan));
    item->setData(0, ITEMVIEW_OTHER_ICONROLE, MakeIcon(Qt::green));

    item = new QTreeWidgetItem(tree);
    item->setText(0, "Test3");
    item->setIcon(0, MakeIcon(Qt::yellow));
    item->setData(0, ITEMVIEW_OTHER_ICONROLE, MakeIcon(Qt::magenta));

效果如下

标签:opt,item,QTreeWidgetItem,第二个,QIcon,icon,rect,图标
From: https://www.cnblogs.com/xiehiboy/p/18314580

相关文章

  • vue3 封装svg图标
    安装插件npmivite-plugin-svg-icons1.修改 vite.config.jsimport{resolve}from'path'import{createSvgIconsPlugin}from'vite-plugin-svg-icons';exportdefaultdefineConfig({  plugins:[    vue(),    createSvgIconsPlugin({......
  • Mac新手教程:程序坞里的启动台图标消失了如何解决?
    启动台是Mac系统里放应用程序的地方,用户可以通过启动台打开软件列表。一般为了方便使用会把它放在程序坞,但一些用户程序坞里的启动台的图标不见了,如何找回呢?1、打开Mac上的访达应用程序,2、点击访达窗口左边的“应用程序”,3、在应用程序里,找到启动台,4、将启动台图标拖动到程序坞,......
  • 关于任务栏图标变白的原因及解决方法(以 QQ 为例)
    如下图所示,qq图标变白了,原因是我qq更新后改动了所在位置,或者你将一些软件连同整个文件夹一起移动到其他文件夹下也可能会出现这种情况。这种变白并不是我之前说的桌面图标变白,如果你是桌面的图标变白,可以参考我之前写的博客的解决方案:针对Win10系统为了加速图标的显示,......
  • AIGC教程:如何使用Stable Diffusion生成B 端图标(附安装包)
    在日常工作中,设计师在应对运营和UI设计的B端图标时,常常面临大量的构思、制作和渲染等工作,耗时耗力。我们可以利用StableDiffusion(以下简称SD)结合AI的方式,帮助设计师优化图标的设计流程,使任何对这一领域感兴趣的人都能尝试并创作出多样化的图标设计,灵活高效运用在项目之中......
  • vite 实现自动导入element plus icons 图标组件
    vite.config.js配置import{fileURLToPath,URL}from"node:url";importComponentsfrom"unplugin-vue-components/vite";importAutoImportfrom"unplugin-auto-import/vite";import{ElementPlusResolver}from"unplugin-v......
  • 用css样式修改svg图标颜色
    主要是利用css滤镜的投影drop-shadow来实现,方法是将原svg移动到网页看不见的地方,然后对原svg投影到原位置,影子实心不虚散,对影子进行颜色控制。 css::root{--color:#7a65ee;/*站点主题颜色*/--svg-offset:20000px;/*将原svg移出窗......
  • 如何在 Vue 项目中优雅地使用图标
    1.字体图标与矢量图标目前主要有两种图标类型:字体图标和矢量图标。字体图标是在网页打开时,下载一整个图标库,通常可以通过特定标签例如<i>来使用,优点是方便地实现文字混排,缺点是包体积大,且难以自定义。矢量图标本质是<svg>标签,包中只含有所需的图标,且很容易自定义,也可以选......
  • 图标组件的封装与管理(React/svg)
    一概要1.1背景最近在项目中使用了很多从iconfont拿到的图标。使用官网的导入方法有些繁琐,也不易管理。于是捣鼓了一下...1.2目的能够像组件一样使用,具有规范性。比如暴露一个type属性,根据不同的type使用不同的主题色。高自由度。可以直接在项目中管理图标,只需要处理从其......
  • WPF 实现 图标按钮
    假设需要实现一个图标和文本结合的按钮,普通做法是直接重写该按钮的模板;如果想作为通用的呢?两种做法:附加属性自定义控件推荐使用附加属性的形式第一种:附加属性创建Button的附加属性 ButtonExtensions1publicstaticclassButtonExtensions2{3//Using......
  • Ubuntu创建图标
    很多时候我们喜欢省事双击图标运行软件,那么怎么创建图标呢?下面介绍两种主流的方法。一.使用vim创建文件如果你没有安装vim,请先安装:sudoaptinstallvim接下来按照下面指令设置图标,以PyCharm为例:cd/usr/share/applicationssudovimpycharm.desktop注意这里......