您的位置:首页 > Web前端 > CSS

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

2017-12-18 10:36 676 查看


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

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


一、设置表单样式


1.表格设置结构


1.QTableWidget不能在mainwindow中随主窗口的大小变化?

 //在表格外部添加布局。
​
 tableWidget = new QTableWidget;
​
 tableWidget ->setObjectName(QString::fromUtf8("tableWidget"));
​
 QVBoxLayout *verticalLayout;
​
 verticalLayout->addWidget(tableWidget );  


2.将表格变为禁止编辑:

  tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
​
 (参数含义:QAbstractItemView.NoEditTriggers--不能对表格内容进行修改
​
             QAbstractItemView.CurrentChanged--任何时候都能对单元格修改<
20000
/span>
​
             QAbstractItemView.DoubleClicked--双击单元格
​
             QAbstractItemView.SelectedClicked--单击已选中的内容
​
             QAbstractItemView.EditKeyPressed--
​
             QAbstractItemView.AnyKeyPressed--按下任意键就能修改
​
             QAbstractItemView.AllEditTriggers--以上条件全包括)


3.设置表格为整行选择

  tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);  //整行选中的方式
​
 (参数含义:AbstractItemView.SelectItems--选中单个单元格
​
             QAbstractItemView.SelectRows--选中一行
​
             QAbstractItemView.SelectColumns--选中一列)


4.单个选中和多个选中的设置:

 tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);  //设置为可以选中多个目标
​
(参数含义:QAbstractItemView.NoSelection--不能选择
​
            QAbstractItemView.SingleSelection--选中单个目标
​
            QAbstractItemView.MultiSelection--选中多个目标
​
 QAbstractItemView.ExtendedSelection/QAbstractItemView.ContiguousSelection 的区别不明显,主要功能是正常情况下是单选,但按下Ctrl或Shift键后,可以多选)    


5.表格表头的显示与隐藏

 对于水平或垂直方法的表头,可以用以下方式进行 隐藏/显示 的设置:
​
 tableWidget->verticalHeader()->setVisible(false);   //隐藏列表头  
​
 tableWidget->horizontalHeader()->setVisible(false); //隐藏行表头  
​
 注意:需要 #include <QHeaderView>


6.对表头文字的字体、颜色进行设置

  //获得水平方向表头的Item对象  
  QTableWidgetItem *columnHeaderItem0 = tableWidget->horizontalHeaderItem(0);
​
 //设置字体
 columnHeaderItem0->setFont(QFont("Helvetica"));  
​
 //设置单元格背景颜色
 columnHeaderItem0->setBackgroundColor(QColor(0,60,10));  
​
 //设置文字颜色
 columnHeaderItem0->setTextColor(QColor(200,111,30));
​
 注意:需要 #include <QHeaderView>        


7.在单元格里加入控件:

  QComboBox *comBox = new QComboBox();
​
  comBox->addItem("Y");
​
  comBox->addItem("N");
​
  tableWidget->setCellWidget(0,2,comBox);  


8.单元格中添加图片:

tableWidget->setItem(row, 0, new QTableWidgetItem(QIcon(":/new/images/kingdemo.ico"),tr("")));


9.设置单元格字体颜色、背景颜色和字体字符:

 QTableWidgetItem *item = new QTableWidgetItem("Apple");
​
 item->setBackgroundColor(QColor(0,60,10));
​
 item->setTextColor(QColor(200,111,100));
​
 item->setFont(QFont("Helvetica"));
​
 tableWidget->setItem(0,3,item);
​
 另:如果需要对所有的单元格都使用这种字体,则可以使用  tableWidget->setFont(QFont("Helvetica"));


10.设置单元格内文字的对齐方式

水平对齐方式有:
​
Constant Value Description
​
Qt.AlignLeft 0x0001 Aligns with the left edge.
​
Qt.AlignRight 0x0002 Aligns with the right edge.
​
Qt.AlignHCenter 0x0004 Centers horizontally in the available space.
​
Qt.AlignJustify 0x0008 Justifies the text in the available space.
​
垂直对齐方式:
​
Constant Value Description
​
Qt.AlignTop 0x0020 Aligns with the top.
​
Qt.AlignBottom 0x0040 Aligns with the bottom.
​
Qt.AlignVCenter 0x0080 Centers vertically in the available space.
​
如果两种都要设置,只要用 Qt.AlignHCenter |  Qt.AlignVCenter 的方式即可  


11.合并单元格:

tableWidget->setSpan(0, 0, 3, 1)  # 其参数为: 要改变单元格的1行数、2列数,要合并的3行数、4列数


