QTableWidget详解(样式、右键菜单、表头塌陷、多选等)

发布时间:2017-6-29 10:36:28编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"QTableWidget详解(样式、右键菜单、表头塌陷、多选等)",主要涉及到QTableWidget详解(样式、右键菜单、表头塌陷、多选等)方面的内容,对于QTableWidget详解(样式、右键菜单、表头塌陷、多选等)感兴趣的同学可以参考一下。

http://www.cnblogs.com/zhoug2020/p/3789076.html

在Qt的开发过程中,时常会用到表单(QTableWidget)这个控件,网上的资料不少,但是都是最基本的,有一些比较经常遇到的问题也说得不太清楚。所以,今天就在这里总结一下!

  以下为个人模拟Windows资源管理器的一个表单

 一、设置表单样式

  table_widget->setColumnCount(4); //设置列数

  table_widget->horizontalHeader()->setDefaultSectionSize(150); 
 table_widget->horizontalHeader()->setClickable(false);//设置表头不可点击(默认点击后进行排序)

  //设置表头内容
  QStringList header;
  header<<tr("name")<<tr("last modifytime")<<tr("type")<<tr("size");
 table_widget->setHorizontalHeaderLabels(header);

  //设置表头字体加粗

  QFont font =this->horizontalHeader()->font();
  font.setBold(true);
 table_widget->horizontalHeader()->setFont(font);

 
 table_widget->horizontalHeader()->setStretchLastSection(true);//设置充满表宽度
 table_widget->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
 table_widget->verticalHeader()->setDefaultSectionSize(10);//设置行高
 table_widget->setFrameShape(QFrame::NoFrame); //设置无边框
  table_widget->setShowGrid(false);//设置不显示格子线
 table_widget->verticalHeader()->setVisible(false);//设置垂直头不可见
 table_widget->setSelectionMode(QAbstractItemView::ExtendedSelection); //可多选(Ctrl、Shift、  Ctrl+A都可以)
 table_widget->setSelectionBehavior(QAbstractItemView::SelectRows); //设置选择行为时每次选择一行
 table_widget->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置不可编辑
 table_widget->horizontalHeader()->resizeSection(0,150);//设置表头第一列的宽度为150
 table_widget->horizontalHeader()->setFixedHeight(25);//设置表头的高度

  table_widget->setStyleSheet("selection-background-color:lightblue;");//设置选中背景色

 table_widget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:skyblue;}");//设置表头背景色

  //设置水平、垂直滚动条样式

 table_widget->horizontalScrollBar()->setStyleSheet("QScrollBar{background:transparent;height:10px;}"
  "QScrollBar::handle{background:lightgray;border:2px solid transparent; border-radius:5px;}"
  "QScrollBar::handle:hover{background:gray;}"
  "QScrollBar::sub-line{background:transparent;}"
  "QScrollBar::add-line{background:transparent;}");

 table_widget->verticalScrollBar()->setStyleSheet("QScrollBar{background:transparent;width: 10px;}"
  "QScrollBar::handle{background:lightgray;border:2px solid transparent; border-radius:5px;}"
  "QScrollBar::handle:hover{background:gray;}"
  "QScrollBar::sub-line{background:transparent;}"
  "QScrollBar::add-line{background:transparent;}");

  好了,样式设置完成,效果如下所示:


  问题一:鼠标点击的选项会出现虚框,在Qt官网找到一篇博客专门介绍的,直接上代码!

  (1)实现如下一个类

  #include "no_focus_delegate.h"

  void NoFocusDelegate::paint(QPainter*painter, const QStyleOptionViewItem & option, const QModelIndex&index) const
  {
    QStyleOptionViewItem itemOption(option);
    if (itemOption.state & QStyle::State_HasFocus)
    {
       itemOption.state = itemOption.state ^ QStyle::State_HasFocus;
    }

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

  (2)表格构造中添加如下代码

  table_widget->setItemDelegate(new NoFocusDelegate());

  

   OK,虚线边框去除

   问题二:当表格只有一行的时候,则表头会出现塌陷问题

  
   摸索了很长时间,才得以解决:

  //点击表时不对表头行光亮(获取焦点) 
  table_widget->horizontalHeader()->setHighlightSections(false); 

 二、多选并获取所选行

this->setSelectionMode(QAbstractItemView::ExtendedSelection); //设置多选(可以Ctral+A全选Ctral+Shift多选)获取所选行号:

bool TableWidget::getSelectedRow(QSet&set_row)

{

    QList items =this->selectedItems();

    int item_count =items.count();

    if(item_count <= 0)

    {

       return false;

    }

    for(int i=0; i

    {

       //获取选中的行

       int item_row = this->row(items.at(i));

       set_row.insert(item_row);

    }

    return true;

}