qt QTableView 的使用(嵌入QCheckobox,为某一单元格设置颜色,单击,双击,右键菜单QMenu)

QTableView 的使用

设置

   example_model =new ExampleModel;(自定义的数据层model)
    QStringList headerList;
    headerList <<"名字"<<"序号"<<"性别"<<"年龄"<<"成绩";
    example_model->setHorizontalHeaderLabels(headerList);
    //表头
    exampleTableView = new QTableView;
    exampleTableView->setModel(example_model);
(model,数据层)

    //把表格的背景调成相间色
    exampleTableView->setAlterna ingRowColors( true );
 );

    exampleTableView->verticalHeader()->setVisible( false ); //垂直表头不显示

model 定义

class ExampleModel : public QAbstractTableModel //继承QAbstractTableModel
{
public:
    ExampleModel(QObject *parent = 0);
    ~ExampleModel();
//重写的五个函数
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    Qt::ItemFlags flags(const QModelIndex &index) const;
    bool setData(const QModelIndex &index, const QVariant &value, int role);
    QVariant headerData( int section, Qt::Orientation orientation, int role ) const;  

    void setHorizontalHeaderLabels(QStringList headerList);//设置表头

signals:

private:

    int colNumberWithCheckBox_; //有QCheckBox的列,为0 表示第0列

    QStringList headerList_;  //表头

};

//返回列数,根据水平表头
int ExampleModel::columnCount(const QModelIndex & /* parent */) const
{
    return   ( !headerList_.size())?5:headerList_.size();
//    return 5;
}

//获取当前关键字