12.设置单元格的大小

首先,可以指定某个行或者列的大小
​
  tableWidget->setColumnWidth(3,200);
​
  tableWidget->setRowHeight(3,60);
​
还可以将行和列的大小设为与内容相匹配
​
  tableWidget->resizeColumnsToContents();
​
  tableWidget->resizeRowsToContents();    


13.获得单击单元格的内容

通过实现 itemClicked (QTableWidgetItem *) 信号的槽函数,就可以获得鼠标单击到的单元格指针,进而获得其中的文字信息
​
connect(tableWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(getItem(QTreeWidgetItem*,int)));
​
//将itemClicked信号与函数getItem绑定


14.QTableWidget要调整表格行宽主要涉及以下函数

 //设置表格的对齐方式为均分窗口
 tableWidget->horizontalHeader()->setStretchLastSection(true);
 tableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
​
 //列完全填充并平分(均分列)
 tableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
 
 //行自适应宽度 (均分行)
 tableWidget->verticalHeader()->setResizeMode(QHeaderView::Stretch);                                                                                                    
 //根据内容调整列宽
 tableWidget->resizeColumnsToContents();
 
 //根据内容自动调整给定列宽
 tableWidget->resizeColumnToContents(int col);
 
 //把给定列设置为给定模式
 tableWidget->horizontalHeader()->setResizeMode
​
 主要模式有Stretch和Fixed    


15.添加表头内容:

方法一:
​
 QStringList header;
​
 header<<""<<tr("1")<<tr("2")<<tr("3")<<tr("4)<<tr("5");
​
 方法二:
​
 tableWidget->setHorizontalHeaderLabels(QStringList() << tr("1")<<tr("2")<<tr("3")<<tr("4)<<tr("5"));


16.清除:

 //清除所有可见数据(包括表头),行还在
 tableWidget->clear();
​
 //只清除表中数据,不清除表头内容
 tableWidget->clearContents();
​
 //连行也清除掉
 tableWidget->setRowCount(0);


17.一些零碎的知识点代码:

//获取表格中当前总行数
 int row = tableWidget->rowCount();
​
 //添加一行
 tableWidget->setRowCount(row+1);
​
 //清除已有的行列
 tableWidget->removeRow(row);
​
 //当前选中行
 Int row1 = tableWidget->currentItem()->row();
 
 //判断是否选中一行
 bool focus = tableWidget->isItemSelected(tableWidget->currentItem());
 
 //获取某一格内容
 QString proName = tableWidget->item(row, col)->text();
 
 //显示表格线
 setShowGrid(true);
​
 //隐藏左边垂直
 verticalHeader()->setVisible(false);
​
 QHeaderView *headerView = horizontalHeader();
                                                                                       
 //去除表头的移动
 headerView->setMovable(false);
                                                                                       
 //设置第一列宽
 headerView->resizeSection(0,284);
                                                                                       
 //设置第二列宽
 headerView->resizeSection(1,127);
                                                                                       
 //列表不能移动
 headerView->setResizeMode(QHeaderView::Fixed);
                                                                                       
 //不响应鼠标单击
 headerView->setClickable(false);
                                                                                       
 //不能编辑
 setEditTriggers(QTableWidget::NoEditTriggers);
                                                                                       
 //一次选中一行
 setSelectionBehavior(QTableWidget::SelectRows);
                                                                                       
 //只能单选
 setSelectionMode(QAbstractItemView::SingleSelection);
​
 /*QScrollBar *scrollBar = horizontalScrollBar();
​
 scrollBar->hide();*/
                                                                                       
 //去掉水平滚动条
 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
​
 //垂直滚动条按项移动                                                                      
 setVerticalScrollMode(QAbstractItemView::ScrollPerItem);

 //去掉自动滚动                                                                                
 setAutoScroll(false);


18.排序:

//顾名思义,该函数意思是将某列按升序/降序的方式排列
 tableWidget->sortByColumn(0, Qt::AscendingOrder);



2.范例:

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


 //设置表头内容
​
 QStringList header;
​
 header<<tr("name")<<tr("last modify time")<<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);
​
 //可多选(Ctrl、Shift、 Ctrl+A都可以)
 table_widget->setSelectionMode(QAbstractItemView::ExtendedSelection);  
​
 //设置选择行为时每次选择一行
 table_widget->setSelectionBehavior(QAbstractItemView::SelectRows);  
​
 //设置不可编辑
 table_widget->setEditTriggers(QAbstractItemView::NoEditTriggers);
​
 //设置表头第一列的宽度为150
 table_widget->horizontalHeader()->resizeSection(0,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;}");
​


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






3.疑问:


问题一:鼠标点击的选项会出现虚框

(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);
​


二、选中并获取所选行


(1)单选行

//设置选择行为,以行为单位
tableWidget->setSelectionBehavior ( QAbstractItemView::SelectRows);
​
//设置选择模式,选择单行
tableWidget->setSelectionMode ( QAbstractItemView::SingleSelection);


(2)多选并获取所选行

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 < item_count; i++)
   {
       //获取选中的行
​
       int item_row = this->row(items.at(i));
​
       set_row.insert(item_row);
   }
   return  true;
}
​


