24.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();
column函数的使用/*设置⽤户选择时,只能选中⼀⾏*/
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()后,再来设置⾼度
/*禁⽌焦点(取消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列
void setVerticalScrollMode(QAbstractItemView::ScrollMode mode);
//设置滑动模式.可以设置按⾏滑动,还是按像素点来滑动
合并单元格提醒
数据更新后,还要继续使⽤setSpan再次合并(主要是要对全表格进⾏重新的单元格合并,已经合并过的地⽅⾏列⼜要重新进⾏新的合并,因为数据已经更新),这时不能直接使⽤setSpan,⽽是要先把QTableView的row还原为原来没有合并⾏列的情形,再次使⽤setSpan
对于的()成员函数的第⼆个参数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事件
判断成功,则调⽤(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 = 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)
{
bool Widget::eventFilter(QObject* obj, QEvent *evt)
{
if(obj == &view  &&  evt->type() == QEvent::ContextMenu)
{
if(view.currentIndex().isValid()==true)
{
<(cursor().pos());          //在当前⿏标位置上运⾏菜单menu对象        }
}
return QWidget::eventFilter(obj,evt);
}
main函数:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
();
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。