• QTreeWidget里嵌套表格QTableView


      1 InformationPositionSubTableView::InformationPositionSubTableView(QStringList& columnNameList,QList<PositionItem>& positionItemList,QWidget *parent) : m_ColumnNameList(columnNameList), m_PositionItemList(positionItemList),QTableView(parent)
      2 {
      3     m_InformationPositionSubTableModel = new InformationPositionSubTableModel(columnNameList,positionItemList);
      4     this->setModel(m_InformationPositionSubTableModel);
      5     
      6     this->setMouseTracking(true);
      7     this->setFocusPolicy(Qt::NoFocus);
      8     this->setGridStyle(Qt::NoPen);
      9      this->setSelectionBehavior(QAbstractItemView::SelectItems);
     10     this->setSelectionMode(QAbstractItemView::SingleSelection);
     11 
     12     QHeaderView* headerView = new InformationPositionSubHeaderview(Qt::Horizontal,this);
     13     headerView->setSectionsClickable(true);
     14     this->setHorizontalHeader(headerView);
     15     this->horizontalHeader()->setStretchLastSection(true);
     16     this->verticalHeader()->setVisible(false);
     17     
     18     this->setEditTriggers(QAbstractItemView::NoEditTriggers);
     19     this->setContextMenuPolicy(Qt::CustomContextMenu);
     20        
     21     this->resizeColumnsToContents();
     22 //    this->resizeRowsToContents();    //不能加上,否则做为QTreeWidget的子控件会多出一行的间隙;
     23 
     24     this->setFrameShape(QFrame::NoFrame);  //设置成无边框;
     25 
     26     this->horizontalHeader()->setStyleSheet("QHeaderView{background-color:gray;}");    //设置表头背景为灰色(这样也看起来扁平);
     27 }
     28 
     29 InformationPositionSubTableView::~InformationPositionSubTableView()
     30 {
     31 
     32 }
     33 
     34 void InformationPositionSubTableView::mouseMoveEvent(QMouseEvent * event)
     35 {
     36     QModelIndex index = indexAt(event->pos());
     37     if(index.isValid() && index.row()>=0) 
     38     {
     39         this->setSelection(visualRect(index),QItemSelectionModel::SelectCurrent);
     40     }
     41         
     42 }
     43 
     44 ========
     45 
     46 InformationPositionSubTableModel::InformationPositionSubTableModel(QStringList& columnNameList,QList<PositionItem>& positionItemList,QObject *parent) : m_ColumnNameList(columnNameList),m_PositionItemList(positionItemList),QAbstractTableModel(parent)
     47 {
     48     this->m_ColumnNameList = columnNameList;
     49 }
     50 
     51 InformationPositionSubTableModel::~InformationPositionSubTableModel()
     52 {
     53 
     54 }
     55 QVariant InformationPositionSubTableModel::data(const QModelIndex & index, int role) const
     56 {
     57     Q_UNUSED(index);
     58     if(!index.isValid())
     59         return QVariant();
     60     
     61     if(role==Qt::DisplayRole)
     62     {
     63         PositionItem item = m_PositionItemList[index.row()];
     64         int column = index.column();
     65         switch (column)
     66         {
     67         case 0:
     68             return item.GetAccountName();
     69         case 1:
     70             return item.GetBuyLot();
     71         case 2:
     72             return item.GetAvgBuyPrice();
     73         case 3:
     74             return item.GetSellLot();
     75         case 4:
     76             return item.GetAvgSellPrice();
     77         case 5:
     78             return item.GetNet();
     79         default:
     80             return item.GetFloatingMap()[headerData(column,Qt::Horizontal,Qt::DisplayRole).toString()];
     81         }
     82     }
     83     
     84     if(role==Qt::TextAlignmentRole)
     85     {
     86         return Qt::AlignCenter;
     87     }
     88 
     89     if(role==Qt::TextColorRole)
     90     {
     91         if(index.column()==3 || index.column()==5)
     92         {
     93             return QColor(Qt::red);
     94         }
     95         if(index.column()==1)
     96         {
     97             return QColor(Qt::green);
     98         }
     99     }
    100 
    101     return QVariant();
    102 }
    103 QVariant InformationPositionSubTableModel::headerData(int section, Qt::Orientation orientation, int role) const
    104 {
    105     if(role!=Qt::DisplayRole)
    106         return  QVariant();
    107 
    108     if(orientation == Qt::Horizontal)
    109     {    
    110         return m_ColumnNameList[section];    
    111     }
    112 
    113     return QVariant();
    114 }
    115 bool InformationPositionSubTableModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant & value, int role)
    116 {
    117     if(role!=Qt::EditRole)
    118         return false;
    119     if(orientation == Qt::Horizontal && section >=7)
    120     {
    121         m_ColumnNameList.append(value.toString());
    122         emit headerDataChanged(orientation,section,section);
    123         return true;
    124     }
    125     return false;
    126 }
    127 
    128 int    InformationPositionSubTableModel::rowCount(const QModelIndex & parent) const
    129 {
    130     int rows = m_PositionItemList.count();
    131     return rows;
    132 }
    133 int    InformationPositionSubTableModel::columnCount(const QModelIndex & parent) const
    134 {
    135     return m_ColumnNameList.count();
    136 }
    137 bool InformationPositionSubTableModel::setData(const QModelIndex & index, const QVariant & value, int role)
    138 {
    139     Q_UNUSED(index);
    140     if (index.isValid() && role == Qt::DisplayRole) 
    141     {
    142         int row = index.row();
    143         m_PositionItemList.replace(row, m_UpdatingItem);
    144         emit(dataChanged(index, index)); 
    145     }
    146     return true;    
    147 }
    148 Qt::ItemFlags InformationPositionSubTableModel::flags(const QModelIndex & index) const
    149 {
    150      Q_UNUSED(index);
    151     if (!index.isValid())
    152         return Qt::ItemIsEditable;
    153 
    154     return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
    155 }
    156 
    157 bool InformationPositionSubTableModel::insertRow(int position,const QModelIndex &index)
    158 {
    159     Q_UNUSED(index);
    160     beginInsertRows(index, position, position);
    161     
    162     int count = m_UpdatingItem.GetFloatingMap().count();
    163     QMapIterator<QString,float> it(m_UpdatingItem.GetFloatingMap());
    164     while(it.hasNext())
    165     {
    166         it.next();
    167         this->AddHeaderSection(it.key());
    168     }
    169 
    170     m_PositionItemList.insert(position,m_UpdatingItem);
    171     endInsertRows();
    172     return true;
    173 }
    174 bool InformationPositionSubTableModel::removeRow(int position,const QModelIndex &index)
    175 {
    176     Q_UNUSED(index);
    177     beginRemoveRows(index, position, position);
    178     m_PositionItemList.removeAt(position);
    179     endRemoveRows();
    180     return true;
    181 }
    182 void InformationPositionSubTableModel::AddHeaderSection(const QString& columnName)
    183 {
    184     if(!m_ColumnNameList.contains(columnName))
    185     {
    186         setHeaderData(m_ColumnNameList.count(),Qt::Horizontal,Qt::EditRole);
    187         m_ColumnNameList.append(columnName);
    188     }
    189 }
    190 
    191 =====
    192 
    193 
    194 InformationPositionSubHeaderview::InformationPositionSubHeaderview(Qt::Orientation orientation,QWidget* parent) : QHeaderView(orientation,parent)
    195 {
    196     this->setSectionsClickable(false);
    197     this->m_IsHided = false;
    198 }
    199 
    200 InformationPositionSubHeaderview::~InformationPositionSubHeaderview()
    201 {
    202 }
    203 
    204 void InformationPositionSubHeaderview::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
    205 {
    206     painter->save();
    207     QHeaderView::paintSection(painter, rect, logicalIndex); 
    208     painter->restore();
    209 
    210     if(logicalIndex==0 && m_IsHided==false)
    211     {        
    212         painter->drawText(rect,Qt::AlignRight|Qt::AlignVCenter, "<<");
    213     }
    214 
    215     if(logicalIndex==1 && m_IsHided==true)
    216     {
    217         QRect leftRect = QRect(rect.x(),rect.y(),HIDEDCOLORBTNWIDTH,rect.height());
    218         painter->setBrush(QBrush(Qt::blue));
    219         painter->drawRect(leftRect);
    220     }
    221 
    222 }
    223 
    224 void InformationPositionSubHeaderview::mousePressEvent(QMouseEvent * event)
    225 {
    226     if(event->button()==Qt::LeftButton) 
    227     {
    228         QFontMetrics fm(this->font());
    229         int textWidth = fm.width("<<");
    230 
    231         int index = logicalIndexAt(event->pos());
    232         int xPos =event->pos().x();
    233         int xLeft = sectionPosition(index)+sectionSize(index);
    234         if(index==0 && m_IsHided==false && (xPos<xLeft-HIDEDCOLORBTNWIDTH && xPos>xLeft-textWidth) )
    235         {
    236             setSectionHidden(index,true);
    237             m_IsHided = true;
    238         }
    239         else if(index==1 && m_IsHided==true && xPos<=HIDEDCOLORBTNWIDTH)
    240         {
    241             setSectionHidden(index-1,false);
    242             m_IsHided = false;
    243         }
    244     }
    245     QHeaderView::mousePressEvent(event);
    246 }
    247 
    248 ======
    249 
    250 InformationPositionTreeView::InformationPositionTreeView(InformationPositionItem& infoItem,QWidget *parent) : QTreeWidget(parent)
    251 {
    252     m_SubColumnNameList = infoItem.GetColumnNameList();
    253     m_SubColumnNameList.removeAt(0);
    254     m_SubColumnNameList.replace(0,"Account    ");//多出四个空格,是为"<<"腾出空间;
    255 
    256     this->Init();
    257     this->InitPositionItemListMap(infoItem);
    258 
    259     int columnNameCount = infoItem.GetColumnNameList().count();
    260     this->setHeaderLabels(infoItem.GetColumnNameList()); //增加标题;
    261 
    262     int count = m_InstrumentStringList.count();
    263     for(int i=0;i<count;i++)
    264     {
    265         QList<PositionItem>  positionItemList = m_PositionItemListMap[m_InstrumentStringList[i]];
    266         QStringList summaryList;
    267         summaryList << "" << (m_InstrumentStringList[i]) << QString("%0").arg(GetSumValue(positionItemList,"buy")) << QString("%0").arg(GetSumValue(positionItemList,"avgbuy")) << QString("%0").arg(GetSumValue(positionItemList,"sell")) << QString("%0").arg(GetSumValue(positionItemList,"avgsell")) << QString("%0").arg(GetSumValue(positionItemList,"net")) ;
    268         QTreeWidgetItem* node = new QTreeWidgetItem(summaryList);
    269         this->addTopLevelItem(node);
    270 
    271         InformationPositionSubTableView* subTableView = new InformationPositionSubTableView(m_SubColumnNameList,m_PositionItemListMap[m_InstrumentStringList[i]],this);
    272         QTreeWidgetItem* subItem = new QTreeWidgetItem;
    273         node->addChild(subItem);
    274         setFirstItemColumnSpanned(subItem,true);
    275         setItemWidget(subItem,0,subTableView);
    276 
    277         int rowHeight = subTableView->verticalHeader()->defaultSectionSize();
    278         node->setSizeHint(i,QSize(rowHeight,rowHeight));
    279 
    280 /////////////--附注:
    281 如果要让子tableview的宽度随着行数的变化而变化,却不会出现滚动条的话,应先将其滚动条关闭
    282 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    283 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);    
    284 然后在此treeWidget中,
    285     int subTableItemHeight= subTableView->rowHeight(0);
    286     int height = subTableItemHeight+subTableItemHeight*m_PositionItemListMap[m_PositionItemListMap.keys()[subIndex]].count();//算出子table的高度;
    287     subTableView->setMaximumHeight(height);
    288     subItem->setSizeHint(0,QSize(subTableView->size().width(),height));//改变树节点的宽度
    289 //这样,子表就能动态变化而不会高度太大或太小。
    290 如果动态变化后发现要出现大小 变化后才能正常显示,可能如下
    291 topLevelItem(parentIndex)->setExpanded(false);
    292 topLevelItem(parentIndex)->setExpanded(true);
    293 即先收起子Treewidgetitem,然后再展开。这只是一种强制其更新的方法。
    294 ////////////////
    295 
    296     
    297         node->setIcon(0,QIcon(QPixmap("Fold.png")));
    298         m_IsFoldedList.append(true);
    299     
    300         int id = 0;
    301         while(id<columnNameCount)
    302             node->setTextAlignment(id++,Qt::AlignCenter);
    303 
    304     }
    305     connect(this,SIGNAL(itemClicked(QTreeWidgetItem*,int)),this,SLOT(ChangeIconSlot(QTreeWidgetItem*,int)));
    306 
    307 }
    308 
    309 InformationPositionTreeView::~InformationPositionTreeView()
    310 {
    311 
    312 }
    313 void InformationPositionTreeView::mouseMoveEvent(QMouseEvent * event)
    314 {
    315     QModelIndex index = indexAt(event->pos());
    316     if(index.isValid() && index.row()>=0) 
    317     {
    318         this->setSelection(visualRect(index),QItemSelectionModel::SelectCurrent);
    319     }
    320         
    321 }
    322 void InformationPositionTreeView::ChangeIconSlot(QTreeWidgetItem * item, int column)
    323 {
    324     QIcon icon;
    325     bool isNeedExpanded = true;
    326     if(column==0 && item->parent()==nullptr)
    327     {
    328         if(m_IsFoldedList[column])
    329         {
    330             icon = QIcon(QPixmap("UnFold.png"));
    331             isNeedExpanded = true;
    332         }
    333         else
    334         {
    335             icon = QIcon(QPixmap("Fold.png"));
    336             isNeedExpanded = false;
    337         } 
    338         item->setIcon(column,icon);
    339         m_IsFoldedList.replace(column,!m_IsFoldedList[column]);
    340         item->setExpanded(isNeedExpanded);
    341     }
    342 }
    343 void InformationPositionTreeView::Init()
    344 {
    345 //    this->setMouseTracking(true);
    346     this->setFocusPolicy(Qt::NoFocus);
    347      this->setSelectionBehavior(QAbstractItemView::SelectRows);
    348     this->setSelectionMode(QAbstractItemView::SingleSelection);
    349     
    350     this->setEditTriggers(QAbstractItemView::NoEditTriggers);
    351     this->setContextMenuPolicy(Qt::CustomContextMenu);
    352 
    353     QHeaderView* headerView = new QHeaderView(Qt::Horizontal,this);    
    354     this->setHeader(headerView);
    355     headerView->setStretchLastSection(true);
    356     headerView->setDefaultAlignment(Qt::AlignCenter);
    357     headerView->setSectionsClickable(true);
    358     headerView->setSectionResizeMode(QHeaderView::ResizeToContents);
    359     
    360     
    361 
    362     this->setStyleSheet("QTreeView::branch {image:none;}"); 
    363 //    this->setRootIsDecorated(false);
    364 //    this->setItemDelegateForColumn(0,);
    365 }
    366 void InformationPositionTreeView::InitPositionItemListMap(InformationPositionItem& infoItem)
    367 {
    368     QList<PositionItem>  positionItemList = infoItem.GetPositionItemList();
    369     int count = positionItemList.count();
    370     for(int i=0;i<count;i++)
    371     {
    372         m_InstrumentStringList << positionItemList[i].GetInstrument();
    373     }
    374 
    375     m_InstrumentStringList.removeDuplicates();
    376     int keyCount = m_InstrumentStringList.count();
    377     for(int i=0;i<keyCount;i++) 
    378     {
    379         QList<PositionItem> value;
    380         for(int j=0;j<count;j++)
    381         {
    382             if(positionItemList[j].GetInstrument()==m_InstrumentStringList[i])
    383                 value.append(positionItemList[j]);
    384         }
    385         m_PositionItemListMap.insert(m_InstrumentStringList[i],value);
    386     }
    387 
    388 }
    389 float InformationPositionTreeView::GetSumValue(const QList<PositionItem>& positionItemList,const QString& itemName)
    390 {
    391     float sum = 0.0;
    392     int count = positionItemList.count();
    393     //.....
    394 
    395     return 2.01;
    396 }
    397 
    398 ======
    399 
    400 InformationPositionTreeModel::InformationPositionTreeModel(InformationPositionItem& infoItem,QObject * parent):m_InformationPositionItem(infoItem),QAbstractItemModel(parent)
    401 {
    402 
    403 }
    404 
    405 InformationPositionTreeModel::~InformationPositionTreeModel(void)
    406 {
    407 }
    408 
    409 int InformationPositionTreeModel::rowCount(const QModelIndex &parent) const
    410 {
    411     return m_InformationPositionItem.GetPositionItemList().count();
    412 }
    413 int InformationPositionTreeModel::columnCount(const QModelIndex &parent) const
    414 {
    415     return m_InformationPositionItem.GetColumnNameList().count();
    416 }
    417 QVariant InformationPositionTreeModel::data(const QModelIndex &index, int role) const
    418 {
    419     if(!index.isValid())
    420         return QVariant();
    421     
    422 
    423 
    424 
    425     if(role==Qt::DisplayRole)
    426     {
    427         PositionItem item = m_InformationPositionItem.GetPositionItemList()[index.row()];
    428         switch (index.column())
    429         {
    430         case 0:
    431             return "";
    432         case 1:
    433             return item.GetInstrument();
    434         case 2:
    435             return item.GetBuyLot();
    436         case 3:
    437             return item.GetAvgBuyPrice();
    438         case 4:
    439             return item.GetSellLot();
    440         case 5:
    441             return item.GetAvgSellPrice();
    442         case 6:
    443             return item.GetNet();
    444         default:
    445             return item.GetFloatingMap()[headerData(index.column(),Qt::Horizontal,Qt::DisplayRole).toString()];;
    446         }
    447     }
    448     if(role==Qt::DecorationRole && index.column()==0)
    449     {
    450         return     QIcon(QPixmap("Fold.png"));    
    451     }
    452     if(role==Qt::TextAlignmentRole)
    453     {
    454         Qt::AlignCenter;
    455     }
    456     return QVariant();
    457 }
    458 QVariant InformationPositionTreeModel::headerData(int section, Qt::Orientation orientation, int role) const
    459 {
    460     if(orientation == Qt::Horizontal && role == Qt::DisplayRole)
    461     {
    462         return m_InformationPositionItem.GetColumnNameList()[section];
    463     }
    464     return QVariant();
    465 }
    466 Qt::ItemFlags InformationPositionTreeModel::flags(const QModelIndex &index) const
    467 {
    468    if (!index.isValid())
    469         return Qt::ItemIsSelectable;
    470 
    471    return QAbstractItemModel::flags(index) | Qt::ItemIsSelectable;
    472 }
    473 bool InformationPositionTreeModel::setData(const QModelIndex &index, const QVariant &value, int role)
    474 {
    475     if(!index.isValid())
    476         return false;
    477     return false;
    478 }
    479 
    480 QModelIndex    InformationPositionTreeModel::parent(const QModelIndex & index) const
    481 {
    482     if(index.isValid())
    483         return index.parent();
    484     return QModelIndex();
    485 }
    486 QModelIndex    InformationPositionTreeModel::index(int row, int column, const QModelIndex & parent) const
    487 {
    488     if(parent.isValid())
    489         return parent.child(row,column);
    490     return QModelIndex();
    491 }
  • 相关阅读:
    C/C++操作MySQL数据库——增、删、改、查
    Mysql常用命令行大全——转载
    .NET Framework、C#、ASP.NET之间的关系
    委托和事件
    ASP.NET 页生命周期概述
    在SqlServer下增加MySql的链接服务器
    Head First 设计模式----DecoratorPattern
    jquery easyui----tree
    Head First 设计模式----ObserverPattern
    Jquery easyui----combotree
  • 原文地址:https://www.cnblogs.com/lovebay/p/9328237.html
Copyright © 2020-2023  润新知