三、操作表单(添加、删除行等)


(1)动态插入行

 int row_count = table_widget->rowCount(); //获取表单行数
​
 table_widget->insertRow(row_count); //插入新行
​
 QTableWidgetItem *item = new QTableWidgetItem();
​
 QTableWidgetItem *item1 = new QTableWidgetItem();
​
 QTableWidgetItem *item2 = new QTableWidgetItem();
​
 QTableWidgetItem *item3 = new QTableWidgetItem();
​


//设置对应的图标、文件名称、最后更新时间、对应的类型、文件大小
​
 item->setIcon(icon); //icon为调用系统的图标,以后缀来区分  
​
 item->setText(name);
​
 item1->setText(last_modify_time);
​
 item2->setText(type); //type为调用系统的类型,以后缀来区分
​
 item3->setText(size);
​
 table_widget->setItem(row_count, 0, item);
​
 table_widget->setItem(row_count, 1, item1);    
​
 table_widget->setItem(row_count, 2, item2);
​
 table_widget->setItem(row_count, 3, item3);
​


 //设置样式为灰色
​
 QColor color("gray");
​
 item1->setTextColor(color);
​
 item2->setTextColor(color);
​
 item3->setTextColor(color);
​


(2)在指定位置插入行

其实跟(1)相似,(1)的前提是获取到表格行数

//插入新行 row为插入的位置
table_widget->insertRow(row);


(3) 删除选中的整行

 int rowIndex = m_pAttrbuteList->currentRow();
 if (rowIndex != -1)
     tableWidget->removeRow(rowIndex);


(4)增删改查范例

int rowIndex = m_pAttrbuteList->rowCount();
tableWidget->setRowCount(rowIndex + 1);//总行数增加1
​
tableWidget->setRowHeight(rowIndex, 24);//设置行的高度
​
--------------------------------------------------------------------------------
​
QTableWidget *table = new QTableWIdget(this);
​
table->setColumnCount(5);    //设置列数
​
table->setRowCount(3);        //设置行数/
​
/*设置列名*/
​
QStringList headers;
​
headers<<"列名1"<<"列名2"<<"列名3";
​
table->setHorizontalHeaderLabels(headers);
​
/*给单元格添加内容*/
​
void addItemContent(int row, int column, QString content)
​
{
​
     QTableWidgetItem *item = new QTableWidgetItem (content);
​
     table->setItem(row, column, item);
​
}
​
/*给单元格中增加图标*/
​
QTableWidgetItem *item = new QTableWidgetItem(QIcon("myImage.jpg"), NULL);  //只加入图标,没有字符串
​
QTableWidgetItem *item = new QTableWidgetItem(QIcon("myImage.jpg"), myString);   //加入图标和字符串
​
table->setItem(row, column, item);
​
/*插入一行*/
​
int row = table->rowCount();
​
table->insertRow(row);
​
/*插入一列*/
​
int column = table->columnCount();
​
table->insertColumn(column);
​
//使行列头自适应宽度,最后一列将会填充空白部分
​
table->horizontalHeader()->setStretchLastSection(true);          
​
//使行列头自适应宽度,所有列平均分来填充空白部分            
​
table->horizontalHeader()->setResizeMode(QHeaderView::Strtch);      
​
//使行自适应高度,假如行很多的话,行的高度不会一直减小,当达到一定值时会自动生成一个QScrollBar
​
table->verticalHeader()->setResizeMode(QHeaderView::Strtch);
​
//设置单击选择一行
​
table->setSelectionBehuavior(QAbstractItemView::SelectRows);
​
//设置每行内容不可编辑
​
table->setEditTriggers(QAbstractItemView::NoEditTriggers);
​
//设置只能选择一行,不能选择多行
​
table->setSelectionMode(QAbstractItemView::SingleSelection);
​
/*去掉每行的行号*/
​
QHeaderView *headerView = table->verticalHeader();
​
headerView->setHidden(true);
​
/*设置让某个单元格或某行选中*/
​
选中单元格:table->setCurrentCell(row, column, QItemSelectionModel::Select);
​
选中一行:table->setCurrentCell(row, QItemSelectionModel::Select);(注意此处的列没有值)



四、单击表头触发的事件


(1)连接表头的信号和槽

connect(horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(onHeaderClicked(int)));


(2)实现槽函数

void TableWidget::onHeaderClicked(int column)
​
{
     //column为所点击的表头的某列
}


五、打开某行进行编辑

既然模拟Window那么就模仿的像一点,Windows可以修改名称,那么Qt也必然可以实现





  //获得当前节点并获取编辑名称
​
  QTableWidgetItem *item = table_widget->item(edit_row, 0); //edit_row为想要编辑的行号
​
  table_widget->setCurrentCell(edit_row, 0);
​
  table_widget->openPersistentEditor(item); //打开编辑项
​
  table_widget->editItem(item);
 

//关闭编辑项

table_widget->closePersistentEditor(item);
​





OK,重命名完成,!


六、右键菜单


(1)创建菜单、菜单项

void TableWidget::createActions()
​
{
​
   //创建菜单项
​
   pop_menu = new QMenu();
​
   action_name = new QAction(this);
​
   action_size = new QAction(this);
​
   action_type = new QAction(this);
​
   action_date = new QAction(this);
​
   action_open = new QAction(this);  
​
   action_download = new QAction(this);
​
   action_flush = new QAction(this);
​
   action_delete = new QAction(this);
​
   action_rename = new QAction(this);
​
   action_create_folder = new QAction(this);
​

​
   action_open->setText(QString("打开"));
​
   action_download->setText(QString("下载"));
​
   action_flush->setText(QString("刷新"));
​
   action_delete->setText(QString("删除"));
​
   action_rename->setText(QString("重命名"));
​
   action_create_folder->setText(QString("新建文件夹"));
​
   action_name->setText(QString("名称"));
​
   action_size->setText(QString("大小"));
​
   action_type->setText(QString("项目类型"));
​
   action_date->setText(QString("修改日期"));
​
 
​
   //设置快捷键
​
   action_flush->setShortcut(QKeySequence::Refresh);
​

​
   //设置文件夹图标
​
   action_create_folder->setIcon(icon);
​
   QObject::connect(action_create_folder, SIGNAL(triggered()), this, SLOT(createFolder()));
​
}  
​



(2)重新实现contextMenuEvent

void TableWidget::contextMenuEvent(QContextMenuEvent *event)
​
{
​
   pop_menu->clear(); //清除原有菜单
​
   QPoint point = event->pos(); //得到窗口坐标
​
   QTableWidgetItem *item = this->itemAt(point);
​
   if(item != NULL)
​
   {
​
      pop_menu->addAction(action_download);
​
      <
d347
span class="cm-variable" style="color:#000000;">pop_menu->addAction(action_flush);
​
      pop_menu->addSeparator();
​
      pop_menu->addAction(action_delete);
​
      pop_menu->addAction(action_rename);
​
      pop_menu->addSeparator();
​
      pop_menu->addAction(action_create_folder);
​
      sort_style = pop_menu->addMenu("排序");
​
      sort_style->addAction(action_name);
​
      sort_style->addAction(action_size);
​
      sort_style->addAction(action_type);
​
      sort_style->addAction(action_date);
​
     
​
      //菜单出现的位置为当前鼠标的位置
​
      pop_menu->exec(QCursor::pos());
​
      event->accept();
​
   }
​
}
​

OK,大功告成!






七、信号

 void cellActivated(int row, int column)
​
 void cellChanged(int row, int column)
​
 void cellClicked(int row, int column)
​
 void cellDoubleClicked(int row, int column)
​
 void cellEntered(int row, int column)
​
 void cellPressed(int row, int column)
​
 void itemActivated(QTableWidgetItem *item)
​
 void itemChanged(QTableWidgetItem *item)
​
 void itemClicked(QTableWidgetItem *item)
​
 void itemDoubleClicked(QTableWidgetItem *item)
​
 void itemEntered(QTableWidgetItem *item)
​
 void itemPressed(QTableWidgetItem *item)
​
 void itemSelectionChanged()
​
 void currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous)
​
 void currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)
​

​ 关于界面的文件(夹)图标和类型如何获取?对于文件而言,不同扩展名的文件至少也有100种以上,如果图标和类型固定写死的话必不可行,所以,这里提供以下两种方式获取。

Qt之QFileIconProvider(获取文件图标、类型).

Qt之QFileIconProvider续(获取文件图标、类型).

QTableWidget和QListWidget应用范例

QTableView简单应用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