来自  资质荣誉 2019-09-24 17:21 的文章
当前位置: 澳门太阳娱乐手机登录 > 资质荣誉 > 正文

模型视图,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);

 
  • 使模型与视图相分离
  • 模型只要求对外提供标准接口存取数据,没有要求数据如何体现
  • 视图只必要自定义数码的展现格局,无需数据如何组织存款和储蓄
  • 当数码发生变动时,会透超过实际信号通告视图
  • 当客户与视图实行互动时,会透过信号向模型发送交互新闻

/*依据视图里的首先列数据,进行整行大小排序*/ 

在QT中提供了以下三种预订义模型:

 view.sortByColumn(0);

图片 1

 

中间QStandardItemModel的常见子类有:

  /*设置视图能够自动使能排序*/

图片 2

view.setSortingEnabled(true);
  • QAbstractListModel:用来成立一维列表模型
  • QStandardItemModel:用来囤积定制数据的通用模型
  • QAbstractTableModel: 用来成立二维列表模型

 /*安装视图是不是帮助自动滑动*/

常用的视图类等级次序结构,如下所示:

 view.setAutoScroll(bool enable);

图片 3

  

在Qt中,不管模型以如何组织组织数据,都不可能不为各类数据提供不相同的索引值,使得视图能通过索引值做客模型中的具体数目

 

以QTreeView视图为例

 /*安装选中一行后,题目标字体不会加粗*/

    QWidget w;    QFileSystemModel  model(&w);              //定义文件系统模型    QTreeView   treeView(&w);                 //定义树形显示视图    treeView.resize(600,300);    model.setRootPath(QDir::currentPath; //设置根目录    treeView.setModel(&model);          //连接模型与视图    treeView.setRootIndex(model.index(QDir::currentPath;    // setRootInedex():设置树形显示视图的数据索引,以当前目录为根部显示    // QModelIndex index(QDir::currentPath:以当前目录为模型项索引    w.show();
view->horizontalHeader()->setHighlightSections(false);

效果:

 

图片 4

/*设置列宽不可变动*/
view.horizontalHeader()->setResizeMode(QHeaderView::Fixed);

/*设置行宽不可变动*/
view.verticalHeader()->setResizeMode(QHeaderView::Fixed);

其中index()是个重载函数,用来博取QModelIndex索引值,完整的index()函数正如所示:

 

QModelIndex QAbstractItemModel::index ( int row, int column, const QModelIndex & parent = QModelIndex;       //返回指定的row、column、parent引所在的索引值

/*设置顾客挑选情势, NoSelection表示不可能选用表格*/

对此差别的模子视图来讲,row、column、parent的功能如下所示:

 view.setSelectionMode(QAbstractItemView::NoSelection);

图片 5

 

以QFileSystemModel为例:

 /*躲藏垂直标题*/

图片 6

 view.verticalHeader()->hide();

也足以由此index索引值来搜寻数据,以QFileSystemModel模型为例, 与index相关的成员函数有:

 

QIcon     fileIcon ( const QModelIndex & index );    //通过索引值获取文件图标QFileInfo fileInfo ( const QModelIndex & index );    //通过索引值获取文件信息QString   fileName ( const QModelIndex & index ) ;   //通过索引值获取文件名QString   filePath ( const QModelIndex & index ) ;  //通过索引值获取文件路径bool isDir ( const QModelIndex & index ) ;          //通过索引值,判断是否是目录int   columnCount ( const QModelIndex & parent = QModelIndex ; //通过索引值获取当前列数int   rowCount ( const QModelIndex & parent = QModelIndex ; //通过索引值获取行数QModelIndex parent ( const QModelIndex & index ) ; //通过索引值获取其父节点的索引值QVariant  data ( const QModelIndex & index, int role = Qt::DisplayRole ) ;                                                 //通过索引值获取模型数据bool setData ( const QModelIndex & idx, const QVariant & value, int role = Qt::EditRole );                                           //通过索引值设置模型数据

 /*设置客商选用时,只好选中一行*/

其中data ()setData()函数的参数role是模型数据剧中人物

view.setSelectionMode(QAbstractItemView::SingleSelection);

                       //设置选择模式,表示只能选中单个

role数据剧中人物

 

当role值差别期,则呈今后视图上的秘诀也会分化

 view.setSelectionBehavior(QAbstractItemView::SelectRows);

对于role剧中人物,常用的值有:

                      //设置选拔行为,表示只可以接纳一行(也得以设置为列,恐怕单个Item项目)

  • Qt::DisplayRole 0 以文件方式展示数据
  • Qt::DecorationRole 1 将数据作为Logo来装点(QIcon,QPixmap)
  • Qt::EditRole 2 可编制的多寡音讯展现
  • Qt::ToolTipRole 3 作为工具提示显示
  • Qt::StatusTipRole 4 作为气象栏中展现的数额
  • Qt::WhatsThisRole 5 作为增加帮衬音讯栏中显示的多寡
  • Qt::FontRole 6 设置字体
  • Qt::TextAlignmentRole 7 设置模型数据的文件对齐(Qt::AlignmentFlag)
  • Qt::BackgroundRole 8 设置模型数据的背景观
  • Qt::ForegroundRole 9 设置模型数据的前景观,举例字体

 

以QTableView为例

/*设置表格不可编辑*/
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
view.setRowHeight(0,30);               //设置row0(第1行)的高度为30
view.resizeRowsToContents();    //更据当前内容自动调整行距
view.resizeColumnsToContents(); //更据当前内容自动调整列距
    QWidget w;    QTableView view(&w);    QStandardItemModel  model(&w);    view.setModel(&model);          //设置视图的模型    QStandardItem itemA;    /*设置text*/    itemA.setData("A",Qt::DisplayRole);    /*设置图标*/    QPixmap pix(":user.png");    pix = pix.scaled(24,24,Qt::KeepAspectRatio);    itemA.setData(pix,Qt::DecorationRole);    /*设置渐变背景色*/    QLinearGradient  back(0,0,100,30);    back.setColorAt(0,Qt::white);    back.setColorAt(0.5,Qt::green);    back.setColorAt(1,Qt::blue);    itemA.setData(QBrush,Qt::BackgroundRole);    model.setItem(0,0,&itemA);    model.setItem(0,1,new QStandardItem(QIcon,"B"));    model.setItem(1,0,new QStandardItem(QIcon,"C"));    w.show();

 /*禁止难点(撤销QTableView选中后的虚线框)*/ 

效果:

 view.setFocusPolicy(Qt::NoFocus);

图片 7

/*获得鼠标当前位居视图的哪个index地方*/

QTableView详细使用请参照他事他说加以考察:24.QTableView函数运用,右击菜单完成

接下去初阶学习模型视图中的委托

qDebug()<<view.currentIndex().row();  //获取行号,要是为-1,表示无效

qDebug()<<view.currentIndex().column();//获取列号,假诺为-1,表示无效

 

对于QStandardItem的setData()成员 函数的第叁个参数role 是模型数据剧中人物 

当role值区别不经常候,则展现在视图上的方法也会不一致

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

  • Qt::DisplayRole      0         以文件形式显示数据(QString)
  • Qt::DecorationRole       1     将数据作为Logo来点缀(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()),在当下鼠标地方展开菜单

 

效果:

图片 8

 

代码如下

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

 

 

 

本文由澳门太阳娱乐手机登录发布于 资质荣誉,转载请注明出处:模型视图,QTableView函数使用

关键词: