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);         //设置条目中心对齐

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


对于QStandardItemsetData()成员 函数的第二个参数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 = 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();
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

WAI-ARIA无障碍网页应用属性完全展示

WAI-ARIA指无障碍网页应用。主要针对的是视觉缺陷,失聪,行动不便的残疾人以及假装残疾的测试人员。尤其像盲人,眼睛看不到,其浏览网页则需要借助辅助设备,如屏...

2364
来自专栏salesforce零基础学习

salesforce lightning零基础学习(五) 事件阶段(component events phase)

上一篇介绍了lightning component events的简单介绍。此篇针对上一篇进行深入,主要讲的内容为component event中的阶段(Pha...

870
来自专栏非典型技术宅

简单放置一张图片,实现放大缩小旋转效果1 image和imageView的区别2 创建控件显示到view上的标准步骤3 CGRectOffset函数的含义4 小飞机-监听四个按钮的点击事件(代码)5

1243
来自专栏前端新视界

关于 CSS 反射倒影的研究思考

原文:The State of CSS Reflections 译者:nzbin 友情提示:由于演示 demo 的兼容性,推荐火狐浏览。该文章篇幅较长,内容庞杂...

3029
来自专栏编程

类选择符和ID选择符

类选择符 ? HTML代码: CSS代码: div { width: 200px; height: 200px; border: 1px solid #000;...

2067
来自专栏施炯的IoT开发专栏

《101 Windows Phone 7 Apps》读书笔记-Silly Eye

课程内容 Ø Animation Ø Event Triggers Ø Named Resources Ø Settings Page Ø Color...

2027
来自专栏Google Dart

AngularDart Material Design 下拉列表 顶

material-dropdown-select组件结合了material-select和material-button-down的API。

1342
来自专栏阮一峰的网络日志

CSS in JS 简介

1、 以前,网页开发有一个原则,叫做"关注点分离"(separation of concerns)。 ? 它的意思是,各种技术只负责自己的领域,不要混合在一起,...

3057
来自专栏用户2442861的专栏

初步学习Qt布局

在一个Widget中,Qt布局管理系统提供了一个简单而有效的方式来自动组织子widget,以保证他们能够很好地利用可用空间。

1301
来自专栏自动化测试实战

HTML第二课——css【2】

2289

扫码关注云+社区