QTableView函数使用,右击菜单实现 世界视讯

QTableView view(this);QStandardItemModel model(this);/*设置表头水平标题*/model.setHorizontalHeaderItem(0,new QStandardItem("Name"));model.setHorizontalHeaderItem(1,new QStandardItem("Sex"));model.setHorizontalHeaderItem(2,new QStandardItem("Age"));model.horizontalHeaderItem(0)->setFont(QFont("Helvetica",20,50)); //设置标题字体/*设置表头垂直标题*/model.setVerticalHeaderItem(0,new QStandardItem("No.1"));model.setVerticalHeaderItem(1,new QStandardItem("No.2"));model.setVerticalHeaderItem(2,new QStandardItem("No.3"));/*设置列表条目数据*/QPixmap pix(":user.png");pix = pix.scaled(24,24,Qt::KeepAspectRatio);QStandardItem *itemA=new QStandardItem();itemA->setData(pix,Qt::DecorationRole); //设置条目图标itemA->setData("A",Qt::DisplayRole);itemA->setData("A:tooltip",Qt::ToolTipRole);itemA->setData(QFont("宋体",12,QFont::Bold,true),Qt::FontRole); //设置条目字体itemA->setData(Qt::AlignCenter,Qt::TextAlignmentRole); //设置条目中心对齐//可以实现按数值排序,否则的话"2">"123"itemA->setData(Qt::DisplayRole, 2);QLinearGradient linearGradient(0,0,100,20);linearGradient.setColorAt(0.2, Qt::white);linearGradient.setColorAt(0.6, Qt::green);linearGradient.setColorAt(1.0, Qt::black);itemA->setData(QBrush(linearGradient),Qt::BackgroundRole); //设置条目背景色(为渐变色)model.setItem(0,0,itemA);model.setItem(0,1,new QStandardItem("B"));model.setItem(1,0,new QStandardItem("C"));model.item(0,1)->setTextAlignment(Qt::AlignCenter); //设置条目居中对齐/*将数据模型的第一列进行下降排序(从大到小,不会进行整行排序)*/model.sort(0,Qt::DescendingOrder);/*根据视图里的第一列数据,进行整行大小排序*/view.sortByColumn(0);/*设置视图能够自动使能排序*/view.setSortingEnabled(true);/*设置视图是否支持自动滑动*/view.setAutoScroll(bool enable);  /*设置选中一行后,标题的字体不会加粗*/view->horizontalHeader()->setHighlightSections(false);/*设置列宽不可变动,在5.X后改为了setSectionResizeMode()*/view.horizontalHeader()->setResizeMode(QHeaderView::Fixed);/*设置行宽不可变动*/view.verticalHeader()->setResizeMode(QHeaderView::Fixed);/*设置用户选择模式, NoSelection表示不能选择表格*/view.setSelectionMode(QAbstractItemView::NoSelection);/*隐藏垂直标题*/view.verticalHeader()->hide();/*设置用户选择时,只能选中一行*/view.setSelectionMode(QAbstractItemView::SingleSelection);//设置选择模式,表示只能选中单个view.setSelectionBehavior(QAbstractItemView::SelectRows);//设置选择行为,表示只能选择一行(也可以设置为列,或者单个Item项目)/*设置表格不可编辑*/view.setEditTriggers(QAbstractItemView::NoEditTriggers);/*设置表头的显示与隐藏*/view.horizontalHeader()->setVisible(false);view.verticalHeader()->setVisible(false);/*禁止显示网格线*/view.setShowGrid(false);/*禁止显示滚动条*/view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);/*设置行列的高宽*/view.setColumnWidth(0,50); //设置column0(第1列)的宽度为50,必须要设置好model后,再来设置宽度  view.setRowHeight(0,30); //设置row0(第1行)的高度为30,必须setModel()后,再来设置高度view.resizeRowsToContents(); //更据当前内容自动调整行距view.resizeColumnsToContents(); //更据当前内容自动调整列距/*禁止焦点(取消QTableView选中后的虚线框)*/view.setFocusPolicy(Qt::NoFocus);/*获取鼠标当前位于视图的哪个index位置*/qDebug()<

合并单元格提醒


