zoukankan      html  css  js  c++  java
  • Qt QTableView自定义列表(插入图片)

    前几天写Qt,想实现一个列表功能去网上找了找,发现了使用QListWidget挺方便的,但总感觉不好看一种古老的气息;于是又在网上查了查发现可以用QTableView定制挺不错的;最后实现了结果发现表头还是不好看,不过好在有解决方法------自己重绘;接下来不多说上代码。

    MyTableView.h

     class MyItemDelegate:public QItemDelegate
      {
      public:
          MyItemDelegate(QObject * parent=0);
    
          virtual ~ MyItemDelegate(){}
          void paint(QPainter * painter,
              const QStyleOptionViewItem & option,
              const QModelIndex & index) const;
         bool editorEvent(QEvent * event,
             QAbstractItemModel * model,
             const QStyleOptionViewItem & option,
             const QModelIndex & index);
     private:
         QPixmap favPixmap;
         QPixmap notfavPixmap;
     };
    
     class MyTableView : public QTableView {
         Q_OBJECT
     public:
         explicit MyTableView(QTableView *parent = 0);
         ~MyTableView();
         void InitView();
         void appendItem(int index, QString filename, QString date, QString filesize);
         void clear(){m_model->clear();}
     private:
         QStandardItemModel *m_model;
         QList<QString> m_listhead = {"0", QStringLiteral("文件名"), QStringLiteral("修改时间"), QStringLiteral("大小")};
     };
     #endif // MYTABLEVIEW_H

    QItemDelegate,QTableView两个类重写继承QItemDelegate会在QTableView创建是使用到。

    MyItemDelegate:

    两个QPixmap 是点击时打勾和不打勾的图片

    paint() 在这里重绘表头和QPixmap图片

    editorEvent 响应鼠标点击列表的事件

    MyTableView:

    InitView() 初始化列表,一定要先执行。

    appendItem() 增加一行列

    clear() 清空

    m_listhead 表头名称

    MyTableView.cpp

      MyTableView::MyTableView(QTableView *parent) : QTableView(parent) {
          m_model = new QStandardItemModel(this);
      }
      
      MyTableView::~MyTableView() {
          delete m_model;
      }
     
     void MyTableView::InitView(int widindex) {
         QList<QStandardItem*> row;//设置列数
         m_model->setColumnCount(4);
         this->setIconSize(QSize(60, 60));
         this->setLayoutDirection(Qt::LeftToRight);
     
         //第一列空行
         m_model->appendRow(row);
     /*
         connect(this, SIGNAL(clicked(const QModelIndex &)), this, OT(RowClicked(const QModelIndex &)));
         connect(this, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(RowDoubleClicked(const QModelIndex &)));
    */
     
         this->verticalHeader()->setDefaultSectionSize(60);
     
         this->setContextMenuPolicy(Qt::CustomContextMenu);
         this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
         this->setFocusPolicy(Qt::NoFocus);
         this->horizontalHeader()->setHighlightSections(false);
         this->setEditTriggers(QAbstractItemView::NoEditTriggers);
         this->setShowGrid(false);
         this->setSelectionBehavior(QAbstractItemView::SelectRows);
         this->setSelectionMode(QAbstractItemView::SingleSelection);
         this->horizontalHeader()->resizeSections(QHeaderView::Interactive);
         this->verticalHeader()->hide();
         this->horizontalHeader()->hide();
     
     //    this->setAlternatingRowColors(true);
     //    this->setSortingEnabled(true);
         this->setItemDelegate(new MyItemDelegate());
         this->setModel(m_model);
     
         //设置行高和列宽
         //行高
         this->setRowHeight(0, 40);
         //列宽
         this->setColumnWidth(0, 60);
         this->setColumnWidth(1, 400);
         this->setColumnWidth(2, 140);
         this->setColumnWidth(3, 200);
     //    this->setColumnWidth(4, 60);
     
         this->setFocus();
     }
     
     void MyTableView::appendItem(int index, QString filename, QString date, QString filesize) {
         QList<QStandardItem*> row;
      //自定义图片 根据自己的修改
         QIcon icon[5] = {
             QIcon(":/first/res/image/dir.png"),         
             QIcon(":/first/res/image/pic.png"),
             QIcon(":/first/res/image/txt.png"),
             QIcon(":/first/res/image/zip.png"),
             QIcon(":/first/res/image/unkown.png"),
                         };
         if(index == 0) row.push_back(new QStandardItem("*"));
         else row.push_back(new QStandardItem(""));
         row.push_back(new QStandardItem(icon[index], filename));
         row.push_back(new QStandardItem(date));
         row.push_back(new QStandardItem(filesize));
     //    row.push_back(new QStandardItem(0));
         m_model->appendRow(row);
     }
     
     MyItemDelegate::MyItemDelegate(QObject * parent)
     :QItemDelegate(parent)
     {
         favPixmap=QPixmap(":/first/res/image/select.png");
         nofavPixmap=QPixmap(":/first/res/image/unsel.png");
     }
     
     void MyItemDelegate::paint(QPainter * painter,
                                const QStyleOptionViewItem & option,
                                const QModelIndex & index) const
     {
         if(index.column()!=0) {
             if(index.row() == 0) {
                 painter->setFont(QFont("Microsoft Yahei", 9, -1, false));
                 painter->drawText(option.rect.x()+10, option.rect.y()+20, m_listhead.at(index.column()));
                 return;
             }
             QItemDelegate::paint(painter,option,index);
             return;
        }
     
         const QAbstractItemModel * model=index.model();
     
         QVariant var=model->data(index,Qt::CheckStateRole);
         if(var.isNull()) var=false;
     //    qDebug() << var.toBool();
     
         const QPixmap star = var.toBool()?favPixmap:notfavPixmap;
    
         int width=p=star.width();
         int height=star.height();
         QRect rect=option.rect;
         int x=rect.x()+rect.width()/2-width/2;
         int y=rect.y()+rect.height()/2-height/2;
    
         painter->drawPixmap(x,y, star);
     }
     
     bool MyItemDelegate::editorEvent(QEvent * event,
                                      QAbstractItemModel * model,
                                      const QStyleOptionViewItem &, //option
                                      const QModelIndex & index)
     {
         if(event->type()==QEvent::MouseButtonDblClick) {
     
         }
         if(event->type()==QEvent::MouseButtonPress) {
         if(index.column() == 0) {
          QVariant var=m_model->data(index,
                                                  Qt::ItemDataRole::CheckStateRole);
                     bool isFavourite=var.toBool();
                     if(var.isValid())
                         isFavourite=isFavourite?false:true;
                     else
                         isFavourite=true;
                     m_model->setData(index,isFavourite,Qt::CheckStateRole);
    
          }
         }
         //false Is To Later Process
         return false;
     }

    效果图:

    重绘的好处在于点击不会有黑色的阴影,不过要加一行无用行来被用来表头覆盖

    关键的地方我已经标好了注释 大家可以自行修改代码来实现不同功能

    有问题或有错误欢迎大家Call我。。。。。。

  • 相关阅读:
    第一个mpvue小程序开发总结
    ES6学习笔记(一)——扩展运算符和解构赋值
    我所理解的发布订阅模式
    移动web开发适配方案之Rem
    探究JS中对象的深拷贝和浅拷贝
    《BAT前端进阶[师徒班]》学习总结
    浅析使用vue-router实现前端路由的两种方式
    webpack之proxyTable设置跨域
    《免费前端教程不会告诉你这些》知乎LIVE读后感
    MySQL binlog-server搭建
  • 原文地址:https://www.cnblogs.com/yddsblog/p/12625479.html
Copyright © 2011-2022 走看看