24.QTableView函数使用,右击菜单实现
QTableView view(this);
QStandardItemModel model(this); /*设置表头水平标题*/
model.setHorizontalHeaderItem(,new QStandardItem("Name"));
model.setHorizontalHeaderItem(,new QStandardItem("Sex"));
model.setHorizontalHeaderItem(,new QStandardItem("Age"));
model.horizontalHeaderItem()->setFont(QFont("Helvetica",,)); //设置标题字体 /*设置表头垂直标题*/
model.setVerticalHeaderItem(,new QStandardItem("No.1"));
model.setVerticalHeaderItem(,new QStandardItem("No.2"));
model.setVerticalHeaderItem(,new QStandardItem("No.3")); /*设置列表条目数据*/
QPixmap pix(":user.png");
pix = pix.scaled(,,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("宋体",,QFont::Bold,true),Qt::FontRole); //设置条目字体
itemA->setData(Qt::AlignCenter,Qt::TextAlignmentRole); //设置条目中心对齐
//可以实现按数值排序,否则的话"2">"123"
itemA->setData(Qt::DisplayRole, 2);
QLinearGradient linearGradient(,,,);
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(,,itemA);
model.setItem(,,new QStandardItem("B"));
model.setItem(,,new QStandardItem("C"));
model.item(,)->setTextAlignment(Qt::AlignCenter); //设置条目居中对齐 /*将数据模型的第一列进行下降排序(从大到小,不会进行整行排序)*/
model.sort(,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(,); //设置column0(第1列)的宽度为50,必须要设置好model后,再来设置宽度
view.setRowHeight(,); //设置row0(第1行)的高度为30,必须setModel()后,再来设置高度
view.resizeRowsToContents(); //更据当前内容自动调整行距
view.resizeColumnsToContents(); //更据当前内容自动调整列距
/*禁止焦点(取消QTableView选中后的虚线框)*/
view.setFocusPolicy(Qt::NoFocus);
/*获取鼠标当前位于视图的哪个index位置*/
qDebug()<<view.currentIndex().row(); //获取行号,如果为-1,表示无效
qDebug()<<view.currentIndex().column();//获取列号,如果为-1,表示无效
void QTableView::setSpan(int row, int column, int rowSpanCount, int columnSpanCount);
//合并单元格
//第一个参数:要改变的单元格行数
//第二个参数:要改变的单元格列数
//第三个参数:需要合并的行数
//第四个参数:需要合并的列数
//比如: setSpan(0,0,2,3); 表示从table(0,0)开始到2,3结束,合并共2行和3列
合并单元格提醒
数据更新后,还要继续使用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 <QtGui> class Widget : public QWidget
{
Q_OBJECT QTableView view;
QStandardItemModel model;
QMenu menu; public:
explicit Widget(QWidget *parent = );
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(,, new QStandardItem("A"));
model.setItem(,, new QStandardItem("B"));
model.setItem(,, new QStandardItem("C"));
model.setItem(,, new QStandardItem("D"));
model.setItem(,, new QStandardItem("E"));
model.setItem(,, new QStandardItem("F"));
model.setItem(,, new QStandardItem("G"));
model.setItem(,, 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();
}
24.QTableView函数使用,右击菜单实现的更多相关文章
- JS自定义鼠标右击菜单
自定义鼠标右击菜单要素: 禁止页面默认右击事件 设置右击菜单的样式以及菜单出现的位置(通过捕获鼠标点击位置来确定菜单的位置) 鼠标在指定控件(区域)上右击时显示菜单(默认菜单隐藏,点击鼠标右键时显示) ...
- 12.QT4.7.4-解决WIN平台和Linux平台中文乱码,QLineEdit右击菜单中文显示
1.解决Win平台中文显示 1.1首先解决win平台上中文显示乱码问题 1)首先查看qt creator的编码格式 通过->编辑->选择编码 查看. 2)如果qt creator的编码格式 ...
- 第二十五篇 -- QTreeWidget右击菜单的实现
效果图: 自己画一个ui,如图,前面已经讲过怎么用Qt Designer画图了,现在就不赘述了. ui_play.py # -*- coding: utf-8 -*- # Form implement ...
- WPF实现窗口最小化到托盘,并且实现右击菜单
原版是从网上找了一位大神的,自己只是用了一点适合自己的. 具体实现 1.首先已经确认WPF中没有实现最小化托盘的类与方法,用到了winform中的程序集 using Drawing = System. ...
- 如何使用jQuery-ContextMenu实现右击菜单
最近在做项目中,遇到一个棘手的问题,页面上有很多功能需要实现,每个功能需要绑定一个按钮.如果一个功能绑定一个按钮,那么将会占用页面很大的空间,而且可能会使页面变得不美观.思前想后,决定将所有按钮做成右 ...
- 自定义Windows右击菜单调用Winform程序
U9_Git中ignore文件处理 背景 U9代码中有许多自动生成的文件,不需要上传Git必须BE Entity中的.target文件 .bak 文件 Enum.cs结尾的文件,还有许多 extand ...
- 右击菜单一键优化(增加新建office2003、新建reg和bat,删除新建公文包、新建wps、新建rar)
右击菜单一键优化(增加新建office2003.新建reg和bat,删除新建公文包.新建wps.新建rar) Windows Registry Editor Version 5.00 [HKEY_CL ...
- BAT-给文件右击菜单增加7-ZIP浏览功能
Reg给文件右击菜单增加7-ZIP浏览功能 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\用7-ZIP浏览(ZJQ)] ...
- Windows中与系统关联自己开发的程序(默认打开方式、图标、右击菜单等)
1. 默认打开方式 1.1. 代码支持 在Windows下,某个特定后缀名类型的文件,如果要双击时默认用某个程序(比如自己开发的WinForm程序)打开,代码中首先肯定要支持直接根据这个文件进行下一步 ...
随机推荐
- ES6中的箭头函数和普通函数有什么区别?
1.普通函数中的this总是指向调用它的那个对象, 箭头函数没有自己的this,他的this永远指向其定义环境,任何方法都改变不了其指向,如call().bind().apply().(正是因为它没有 ...
- Unity一键设置导入图片格式
前几天由于项目原因,做了一个自动根据模型自动创建动画状态机,然后紧接着做了根据动画状态机和模型一键制作Prefab. 现在因为图片数量或者其它原因需要写一个一键设置图片格式的插件. 至于制作动画状态机 ...
- Senparc.Weixin SDK v5.0 升级公告
经过五年半的持续维护,Senparc.Weixin SDK 逐步丰满和完善,在升级的过程中,我们为基础库(Senparc.Weixin.dll)加入了许多通用的功能,例如加密/解密算法.通用缓存方法等 ...
- JavaScript原生实现观察者模式
观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察着对象. 它是由两类对象组成,主题和观察者,主题负责发布事件 ...
- LabVIEW(八):程序结构中的循环结构
1.程序结构分为三种:循环结构.分支结构.顺序结构. 本文主要讨论循环结构. 2.While循环 左下角:循环计数端子i,从0开始计数,每进行一次循环,i自动增加1. 右下角:循环条件端子,当循环达到 ...
- BaseDao优化
BaseDao优化2种方法 1. try { //读取配置文件,配置文件保存了数据库的东西 String path=”database.properties”; //创建实例化对象 Propertie ...
- Aseprite入门:第一个gif动图
前言:Aseprite入门教程 1.新建图片: 选择新建文件,然后选定宽高和颜色及背景类型,点击OK进行图片的创建: 2.绘制一个基础图形,为了方便还是选用球形: 填充上颜色: 美化(添加阴影增加小球 ...
- Ubuntu 16.04安装下HTK--亲测ok
1.首先需要安装一些32位库sudo apt-get install libx11-dev:i386 libx11-dev sudo apt-get install g++-multilib sudo ...
- 树莓派连接不上WiFi
之前还好好的,突然连接不上WiFi,打开文件WiFi配置文件:/etc/wpa_supplicant/wpa_supplicant.conf发现有多个连接记录,把用到的留下,其他的删掉即可: sudo ...
- iOS学习——(转)UIResponder详解
本文转载自:ios开发 之 UIResponder详解 我们知道UIResponder是所有视图View的基类,在iOS中UIResponder类是专门用来响应用户的操作处理各种事件的,包括触摸事件( ...