欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt GUI圖形圖像開(kāi)發(fā)之QT表格控件QTableView詳細(xì)使用方法與實(shí)例

 更新時(shí)間:2020年03月13日 08:52:41   作者:嚇人的猿  
這篇文章主要介紹了Qt GUI圖形圖像開(kāi)發(fā)之QT表格控件QTableView詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下

QT表格控件QTableView簡(jiǎn)介

​ 表格視圖控件QTableView,需要和QStandardItemModel, 配套使用,這套框架是基于MVC設(shè)計(jì)模式設(shè)計(jì)的,M(Model)是QStandardItemModel數(shù)據(jù)模型,不能單獨(dú)顯示出來(lái)。V(view)是指QTableView視圖,要來(lái)顯示數(shù)據(jù)模型,C(controllor)控制在Qt中被弱化,與View合并到一起。

QTableView簡(jiǎn)單使用實(shí)例

​ QStandardItmeModel表格的數(shù)據(jù)模型,那么這個(gè)模型需要填上每一行每一列的數(shù)據(jù),就像execl表格一樣。

widget.h

#ifndef WIDGET_H
#define WIDGET_H
​
#include <QTableView>
​
class Widget : public QTableView //繼承至QTableView
{
    Q_OBJECT
​
public:
    Widget(QWidget *parent = 0);
    ~Widget();
};
​
#endif // WIDGET_H

​widget.cpp

#include "widget.h"
#include <QStandardItemModel>
#include <QDebug>
Widget::Widget(QWidget *parent)
   : QTableView(parent)
{
   QStandardItemModel* model = new QStandardItemModel(this);
   model->setItem(0, 0, new QStandardItem("張三")); 
   model->setItem(0, 1, new QStandardItem("3"));
   model->setItem(0, 2, new QStandardItem("男"));
   this->setModel(model);
}
​
Widget::~Widget()
{
​
}

​ 以上代碼實(shí)現(xiàn)了在model中添加一條數(shù)據(jù),然后通過(guò)setModel函數(shù)設(shè)置view的數(shù)據(jù)模型為model,顯示出來(lái),如圖:

QTableView修改行列字段名

​修改字段名可以使用QStandardItemModel::setHeaderData,但是在這之前你需要調(diào)用QStandardItemModel::setColumnCountQStandardItemModel::setRowCount,例如:

Widget::Widget(QWidget *parent)
   : QTableView(parent)
{
   QStandardItemModel* model = new QStandardItemModel(this);
   /*設(shè)置列字段名*/
   model->setColumnCount(3);
   model->setHeaderData(0,Qt::Horizontal, "姓名");
   model->setHeaderData(1,Qt::Horizontal, "年齡");
   model->setHeaderData(2,Qt::Horizontal, "性別");
​
   /*設(shè)置行字段名*/
   model->setRowCount(3);
   model->setHeaderData(0,Qt::Vertical, "記錄一");
   model->setHeaderData(1,Qt::Vertical, "記錄二");
   model->setHeaderData(2,Qt::Vertical, "記錄三");   
      
   /*設(shè)置一條數(shù)據(jù)*/   
   model->setItem(0, 0, new QStandardItem("張三"));
   model->setItem(0, 1, new QStandardItem("3"));
   model->setItem(0, 2, new QStandardItem("男"));
   this->setModel(model);
}

QTableView移除數(shù)據(jù)

​ 移除數(shù)據(jù)的常用函數(shù)有:

/*移除某行數(shù)據(jù)*/
bool QAbstractItemModel::removeRow(int row, const QModelIndex &parent = QModelIndex()) 
/*移除某列數(shù)據(jù)*/
bool QAbstractItemModel::removeColumn(int column, const QModelIndex &parent = QModelIndex())

例如:

model->removeRow(0);//移除第0行數(shù)據(jù)
model->removeColumn(0);//移除第0列數(shù)據(jù)

QTableView插入數(shù)據(jù)

插入一行數(shù)據(jù)

void QStandardItemModel::insertRow(int row, const QList<QStandardItem *> &items)
/*
* row 表示從第幾行插入數(shù)據(jù)
* items 表示要插入的數(shù)據(jù)QStandardItem對(duì)象
*/

例如:

QList<QStandardItem*> list;
list << new QStandardItem("王五") << new QStandardItem("22") << new QStandardItem("男");
model->insertRow(0, list); //在第0行插入一條記錄

QTableView數(shù)據(jù)變更信號(hào)處理

[signal] void QAbstractItemModel::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int> ());
​
/*
*topLeft bottomRight這兩索引指的是表格中被更改數(shù)據(jù)的區(qū)域,如果只有一個(gè)數(shù)據(jù)被更改,那么topLeft等于bottomRight
*/

例如:

widget.h