(资料图片)

数据更新后,还要继续使用setSpan再次合并(主要是要对全表格进行重新的单元格合并,已经合并过的地方行列又要重新进行新的合并,因为数据已经更新),这时不能直接使用setSpan,而是要先把QTableView的row还原为原来没有合并行列的情形,再次使用setSpan

对于QStandardItem的setData()成员 函数的第二个参数role 是模型数据角色

当role值不同时,则显示在视图上的方式也会不同

对于role角色,常用的值有:

Qt::DisplayRole 0 以文本方式显示数据(QString)

Qt::DecorationRole 1 将数据作为图标来装饰(QIcon,QPixmap)

Qt::EditRole 2 可编辑的数据信息显示(QString)

Qt::ToolTipRole 3 作为工具提示显示(QString)

Qt::StatusTipRole 4 作为状态栏中显示的数据(QString)

Qt::WhatsThisRole 5 作为帮助信息栏中显示的数据(QString)

Qt::FontRole 6 设置字体(QFont)

Qt::TextAlignmentRole 7 设置模型数据的文本对齐(Qt::AlignmentFlag)

Qt::BackgroundRole 8 设置模型数据的背景色(QBrush)

Qt::ForegroundRole 9 设置模型数据的前景色,比如字体(QBrush)

实现右击菜单

当用户在QTableView视图里右击鼠标时,便会触发一个QEvent::ContextMenu类型的事件,所以通过事件过滤器来实现右击菜单效果

步骤:

定义菜单对象(QMenu)

通过QMenu的addAction()函数,添加子项,并连接到槽函数

定义事件过滤器,判断是否是QTableView的QEvent::ContextMenu事件

判断成功,则调用menu.exec(cursor().pos()),在当前鼠标位置打开菜单

效果:

代码如下

Widget.h:

#ifndef WIDGET_H#define WIDGET_H#include class Widget : public QWidget{Q_OBJECTQTableView view;QStandardItemModel model;QMenu menu;public:explicit Widget(QWidget *parent = 0);bool eventFilter(QObject* obj, QEvent *evt);public slots:void onDelete(void);};#endif // WIDGET_H

Widget.cpp:

#include "widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),view(this),model(this),menu(this){model.setItem(0,0, new QStandardItem("A"));model.setItem(0,1, new QStandardItem("B"));model.setItem(1,0, new QStandardItem("C"));model.setItem(1,1, new QStandardItem("D"));model.setItem(2,0, new QStandardItem("E"));model.setItem(2,1, new QStandardItem("F"));model.setItem(3,0, new QStandardItem("G"));model.setItem(3,1, new QStandardItem("H"));/*设置视图只能选中一行,取消焦点,禁止编辑*/view.setFocusPolicy(Qt::NoFocus);view.setEditTriggers(QAbstractItemView::NoEditTriggers);view.setSelectionMode(QAbstractItemView::SingleSelection);view.setSelectionBehavior(QAbstractItemView::SelectRows);view.setModel(&model);view.installEventFilter(this);menu.addAction("删除",this,SLOT(onDelete())); //设置菜单项,并连接槽函数}void Widget::onDelete(void){model.removeRow(view.currentIndex().row()); //更据当前鼠标所在的索引的行位置,删除一行}bool Widget::eventFilter(QObject* obj, QEvent *evt){if(obj == &view && evt->type() == QEvent::ContextMenu){if(view.currentIndex().isValid()==true){ menu.exec(cursor().pos()); //在当前鼠标位置上运行菜单menu对象}}return QWidget::eventFilter(obj,evt);}

main函数:

int main(int argc, char *argv[]){QApplication a(argc, argv);Widget w;w.show();return a.exec();}

【领 QT开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】

点击这里:

关键词:

推荐DIY文章
主机存在磨损或划痕风险 PICO4便携包宣布召回
穿越湖海!特斯拉Cybertruck电动皮卡可以当“船”用
vivoXFold+折叠旗舰开售 配备蔡司全焦段旗舰四摄
飞凡R7正式上市 全系标配换电架构
中兴Axon30S开售 拥有黑色蓝色两款配色
荣耀MagicBookV14 2022正式开售 搭载TOF传感器
it