QVariant ExampleModel::headerData( int section, Qt::Orientation orientation, int role ) const
{
    if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
    {
        if(section<headerList_.size())
        {
            return headerList_[section];
        }
    }
    return QVariant();
}
//设置表头
void ExampleModel::setHorizontalHeaderLabels(QStringList headerList)
{
    headerList_ = headerList;
}
//显示的数据
QVariant ExampleModel::data( const QModelIndex &index, int role ) const
{
    if (!index.isValid())
        return QVariant();

    int row = index.row();
    int col = index.column();

    switch(role)
    {
    case Qt::DisplayRole:

        if (col == 1)
        {
            return QString::number(index.row()+1);
        }
        break;
//    case Qt::FontRole:
//        if ( col == 0) //change font only for cell(X,0)
//        {
//            QFont boldFont;
//            boldFont.setBold(true);
//            return boldFont;
//        }
//        break;
      case Qt::ForegroundRole:
        if ( col == 3) //第3列
        {
             QBrush redForground(Qt::red);
             return redForground;

        }
        break;

    case Qt::BackgroundRole:

        if ((col == 1 ))  //change background only for cell(X,1)
        {
                QBrush blueBackground(Qt::blue);
                return blueBackground;

        break;
    case Qt::DecorationRole:

        if (row == 0 )
        { //设置图片
             return QPixmap(":images/current_pic.png");

        }
        break;
    case Qt::TextAlignmentRole:

             return Qt::AlignCenter; //字体中间对齐

        break;
    case Qt::CheckStateRole:
        if (col ==  colNumberWithCheckBox_)//add a checkbox to cell(row,col)
        {

            return Qt::isChecked? Qt::Checked : Qt::Unchecked;
        }
        break;
    }
    return QVariant();

}

//为了设置QCheckBox而重写的
Qt::ItemFlags ExampleModel::flags( const QModelIndex &index ) const
{
    if   (!index.isValid())
        return 0;

    if (index.column() == colNumberWithCheckBox_)
        return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
//若是想编辑可返回    return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
    return  Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}

//设置数据,根据QChecoBox的状态
bool ExampleModel::setData( const QModelIndex &index, const QVariant &value, int role )
{

    if(!index.isValid())
        return false;

    if (role == Qt::CheckStateRole && index.column() == colNumberWithCheckBox_)
    {
    }
    return true;
}
 

注意

  #include<QTableView>
  #include<QHeaderView>

行为

单击

单击会发出信号clicked(QModelIndex),需要自定义 槽函数:如 exampleTableViewClicked(QModelIndex)

    connect(exampleTableView,
            SIGNAL(clicked(QModelIndex)),
            this,
            SLOT(exampleTableViewClicked(QModelIndex)));

在槽函数(exampleTableViewClicked)中判断点击的是哪个单元格,如:

index.column() == 0 && index.row() == 0 为单元格(0,0)

双击

单击会发出信号 doubleClicked(QModelIndex),,需要自定义 槽函数:如 exampleTableViewDoubleClicked(QModelIndex)

 connect(exampleTableView,
          SIGNAL(doubleClicked(QModelIndex)),
          this,
          SLOT(exampleTableViewDoubleClicked(QModelIndex)));

右键菜单

    //如果你用在QTableView中使用右键菜单,需启用该属性
    exampleTableView->setContextMenuPolicy(Qt::CustomContextMenu);

连接信号槽,槽函数ShowMouseRightButton是自定义的

    connect( exampleTableView,
         SIGNAL(customContextMenuRequested(const QPoint)),
         this,
         SLOT(ShowMouseRightButton(const QPoint)));

author: wsh

email:  [email protected]

时间: 2024-08-24 15:14:47

qt QTableView 的使用(嵌入QCheckobox,为某一单元格设置颜色,单击,双击,右键菜单QMenu)的相关文章

QT QTableView用法小结

QTableView常用于实现数据的表格显示.下面我们如何按步骤实现学生信息表格: 一 添加表头 1 //准备数据模型 2 QStandardItemModel *student_model = new QStandardItemModel(); 3 student_model->setHorizontalHeaderItem(0, new QStandardItem(QObject::tr("Name"))); 4 student_model->setHorizontal

转载:QT QTableView用法小结

出自: http://blog.chinaunix.net/uid-20382483-id-3518513.html QTableView常用于实现数据的表格显示.下面我们如何按步骤实现学生信息表格: 一 添加表头 //准备数据模型     QStandardItemModel *student_model = new QStandardItemModel();     student_model->setHorizontalHeaderItem(0, new QStandardItem(QOb

Qt QTableview的用法详解

本文转自http://www.360doc.com/content/14/0210/11/3300331_351302235.shtml 一. 对QTableWidget本身的效果实现 1. 将表格变为禁止编辑 在默认情况下,表格里的字符是可以更改的,比如双击一个单元格,就可以修改原来的内容,如果想禁止用户的这种操作,让这个表格对用户只读,可以这样: tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); QAbstrac

Qt:QT右键菜单

Qt QTableView 上加右键弹出菜单, 并复制选中的单元格内容到剪贴板中 http://wenku.baidu.com/view/c51cfb63cf84b9d528ea7a29.html http://www.cppblog.com/biao/archive/2010/01/01/104593.html QWidget及其子类都可有右键菜单,因为QWidget有以下两个与右键菜单有关的函数: Qt::ContextMenuPolicy contextMenuPolicy () cons

QTableView中修改某个单元格或者行或者列内容颜色

QTableView的单元格内容实现还是继承了TableViewModel类的data(const QModelIndex &index, int role) const函数,那个设置颜色的问题也就在这个里面实现了. 1.设置某个单元格颜色 1 QVariant TableViewModel::data(const QModelIndex &index, int role) const 2 { 3 if (!index.isValid()) 4 return QVariant(); 5 i

Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等

目录 一.概述 二.效果展示 三.定制表头 1.重写数据源 2.重写QHeaderView 四.设置属性 五.相关文章 原文链接:Qt实现表格控件-支持多级列表头.多级行表头.单元格合并.字体设置等 一.概述 最近在研究QTableView支持多级表头的事情,百度了下网上资料还是挺多的.实现的方式总的来说有2种,效果都还不错,最主要是搞懂其中的原理,做到以不变应万变. 实现多级表头的方式有以下两种方案 行表头和列表头都是用一个表格去模拟 重写QHeadView 以上两种方式都可以实现多级表头,各

Qt之右键菜单

所谓“右键菜单”,我们可以这样来看:右键+菜单.所以我们可以定义一个菜单,然后重写鼠标点击事件,令菜单在鼠标右击的时候弹出来.这种方法是可以的,但是Qt提供了一种专门用于右键菜单的方法,且看下面这个属性: Qt::ContextMenuPolicy 通过函数setContextMenuPolicy()来设置一个widget上面显示的菜单的属性. 1.Qt::DefaultContextMenu 这个属性的默认值是Qt::DefaultContextMenu,此时需要调用函数contextMenu

Qt之QAbstractItemView右键菜单

一.功能概述 说起右键菜单,之前Qt之自定义QLineEdit右键菜单这篇文章中我已经讲述过3种右键菜单的实现方式,今儿也是在啰嗦一下,针对QListWidget类在定制一下右键菜单,我使用的具体方式呢,是直接重写了contextMenuEvent方法,在这个方法中弹出右键菜单. 二.效果展示 如图1是针对QListWidget定制的右键菜单,美观程度一般,但是功能基本实现 图1 QListWidget右键菜单 三.代码讲解 右键菜单在相关文章小节中我已经给出了一些文章,关于右键菜单的弹出逻辑我

qt QTreeWidget右键菜单函数,以备自己翻阅

QModelIndex index=ui.tree_FileLocal->indexAt(pos);    QMenu *pMenu=new QMenu(ui.tree_FileLocal);    if (ui.tree_FileLocal->columnCount()==7)    {        QAction *refresh=pMenu->addAction(tr("刷新(&Y)"));        refresh->setShortcut