#ifndef WIDGET_H
#define WIDGET_H
​
#include <QTableView>
class QStandardItemModel;
class Widget : public QTableView
{
    Q_OBJECT
public slots:
    void dataChangedSlot(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int> ());
public:
    Widget(QWidget *parent = 0);
    QStandardItemModel* _model;
    ~Widget();
};
​
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include <QStandardItemModel>
#include <QDebug>
Widget::Widget(QWidget *parent)
   : QTableView(parent)
{
   _model = new QStandardItemModel(this);
   _model->setColumnCount(3);
   _model->setHeaderData(0,Qt::Horizontal, "姓名");
   _model->setHeaderData(1,Qt::Horizontal, "年齡");
   _model->setHeaderData(2,Qt::Horizontal, "性別");
​
   _model->setRowCount(3);
   _model->setHeaderData(0,Qt::Vertical, "記錄一");
   _model->setHeaderData(1,Qt::Vertical, "記錄二");
   _model->setHeaderData(2,Qt::Vertical, "記錄三");
​
   _model->setItem(0, 0, new QStandardItem("張三"));
   _model->setItem(0, 1, new QStandardItem("3"));
   _model->setItem(0, 2, new QStandardItem("男"));
​
​
   connect(_model, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)), this, SLOT(dataChangedSlot(QModelIndex,QModelIndex,QVector<int>)));
   this->setModel(_model);
}
​
void Widget::dataChangedSlot(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)
{
    qDebug() << _model->data(topLeft).toString() << endl;
​
}
​
Widget::~Widget()
{
​
}

​需要知道的是函數(shù)data可以獲取想要的QStandardItem對(duì)象的索引:

[pure virtual] QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const

返回的QVariant對(duì)象是一種泛型變量,可以轉(zhuǎn)換成QString、int、double等數(shù)據(jù)類(lèi)型。

QTableView常用函數(shù)

 //默認(rèn)顯示行頭,如果你覺(jué)得不美觀的話(huà),我們可以將隱藏        
tableview->verticalHeader()->hide();      
​
 //設(shè)置選中時(shí)為整行選中        
tableview->setSelectionBehavior(QAbstractItemView::SelectRows);         
   
 //設(shè)置表格的單元為只讀屬性,即不能編輯        
tableview->setEditTriggers(QAbstractItemView::NoEditTriggers);  
​
//返回一個(gè)被選中的所有Item的索引,一般是去遍歷這個(gè)鏈表進(jìn)行處理
[virtual protected] QModelIndexList QTableView::selectedIndexes() const

QStandardItem被點(diǎn)選信號(hào)

​當(dāng)QStandardItemModel中的某個(gè)QStandardItem被點(diǎn)選后,QStandardItemModel對(duì)象會(huì)發(fā)出一個(gè)信號(hào):

void QAbstractItemView::clicked(const QModelIndex &index);
/*
*返回被點(diǎn)選的Item的索引
*/

QItemDelegate代理

​QTableView在處理信息顯示編輯的時(shí)候比較單調(diào),類(lèi)似行編輯器,為了獲得更多的靈性性,交互通過(guò)QItemDelegate執(zhí)行。

​下面通過(guò)派生一個(gè)SpinDelegate來(lái)實(shí)現(xiàn)一個(gè)整數(shù)旋轉(zhuǎn)框的代理器。

​一般我們要重寫(xiě)函數(shù)createEditor:

[virtual] QWidget *QItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
/*
*QWidget *parent一般是指哪個(gè)窗口使用了這個(gè)代理,一般用來(lái)托管內(nèi)存
* QStyleOptionViewItem &option 樣式風(fēng)格
* const QModelIndex &index 需要更改的Item索引
*/

​ spinDelegate.h

#ifndef SPINDELEGATE_H
#define SPINDELEGATE_H
#include <QItemDelegate>
class SpinDelegate : public QItemDelegate
{
public:
    SpinDelegate(QObject *parent = Q_NULLPTR);
    QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
​
#endif // SPINDELEGATE_H

​spinDelegate.cpp

#include "spindelegate.h"
#include <QSpinBox>
SpinDelegate::SpinDelegate(QObject *parent): QItemDelegate(parent)
{
​
}
QWidget* SpinDelegate::createEditor(QWidget *parent
           , const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if(index.column() == 1) // 返回下拉框
   {
       QSpinBox* box = new QSpinBox(parent);
       box->setMinimum(1);
       box->setMaximum(99);
       return box;
   }
    return QItemDelegate::createEditor(parent, option, index);
}

將widget.cpp中的構(gòu)造器中修改如下函數(shù)如下:

Widget::Widget(QWidget *parent)
   : QTableView(parent)
{
   QStandardItemModel* model = new QStandardItemModel(this);
   /*設(shè)置列字段名*/
   model->setColumnCount(3);
   model->setHeaderData(0,Qt::Horizontal, "姓名");
   model->setHeaderData(1,Qt::Horizontal, "年齡");
   model->setHeaderData(2,Qt::Horizontal, "性別");
​
   /*設(shè)置行字段名*/
   model->setRowCount(3);
   model->setHeaderData(0,Qt::Vertical, "記錄一");
   model->setHeaderData(1,Qt::Vertical, "記錄二");
   model->setHeaderData(2,Qt::Vertical, "記錄三");   
      
   /*設(shè)置一條數(shù)據(jù)*/   
   model->setItem(0, 0, new QStandardItem("張三"));
   model->setItem(0, 1, new QStandardItem("3"));
   model->setItem(0, 2, new QStandardItem("男"));
   this->setModel(model);
   /*設(shè)置代理*/
   this->setItemDelegate(new SpinDelegate(this));
}

本文主要講解了QT表格控件QTableView詳細(xì)使用方法與實(shí)例,更多關(guān)于QT表格控件QTableView的使用技巧請(qǐng)查看下面的相關(guān)鏈接

相關(guān)文章

  • C語(yǔ)言中使用fopen()打開(kāi)和操作文件的詳細(xì)方法指南

    C語(yǔ)言中使用fopen()打開(kāi)和操作文件的詳細(xì)方法指南

    fopen是C語(yǔ)言庫(kù)函數(shù),open是系統(tǒng)調(diào)用,mmap是將大文件映射到內(nèi)存中使用,這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中使用fopen()打開(kāi)和操作文件的詳細(xì)方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • Qt中正則表達(dá)式的常見(jiàn)用法(QRegularExpression類(lèi))

    Qt中正則表達(dá)式的常見(jiàn)用法(QRegularExpression類(lèi))

    正則表達(dá)式即一個(gè)文本匹配字符串的一種模式,Qt中使用QRegExp類(lèi)進(jìn)行模式匹配,下面這篇文章主要給大家介紹了關(guān)于Qt中正則表達(dá)式的常見(jiàn)用法,文中介紹的是QRegularExpression類(lèi)的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • C++實(shí)現(xiàn)猜數(shù)游戲

    C++實(shí)現(xiàn)猜數(shù)游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)猜數(shù)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 獲取C語(yǔ)言中int類(lèi)型的最大值的方法小結(jié)

    獲取C語(yǔ)言中int類(lèi)型的最大值的方法小結(jié)

    在C語(yǔ)言中,int?類(lèi)型的大小通常是根據(jù)系統(tǒng)架構(gòu)來(lái)決定的,在大多數(shù)現(xiàn)代系統(tǒng)上,int?通常是32位的,在C語(yǔ)言中,獲取int類(lèi)型的最大值有幾種不同的方法,下面,我們將討論兩種方法:使用標(biāo)準(zhǔn)庫(kù)函數(shù)和使用算法,需要的朋友可以參考下
    2024-06-06
  • windows下用c++獲取本機(jī)ip地址的三種方法

    windows下用c++獲取本機(jī)ip地址的三種方法

    工作過(guò)程中遇到一個(gè)需求,需要獲取本機(jī)ip地址,同時(shí)獲取本機(jī)網(wǎng)絡(luò)連接情況,即網(wǎng)線(xiàn)是否連接,經(jīng)過(guò)多番搜索,本文給大家介紹了3種方案,通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • opencv3/C++繪制幾何圖形實(shí)例

    opencv3/C++繪制幾何圖形實(shí)例

    今天小編就為大家分享一篇opencv3/C++繪制幾何圖形實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • C語(yǔ)言模擬實(shí)現(xiàn)memmove的示例代碼

    C語(yǔ)言模擬實(shí)現(xiàn)memmove的示例代碼

    memmove函數(shù)用于拷貝字節(jié),如果目標(biāo)區(qū)域和源區(qū)域有重疊的話(huà),memmove能夠保證源串在被覆蓋之前將重疊區(qū)域的字節(jié)拷貝到目標(biāo)區(qū)域中,但復(fù)制后源內(nèi)容會(huì)被更改。本文主要介紹了C語(yǔ)言模擬實(shí)現(xiàn)memmove的示例代碼,需要的可以參考一下
    2022-12-12
  • C++超詳細(xì)介紹模板

    C++超詳細(xì)介紹模板

    人們需要編寫(xiě)多個(gè)形式和功能都相似的函數(shù),因此有了函數(shù)模板來(lái)減少重復(fù)勞動(dòng);人們也需要編寫(xiě)多個(gè)形式和功能都相似的類(lèi),于是 C++ 引人了類(lèi)模板的概念,編譯器從類(lèi)模板可以自動(dòng)生成多個(gè)類(lèi),避免了程序員的重復(fù)勞動(dòng)
    2022-07-07
  • C++隨機(jī)數(shù)生成實(shí)例講解

    C++隨機(jī)數(shù)生成實(shí)例講解

    這篇文章主要為大家詳細(xì)介紹了C++隨機(jī)數(shù)生成實(shí)例,如何利用C++來(lái)生成0——N-1之間的隨機(jī)數(shù),感興趣的小伙伴們可以參考一下
    2016-04-04
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)鏈表逆序并輸出

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)鏈表逆序并輸出

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)鏈表逆序并輸出的相關(guān)資料,需要的朋友可以參考下
    2017-04-04

最新評(píng)論