日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Qt中模型/视图结构

發(fā)布時(shí)間:2023/12/29 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt中模型/视图结构 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
8.1 概述
MVC設(shè)計(jì)模式是起源于Smalltalk的一種與用戶界面相關(guān)的設(shè)計(jì)模式。通過使用此模型,可以有效地分離數(shù)據(jù)和用戶界面。MVC設(shè)計(jì)模式包括三個(gè)元素:表示數(shù)據(jù)的模型 (Model)、表示用戶界面的視圖(View)和定義了用戶在界面上的操作控制(Controller)。 與MVC設(shè)計(jì)模式類似,Qt引入了模型/視圖結(jié)構(gòu)用于完成數(shù)據(jù)與界面的分離,即InterView框架。但不同的是,Qt的InterView框架中把視圖和控制部件結(jié)合在一起,使得? 框架更為簡(jiǎn)潔。為了靈活地處理用戶輸入,InterView框架引入了代理(Delegate)。通過使用代理,能夠自定義數(shù)據(jù)條目(item)的顯示和編輯方式。 Qt的模型/視圖結(jié)構(gòu)分為了三種部分:模式(Model)、視圖(View)和代理(Delegate)。其中,模型與數(shù)據(jù)通信,并為了其它部件提供接口;而視圖從模型中獲得用來 引用數(shù)據(jù)條目的模型索引(Model Index)。在視圖中,代理負(fù)責(zé)繪制數(shù)據(jù)條目,當(dāng)編輯條目時(shí),代理和模型直接進(jìn)行通信。模型/視圖/代理之間通過信號(hào)和槽進(jìn)行通信。 它們之間的關(guān)系如下: 數(shù)據(jù)發(fā)生改變時(shí),模型發(fā)出信號(hào)通知視圖。 用戶對(duì)界面進(jìn)行操作,視圖發(fā)生信號(hào)。 代理發(fā)出信號(hào)告知模型和視圖編輯器目前的狀態(tài)。


基本概念 1、模型(Model) InterView框架中的所有模型都基于抽象基類QAbstractItemModel類,此類由QProxyModel、QAbstractListModel、QAbstractTableModel、QAbstractProxyModel、 QDirModel、QFileSystemModel、QHelpContentModel?和?QStandardItemModel類繼承。 2、視圖(View) InterView框架中的所有視圖都基于抽象基類QAbstractItemView類,此類由QColumnView、QHeaderView、QListView、QTableView和QTreeView類繼承。 3、代理(Delegate) InterView框架中的所有代理都基于抽象基類QAbstractItemDelegate類,此類由QItemDelegate?和?QStyledItemDelegate類繼承。
運(yùn)行效果


main.cpp
#include "mainwindow.h" #include <QAbstractItemModel> #include <QAbstractItemView> #include <QItemSelectionModel> #include <QApplication> #include <QDirModel> #include <QTreeView> #include <QListView> #include <QTableView> #include <QSplitter> /* * 新建一個(gè)QDirModel對(duì)象,對(duì)數(shù)據(jù)訪問做準(zhǔn)備,QDirModel的創(chuàng)建還可以設(shè)置過濾器,即只有符合條件的文件或目錄才能被訪問 * QDirModel類繼承自QAbstractItemModel類,為訪問本地文件系統(tǒng)提供數(shù)據(jù)模型,它提供了新建、刪除、創(chuàng)建目錄等一系列與 * 文件操作相關(guān)的函數(shù),此處只是用來顯示本地文件系統(tǒng) * * 新建三種不同的View對(duì)象,以便文件目錄可以以三種不同的方式顯示 * * tree.setModel(&model):調(diào)用setModel()函數(shù)設(shè)置View對(duì)象的Model為QDirModel對(duì)象的model。 * * tree.setSelectionMode (QAbstractItemView::MultiSelection):設(shè)置QTreeView對(duì)象的選擇方式為多選 * *list.setSelectionModel (tree.selectionModel ()):設(shè)置QListView對(duì)象與QTreeView對(duì)象使用相同的選擇類型 * * 為了實(shí)現(xiàn)雙擊QTreeView對(duì)象中的某個(gè)目錄時(shí),QListView對(duì)象和QTableView對(duì)象中顯示此選定目錄下的所有文件和目錄, * 需要鏈接QTreeView對(duì)象的doubleClicked()信號(hào)與QListView對(duì)象和QTableView對(duì)象的setRootIndex()槽函數(shù) */ int main(int argc, char *argv[]) { QApplication a(argc, argv); QDirModel model; QTreeView tree; QListView list; QTableView table; tree.setModel (&model); list.setModel (&model); table.setModel (&model); tree.setSelectionMode (QAbstractItemView::MultiSelection); list.setSelectionModel (tree.selectionModel ()); table.setSelectionModel (tree.selectionModel ()); QObject::connect (&tree, SIGNAL(doubleClicked(QModelIndex)), &list, SLOT(setRootIndex(QModelIndex))); QObject::connect (&tree, SIGNAL(doubleClicked(QModelIndex)), &table, SLOT(setRootIndex(QModelIndex))); QSplitter *spliter = new QSplitter; spliter->addWidget (&tree); spliter->addWidget (&list); spliter->addWidget (&table); spliter->setWindowTitle (QObject::tr ("Model/View")); spliter->show(); return a.exec(); }
8.2 模型(Model) 實(shí)現(xiàn)自定義模型可以通過QAbstractItemModel類繼承,也可以通過QAbstractListModel和QAbstractTableModel類繼承實(shí)現(xiàn)列表模型或表格模型。在數(shù)值代碼保存,然后 通過外鍵關(guān)聯(lián)操作來查找其真實(shí)的含義,這一方法為了避免冗余。
Item主要角色及其描述
常量 描述
Qt::DisplayRole 顯示文字
Qt::DecorationRole 繪制裝飾數(shù)據(jù)(通常是圖標(biāo))
Qt::EditRole 在編輯器中編輯的數(shù)據(jù)
Qt::ToolTipRole 工具提示
Qt::StatusTipRole 狀態(tài)欄提示
Qt::WhatsThisRole What's This文字
Qt::SizeHintRole 尺寸提示
Qt::FontRole 默認(rèn)代理的繪制使用的字體
Qt::TextAlignmentRole 默認(rèn)代理的對(duì)齊方式
Qt::BackgroundRole 默認(rèn)代理的背景畫刷
Qt::ForegroundRole 默認(rèn)代理的前景畫刷
Qt::CheckStateRole 默認(rèn)代理的檢查框狀態(tài)
Qt::UserRole 用戶自定義的數(shù)據(jù)的起始位置

運(yùn)行畫面


modelex.h
#ifndef MODELEX_H #define MODELEX_H #include <QAbstractTableModel> #include <QMap> #include <QVector> #include <QStringList> /* * QMap<Key,T>提供了一個(gè)從類型為Key的鍵到類型為T的值的映射。 * rowCount()、columnCount()、data()和返回表頭數(shù)據(jù)的headerData()函數(shù) * 是QAbstractTableModel類的純數(shù)函數(shù) * * 純虛函數(shù)是一種特殊的虛函數(shù),在許多情況下,在基類中不能對(duì)虛函數(shù)給出有意義的實(shí)現(xiàn), * 而把它聲明為純虛函數(shù),它的實(shí)現(xiàn)留給該基類的派生類去做。這就是純虛函數(shù)的作用 */ class ModelEx : public QAbstractTableModel { public: explicit ModelEx(QObject *parent = 0); virtual int rowCount (const QModelIndex &parent) const; virtual int columnCount (const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData (int section, Qt::Orientation orientation, int role) const; signals: public slots: private: QVector<short> army; //定義一個(gè)短型軍種類型容器 QVector<short> weaponType; //定義一個(gè)短型武器類型容器 QMap<short, QString> armyMap; //定義一個(gè)從short類型的鍵值到類型QString的值得映射 QMap<short, QString> weaponTypeMap; //定義一個(gè)從short類型的鍵值到類型QString的值得映射 QStringList weapon; //定義一個(gè)字符串武器鏈表 QStringList header; //定義一個(gè)頭結(jié)點(diǎn)鏈表 void populateModel(); //完成表格數(shù)據(jù)的初始化填充 }; #endif // MODELEX_H
modelex.cpp
#include "modelex.h" ModelEx::ModelEx(QObject *parent) : QAbstractTableModel(parent) { armyMap[1] = tr("空軍"); armyMap[2] = tr("海軍"); armyMap[3] = tr("陸軍"); armyMap[4] = tr("海軍陸戰(zhàn)隊(duì)"); weaponTypeMap[1] = tr("轟炸機(jī)"); weaponTypeMap[2] = tr("航空母艦"); weaponTypeMap[3] = tr("直升機(jī)"); weaponTypeMap[4] = tr("兩棲攻擊艦"); weaponTypeMap[5] = tr("驅(qū)逐艦"); weaponTypeMap[6] = tr("兩棲戰(zhàn)艦"); weaponTypeMap[7] = tr("坦克"); weaponTypeMap[8] = tr("戰(zhàn)斗機(jī)"); populateModel (); } void ModelEx::populateModel () { header << tr("軍種") << tr("種類") << tr("武器"); army << 1 << 2 << 3 << 4 << 4 << 2 << 3 << 1; weaponType << 1 << 2 << 3 << 4 <<5 << 6 << 7 << 8; weapon << tr("B-2") << tr("尼米茲級(jí)") << tr("阿帕奇") << tr("黃蜂級(jí)") << tr("阿利伯克級(jí)") << tr("AAAV") << tr("MIAI") << ("F-22"); } /* * 返回行 */ int ModelEx::rowCount (const QModelIndex &parent) const { return army.size (); } /* * 返回列 */ int ModelEx::columnCount (const QModelIndex &parent) const { return 3; } /* * QVariant類類似于C++的聯(lián)合(union)數(shù)據(jù)類型,它不僅能夠保存很多Qt類型的值,包括QColor、QBrush、QFont、 * QPen、QRect、QString和QSize等,也能夠存放容器類的值。 * data()函數(shù)返回指定索引的數(shù)據(jù),即將數(shù)值映射為文字 */ QVariant ModelEx::data (const QModelIndex &index, int role) const { if(!index.isValid ()) { return QVariant(); } /*Qt::DisplayRole用來存取視圖中顯示的文字*/ if(role == Qt::DisplayRole) { switch(index.column ()) { case 0: return armyMap[army[index.row ()]]; break; case 1: return weaponTypeMap[weaponType[index.row ()]]; break; case 2: return weapon[index.row ()]; break; default: return QVariant(); break; } } return QVariant(); } /* * headerData()函數(shù)返回固定的表頭數(shù)據(jù),設(shè)置水平表頭的標(biāo)題 */ QVariant ModelEx::headerData (int section, Qt::Orientation orientation, int role) const { if(role == Qt::DisplayRole && orientation == Qt::Horizontal) return header[section]; return QAbstractTableModel::headerData (section, orientation, role); }
main.cpp
#include <QApplication> #include "modelex.h" #include <QTableView> int main(int argc, char *argv[]) { QApplication a(argc, argv); ModelEx modelEx; QTableView view; view.setModel(&modelEx); view.setWindowTitle(QObject::tr("modelEx")); view.resize(400,400); view.show(); return a.exec(); }
8.3 視圖(View) 實(shí)現(xiàn)自定義的View,可繼承自QAbstractItemView類,對(duì)所需的純虛函數(shù)進(jìn)行重定義與實(shí)現(xiàn),對(duì)于QAbstractItemView類中的純虛函數(shù),在子類中必須進(jìn)行重定義, 但不一定要實(shí)現(xiàn),可根據(jù)需要選擇實(shí)現(xiàn)。
顯示結(jié)果


mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QStandardItemModel> #include <QTableView> #include <QMenuBar> #include <QMenu> #include <QAction> #include <QSplitter> #include "histogramview.h" class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); void createAction(); void createMenu(); void setupModel(); void setupView(); void openFile(QString); private: QMenu *fileMenu; QAction *openAct; QStandardItemModel *model; QTableView *table; QSplitter *splitter; HistogramView *histogram; public slots: void slotOpen(); }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h" #include <QFileDialog> #include <QFile> #include <QTextStream> #include <QStringList> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { createAction (); createMenu (); setupModel (); setupView (); setWindowTitle (tr("View Example")); resize(600, 660); } MainWindow::~MainWindow() { } void MainWindow::createAction () { openAct = new QAction(tr("打開"), this); connect (openAct, SIGNAL(triggered(bool)), this, SLOT(slotOpen())); } /* * 創(chuàng)建一個(gè)文件菜單欄 * 將openAct動(dòng)作插入到這個(gè)菜單欄里 */ void MainWindow::createMenu () { fileMenu = new QMenu(tr("文件"), this); fileMenu->addAction(openAct); menuBar ()->addMenu (fileMenu); } void MainWindow::setupModel () { model = new QStandardItemModel(4, 4, this); model->setHeaderData (0, Qt::Horizontal, tr("部門")); model->setHeaderData (1, Qt::Horizontal, tr("男")); model->setHeaderData (2, Qt::Horizontal, tr("女")); model->setHeaderData (3, Qt::Horizontal, tr("退休")); } void MainWindow::setupView () { splitter = new QSplitter; splitter->setOrientation (Qt::Vertical); histogram = new HistogramView(splitter); histogram->setModel (model); table = new QTableView; //新建一個(gè)QTableView對(duì)象 table->setModel (model); //為QTableView對(duì)象設(shè)置相同的Model /*新建一個(gè)QItemSelectModel對(duì)象作為QTableView對(duì)象使用的選擇模型*/ QItemSelectionModel *selectionModel = new QItemSelectionModel(model); table->setSelectionModel (selectionModel); histogram->setSelectionModel (selectionModel); splitter->addWidget (table); splitter->addWidget (histogram); setCentralWidget (splitter); connect (selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), table, SLOT(selectionChanged(QItemSelection,QItemSelection))); connect (selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), histogram, SLOT(selectionChanged(QItemSelection,QItemSelection))); } /* * 打開一個(gè)*.txt文件 * 如果文件非空讀取文件信息 */ void MainWindow::slotOpen () { QString name; name = QFileDialog::getOpenFileName (this, "打開", ".", "histogram files(*.txt)"); if(!name.isEmpty ()) { openFile (name); } } /* * 一行行讀取*.txt文件內(nèi)容,當(dāng)遇到“,”分割數(shù)據(jù) * QFile類提供了一個(gè)接口,用于讀取或?qū)懭胛募?/span> * QTextStream類可以方便地讀取單詞、行和數(shù)字。 * 在循環(huán)中一次讀取文件中的一行數(shù)據(jù),然后插入到表格對(duì)應(yīng)的一行數(shù)據(jù)中 */ void MainWindow::openFile (QString path) { if(!path.isEmpty ()) { QFile file(path); if(file.open (QFile::ReadOnly | QFile::Text)) { QTextStream stream(&file); QString line; /*從文本中移除一行的數(shù)據(jù)*/ model->removeRows (0, model->rowCount (QModelIndex()), QModelIndex()); int row = 0; do { line = stream.readLine (); if(!line.isEmpty ()) { /*設(shè)置一行插入多個(gè)數(shù)據(jù),一次插入一個(gè)數(shù)據(jù)*/ model->insertRows (row, 1, QModelIndex()); QStringList pieces = line.split (",", QString::SkipEmptyParts); /*將數(shù)據(jù)設(shè)置到row行、0、1、2、3列*/ model->setData (model->index (row, 0, QModelIndex()), pieces.value (0)); model->setData (model->index (row, 1, QModelIndex()), pieces.value (1)); model->setData (model->index (row, 2, QModelIndex()), pieces.value (2)); model->setData (model->index (row, 3, QModelIndex()), pieces.value (3)); row++; } }while(!line.isEmpty ()); file.close (); } } }
histogramview.h
#ifndef HISTOGRAMVIEW_H #define HISTOGRAMVIEW_H #include <QAbstractItemView> #include <QItemSelection> #include <QRegion> #include <QMouseEvent> /* * visualRect (),scrollTo (),indexAt (),moveCursor (),horizontalOffset (),verticalOffset () * isIndexHidden (),setSelection ()和visualRegionForSelection ():QAbstractItemView類中的純虛函數(shù) * 這些純虛函數(shù)不一定要實(shí)現(xiàn),可以根據(jù)需要選擇性地實(shí)現(xiàn),但一定要聲明。 * * QModelIndex indexAt(const QPoint &point) const:當(dāng)鼠標(biāo)在視圖中單擊或位置發(fā)生改變時(shí)被觸動(dòng),它返回鼠標(biāo)所 * 在點(diǎn)的QModelIndex值。當(dāng)鼠標(biāo)處在某一個(gè)數(shù)據(jù)項(xiàng)的區(qū)域中,則返回此數(shù)據(jù)項(xiàng)的Index值,否則返回一個(gè)空的Index。 * * void mousePressEvent (QMouseEvent *event):柱狀統(tǒng)計(jì)圖可以被鼠標(biāo)單擊選擇,選中后以不同的方式顯示。 * * selectionChanged (const QItemSelection &selected, const QItemSelection &deselected):當(dāng)數(shù)據(jù)項(xiàng) * 選擇發(fā)生變化時(shí),此槽函數(shù)將響應(yīng)。 * * void dataChanged (const QModelIndex &topLeft, const QModelIndex &bottomRight):當(dāng)模型中的數(shù)據(jù)發(fā)生 * 變更時(shí),此槽函數(shù)將響應(yīng)。 * * void setSelection (const QRect &rect, QItemSelectionModel::SelectionFlags flags):將位于QRect內(nèi) * 的數(shù)據(jù)項(xiàng)按照SelectionFlags(描述被選擇的數(shù)據(jù)項(xiàng)以何種方式進(jìn)行更新)指定的方式進(jìn)行更新。QItemSelectModel類提供 * 多種可用的SelecttionFlags,常用的有QItemSelectModel::Select、QItemSelectModel::Current類。 * * QItemSelectionModel *selections:用于保存與視圖選擇項(xiàng)相關(guān)的內(nèi)容。 * * QList <QRegion> MRegionList:用于保存其中某一類型柱狀圖的區(qū)域范圍,而每個(gè)區(qū)域是QList中的一個(gè)值。 */ class HistogramView : public QAbstractItemView { public: HistogramView(QWidget *parent = 0); QRect visualRect (const QModelIndex &index) const; void scrollTo (const QModelIndex &index, ScrollHint hint=EnsureVisible); QModelIndex indexAt(const QPoint &point) const; //為selecttions賦初值 void setSelectionModel (QItemSelectionModel *selectionModel); QRegion itemRegion(QModelIndex index); void paintEvent (QPaintEvent *); void mousePressEvent (QMouseEvent *event); protected slots: void selectionChanged (const QItemSelection &selected, const QItemSelection &deselected); void dataChanged (const QModelIndex &topLeft, const QModelIndex &bottomRight); protected: QModelIndex moveCursor(QAbstractItemView::CursorAction cursorAction,Qt::KeyboardModifiers modifiers); int horizontalOffset () const; int verticalOffset () const; bool isIndexHidden (const QModelIndex &index) const; void setSelection (const QRect &rect, QItemSelectionModel::SelectionFlags flags); QRegion visualRegionForSelection (const QItemSelection &selection) const; private: QItemSelectionModel *selections; QList <QRegion> MRegionList; QList <QRegion> FRegionList; QList <QRegion> SRegionList; }; #endif // HISTOGRAMVIEW_H

histogramview.cpp
#include "histogramview.h" #include <QPainter> HistogramView::HistogramView(QWidget *parent) :QAbstractItemView(parent) { } //paintEvent()函數(shù)具體完成柱狀統(tǒng)計(jì)圖繪制的工作 void HistogramView::paintEvent (QPaintEvent *) { QPainter painter(viewport ()); //將viewport()作為繪圖設(shè)備新建一個(gè)QPainter對(duì)象 painter.setPen (Qt::black); int x0 = 40; int y0 = 280; //繪制y軸坐標(biāo) painter.drawLine (x0, y0, 40, 18); painter.drawLine (36, 22, 40, 18); painter.drawLine (44, 22, 40, 18); painter.drawText (27, 15, tr("人數(shù)")); for(int i = 0; i <= 5; i++) { painter.drawLine (40, 280 - (5 - i) * 50, 42, 280 - (5 - i) * 50); painter.drawText (25, 285 - (5 - i) * 50, tr("%1").arg ((5 - i) * 5)); } //繪制x軸坐標(biāo) painter.drawLine (x0, y0, 562, 280); painter.drawLine (558, 276, 562, 280); painter.drawLine (558, 284, 562, 280); painter.drawText (567, 285, tr("部門")); // for(int i = 0; i <= 9; i++) // { // painter.drawLine (490 - (8 - i) * 50, 280, 490 - (8 - i) * 50, 278); // painter.drawText (487 - (8 - i) * 50, 295, tr("%1").arg (i + 1)); // } int posD = x0 + 20; int row; //讀取文件中每一行的第一例數(shù)據(jù) for(row = 0; row < model()->rowCount (rootIndex ()); ++row) { QModelIndex index = model()->index (row, 0, rootIndex ()); QString dep = model ()->data (index).toString (); painter.drawText (posD, y0 + 15, dep); posD += 50; } /*完成了表格第1列數(shù)據(jù)的柱狀統(tǒng)計(jì)圖的繪制*/ //男 int posM = x0 + 20; for(row = 0; row < model()->rowCount (rootIndex ()); row++) { QModelIndex index=model()->index(row,1,rootIndex()); int male=model()->data(index).toDouble(); int width = 10; //使用不同畫刷顏色區(qū)別選中與未選中的數(shù)據(jù)項(xiàng) if(selections->isSelected(index)) painter.setBrush(QBrush(Qt::blue,Qt::Dense3Pattern)); else painter.setBrush(Qt::blue); //繪制長(zhǎng)方形條x,y,w,h painter.drawRect(QRect(posM, y0 - male * 10, width, male * 10)); QRegion regionM(posM, y0 - male * 10, width, male * 10); //將此數(shù)據(jù)所占據(jù)的區(qū)域保存到MRegionList列表中,為后面的數(shù)據(jù)項(xiàng)選擇做準(zhǔn)備。 MRegionList << regionM; posM += 50; } /*完成了表格第2列數(shù)據(jù)的柱狀統(tǒng)計(jì)圖的繪制*/ //女條目框 int posF = x0 + 30; for(row = 0; row < model()->rowCount (rootIndex ()); ++row) { QModelIndex index = model()->index (row, 2, rootIndex ()); int female = model()->data (index).toDouble (); int width = 10; if(selections->isSelected (index)) painter.setBrush (QBrush(Qt::red, Qt::Dense3Pattern)); else painter.setBrush (Qt::red); //繪制長(zhǎng)方形x,y,w,h painter.drawRect (QRect(posF, y0 - female * 10, width, female * 10)); QRegion regionF(posF, y0 - female * 10, width, female * 10); //將此數(shù)據(jù)所占據(jù)的區(qū)域保存到FRegionList列表中,為后面的數(shù)據(jù)項(xiàng)選擇做準(zhǔn)備。 FRegionList << regionF; posF += 50; } /*完成了表格第3列數(shù)據(jù)的柱狀統(tǒng)計(jì)圖的繪制*/ //退休條目框 int posS = x0 + 40; for(row = 0; row < model()->rowCount (rootIndex ()); ++row) { QModelIndex index = model ()->index (row, 3, rootIndex ()); int retire = model()->data (index).toDouble (); int width = 10; if(selections->isSelected (index)) painter.setBrush (QBrush(Qt::green, Qt::Dense3Pattern)); else painter.setBrush (Qt::green); //繪制長(zhǎng)方形x,y,w,h painter.drawRect (QRect(posS, y0 - retire * 10, width, retire * 10)); QRegion regionS(posS, y0 - retire * 10, width, retire * 10); SRegionList << regionS; posS += 50; } } /* * dataChanged()函數(shù)實(shí)現(xiàn)當(dāng)Model中的數(shù)據(jù)改變時(shí),調(diào)用繪圖設(shè)備的update()函數(shù)進(jìn)行更新,反應(yīng)數(shù)據(jù)的變化 */ void HistogramView::dataChanged (const QModelIndex &topLeft, const QModelIndex &bottomRight) { QAbstractItemView::dataChanged (topLeft, bottomRight); viewport ()->update (); } /* * 設(shè)置選擇模式,至此View已經(jīng)能正確顯示表格的統(tǒng)計(jì)數(shù)據(jù),而且對(duì)表格中的某個(gè)數(shù)據(jù)項(xiàng)進(jìn)行修改時(shí)能夠及時(shí)顯示將變化反應(yīng)在柱狀統(tǒng)計(jì)圖中 */ void HistogramView::setSelectionModel (QItemSelectionModel *selectionModel) { selections = selectionModel; } /* * 完成當(dāng)數(shù)據(jù)項(xiàng)發(fā)生變化時(shí)調(diào)用update()函數(shù),重繪繪圖設(shè)備即可工作。此函數(shù)是將其他View中的操作引起的數(shù)據(jù)項(xiàng)選擇變化放映到自身 * View的顯示中。 */ void HistogramView::selectionChanged (const QItemSelection &selected, const QItemSelection &deselected) { viewport ()->update (); } /* * 在調(diào)用setSelection()函數(shù)確定鼠標(biāo)單擊點(diǎn)是否在某個(gè)數(shù)據(jù)項(xiàng)的區(qū)域內(nèi),并設(shè)置選擇項(xiàng) */ void HistogramView::mousePressEvent (QMouseEvent *event) { QAbstractItemView::mousePressEvent (event); setSelection (QRect(event->pos().x (), event->pos().y (), 1, 1), QItemSelectionModel::SelectCurrent); } /* * QModelIndex selectIndex:用于保存被選中的數(shù)據(jù)項(xiàng)的Index值。此處只實(shí)現(xiàn)用鼠標(biāo)單擊選擇,而沒有實(shí)現(xiàn)鼠標(biāo)拖曳框選,因此,鼠標(biāo) * 動(dòng)作只可能選中一個(gè)數(shù)據(jù)項(xiàng)。 * * for循環(huán)里面:確定在rect中是否含有數(shù)據(jù)項(xiàng)。此處采用遍歷的方式將每個(gè)數(shù)據(jù)項(xiàng)的區(qū)域與rect區(qū)域進(jìn)行intersected操作,獲得兩者之間的 * 交集。若此交集不為空則說明此數(shù)據(jù)項(xiàng)被選中,將它的Index值賦給selectIndex。 * * QRegion region = itemRegion (index):返回指定index的數(shù)據(jù)項(xiàng)所占用的區(qū)域 * * 完成select()函數(shù)的調(diào)用,即完成最后對(duì)選擇項(xiàng)的設(shè)置工作。select()函數(shù)時(shí)在實(shí)現(xiàn)setSelection()函數(shù)的調(diào)用,即完成最后對(duì)選擇項(xiàng)的 * 設(shè)置。select()函數(shù)是在實(shí)現(xiàn)setSelection()函數(shù)時(shí)必須調(diào)用的。 */ void HistogramView::setSelection (const QRect &rect, QItemSelectionModel::SelectionFlags flags) { int rows = model()->rowCount (rootIndex ()); //獲得總行數(shù) int columns = model()->columnCount (rootIndex()); //獲得總列數(shù) QModelIndex selectedIndex; for(int row = 0; row < rows; ++row) { for(int column = 1; column < columns; ++column) { QModelIndex index = model()->index (row, column, rootIndex ()); QRegion region = itemRegion (index); if(!region.intersected (rect).isEmpty ()) selectedIndex = index; } } if(selectedIndex.isValid ()) selections->select (selectedIndex, flags); else { QModelIndex noIndex; selections->select (noIndex, flags); } } QModelIndex HistogramView::indexAt (const QPoint &point) const { QPoint newPoint(point.x (), point.y ()); QRegion region; //男列 foreach(region, MRegionList) { if(region.contains (newPoint)) { int row = MRegionList.indexOf (region); QModelIndex index = model()->index (row, 1, rootIndex ()); return index; } } //女列 foreach (region, FRegionList) { if(region.contains (newPoint)) { int row = FRegionList.indexOf (region); QModelIndex index = model ()->index (row, 2, rootIndex ()); return index; } } //合計(jì)列 foreach(region, SRegionList) { if(region.contains (newPoint)) { int row = SRegionList.indexOf (region); QModelIndex index = model()->index (row, 3, rootIndex ()); return index; } } return QModelIndex(); } QRegion HistogramView::itemRegion (QModelIndex index) { QRegion region; if(index.column () == 1) //男 region = MRegionList[index.row ()]; if(index.column () == 2) //女 region = FRegionList[index.row ()]; if(index.column () == 3) region = SRegionList[index.row ()]; return region; } QRect HistogramView::visualRect(const QModelIndex &index)const{} void HistogramView::scrollTo(const QModelIndex &index,ScrollHint){} QModelIndex HistogramView::moveCursor(QAbstractItemView::CursorAction cursorAction, Qt::KeyboardModifiers modifiers){} int HistogramView::horizontalOffset()const{} int HistogramView::verticalOffset()const{} bool HistogramView::isIndexHidden(const QModelIndex &index)const{} QRegion HistogramView::visualRegionForSelection(const QItemSelection &selection)const{}
8.4代理(Dlegate) 在表格中嵌入各種不同控件,通過表格中的控件對(duì)編輯的內(nèi)容進(jìn)行限定。通常情況下,這種在表格中插入空間的方式,空間始終顯示。在表格中控件數(shù)目較多時(shí),將 影響表格的美觀。此時(shí),可利用Delegate的方式實(shí)現(xiàn)同樣的效果,控件只有在需要編輯數(shù)據(jù)項(xiàng)時(shí)才會(huì)顯示,從而解決了上述所遇到的問題。 運(yùn)行效果如下:

main.cpp
#include "mainwindow.h" #include <QApplication> #include <QStandardItemModel> #include <QFile> #include <QTextStream> #include <QTableView> #include "datedelegate.h" #include "combodelegate.h" #include "spindelegate.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); /*定義一個(gè)4*4的表格對(duì)象*/ QStandardItemModel model(4, 4); QTableView tableView; tableView.setModel (&model); DateDelegate dateDelegate; tableView.setItemDelegateForColumn (1, &dateDelegate); ComboDelegate comboDelegate; tableView.setItemDelegateForColumn (2, &comboDelegate); SpinDelegate spinDelegate; tableView.setItemDelegateForColumn (3, &spinDelegate); model.setHeaderData (0, Qt::Horizontal, QObject::tr("姓名")); model.setHeaderData (1, Qt::Horizontal, QObject::tr ("生日")); model.setHeaderData (2, Qt::Horizontal, QObject::tr("職業(yè)")); model.setHeaderData (3, Qt::Horizontal, QObject::tr("收入")); QFile file("test.txt"); if(file.open (QFile::ReadOnly | QFile::Text)) { QTextStream stream(&file); QString line; model.removeRows (0, model.rowCount (QModelIndex()), QModelIndex()); int row = 0; do{ line = stream.readLine (); if(!line.isEmpty ()) { /*一次插入一行數(shù)據(jù),每次插入一個(gè)數(shù)據(jù)*/ model.insertRows (row, 1, QModelIndex()); /*當(dāng)遇到”,“跳過該項(xiàng),將數(shù)據(jù)插入pieces鏈表中*/ QStringList pieces = line.split (",", QString::SkipEmptyParts); model.setData (model.index (row, 0, QModelIndex()), pieces.value(0)); model.setData (model.index (row, 1, QModelIndex()), pieces.value (1)); model.setData (model.index (row, 2, QModelIndex()), pieces.value (2)); model.setData (model.index (row, 3, QModelIndex()), pieces.value (3)); row++; } }while(!line.isEmpty ()); file.close (); } tableView.setWindowTitle (QObject::tr ("Delegate")); tableView.resize (450, 250); tableView.show(); return a.exec(); }
combodelegate.h
#ifndef COMBODELEGATE_H #define COMBODELEGATE_H #include <QItemDelegate> #include <QWidget> class ComboDelegate : public QItemDelegate { public: ComboDelegate(QObject *parent = 0); QWidget *createEditor (QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; void setEditorData (QWidget *editor, const QModelIndex &index) const; void setModelData (QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; void updateEditorGeometry (QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; #endif // COMBODELEGATE_H

combodelegate.cpp
#include "combodelegate.h" #include <QComboBox> ComboDelegate::ComboDelegate(QObject *parent) : QItemDelegate(parent) { } /* * createEditor()函數(shù)中創(chuàng)建了一個(gè)QComboBox控件,并插入可現(xiàn)實(shí)的條目,安裝事件過濾器。 */ QWidget *ComboDelegate::createEditor (QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { QComboBox *editor = new QComboBox(parent); editor->addItem (tr("工人")); editor->addItem (tr("農(nóng)民")); editor->addItem (tr("醫(yī)生")); editor->addItem (tr("律師")); editor->addItem (tr("軍人")); editor->installEventFilter (const_cast<ComboDelegate*>(this)); return editor; } /* * 更新代理控件中的數(shù)據(jù)顯示 */ void ComboDelegate::setEditorData (QWidget *editor, const QModelIndex &index) const { QString str = index.model ()->data (index).toString (); QComboBox *box = static_cast<QComboBox*>(editor); int i = box->findText (str); box->setCurrentIndex (i); } /* * 更新model中的數(shù)據(jù) */ void ComboDelegate::setModelData (QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QComboBox *box = static_cast<QComboBox*>(editor); QString str = box->currentText (); model->setData (index, str); } void ComboDelegate::updateEditorGeometry (QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { editor->setGeometry (option.rect); }
datedelegate.h
#ifndef DATEDELEGATE_H #define DATEDELEGATE_H #include <QItemDelegate> #include <QWidget> class DateDelegate : public QItemDelegate { public: DateDelegate(QObject *parent = 0); QWidget *createEditor (QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; void setEditorData (QWidget *editor, const QModelIndex &index) const; void setModelData (QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; void updateEditorGeometry (QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; #endif // DATEDELEGATE_H

datedelegate.cpp
#include "datedelegate.h" #include <QDateTimeEdit> DateDelegate::DateDelegate(QObject *parent) : QItemDelegate(parent) { } /* * 完成創(chuàng)建控件的工作,創(chuàng)建由參數(shù)中的QModelIndex對(duì)象指定的表項(xiàng)數(shù)據(jù)的編輯控件,并對(duì)控件的內(nèi)容進(jìn)行設(shè)定 * * 新建一個(gè)QDateTimeEdit對(duì)象作為編輯時(shí)的輸入控件 * 設(shè)置此QDateTimeEdit對(duì)象的顯示格式為yyyy-MM-dd,此為ISO標(biāo)準(zhǔn)顯示方式 * 設(shè)置日歷選擇的顯示以Popup的方式,即下拉菜單的方式顯示 * 調(diào)用QObject類的installEventFilter()函數(shù)安裝事件過濾器,使DateDelegate能夠捕獲QDateTimeEdit對(duì)象的事件 */ QWidget *DateDelegate::createEditor (QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { QDateTimeEdit *editor = new QDateTimeEdit(parent); editor->setDisplayFormat ("yyyy-MM-dd"); editor->setCalendarPopup (true); editor->installEventFilter (const_cast<DateDelegate*>(this)); return editor; } /* * QString dataStr = index.model ()->data (index).toString (): 獲取指定index數(shù)據(jù)項(xiàng)的數(shù)據(jù),調(diào)用QModelIndex的 * model()函數(shù)可獲得提供index的Model對(duì)象,data()函數(shù)返回的是一個(gè)QVariant對(duì)象,toString()函數(shù)將它轉(zhuǎn)換為一個(gè)QString類型數(shù)據(jù) * * 通過QDate的fromString()函數(shù)將以QString類型表示的日期數(shù)據(jù)轉(zhuǎn)換為QDate類型。Qt::ISODate表示QDate類型的日期是以ISO格式 * 保存的,這樣最終轉(zhuǎn)換得的QDate數(shù)據(jù)也是ISO格式,使控件顯示與表格顯示保持一致。 * * QDateTimeEdit *edit = static_cast<QDateTimeEdit*>(editor):將editor裝換為QDateTimeEdit對(duì)象,以獲得編輯控件的 * 對(duì)象指針。 */ void DateDelegate::setEditorData (QWidget *editor, const QModelIndex &index) const { QString dataStr = index.model ()->data (index).toString (); QDate date = QDate::fromString (dataStr, Qt::ISODate); QDateTimeEdit *edit = static_cast<QDateTimeEdit*>(editor); edit->setDate (date); } /* * static_cast<QDateTimeEdit*>(editor):通過緊縮轉(zhuǎn)換獲得編輯控件的對(duì)象指針 * QDate date = edit->date ():獲得編輯控件中的數(shù)據(jù)更新 * model->setData (index, QVariant(date.toString (Qt::ISODate))): 調(diào)用setData()函數(shù) * 將數(shù)據(jù)修改更新到Model中。 * */ void DateDelegate::setModelData (QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QDateTimeEdit *edit = static_cast<QDateTimeEdit*>(editor); QDate date = edit->date (); model->setData (index, QVariant(date.toString (Qt::ISODate))); } void DateDelegate::updateEditorGeometry (QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { editor->setGeometry (option.rect); }
spindelegate.h
#ifndef SPINDELEGATE_H #define SPINDELEGATE_H #include <QItemDelegate> class SpinDelegate : public QItemDelegate { public: SpinDelegate(QObject *parent = 0); QWidget *createEditor (QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; void setEditorData (QWidget *editor, const QModelIndex &index) const; void setModelData (QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; void updateEditorGeometry (QWidget *editor, 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 { QSpinBox *editor = new QSpinBox(parent); editor->setRange (0, 10000); editor->installEventFilter (const_cast<SpinDelegate*>(this)); return editor; } void SpinDelegate::setEditorData (QWidget *editor, const QModelIndex &index) const { int value = index.model ()->data (index).toInt (); QSpinBox *box = static_cast<QSpinBox*>(editor); box->setValue (value); } void SpinDelegate::setModelData (QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QSpinBox *box = static_cast<QSpinBox*>(editor); int value = box->value (); model->setData (index, value); } void SpinDelegate::updateEditorGeometry (QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { editor->setGeometry (option.rect); }

總結(jié)

以上是生活随笔為你收集整理的Qt中模型/视图结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

av视屏在线| 婷婷四房综合激情五月 | 亚洲爽爽网 | 激情深爱五月 | 亚洲美女久久 | 婷婷伊人五月 | 久草在线在线视频 | 成人一区二区在线观看 | 国产午夜精品一区二区三区在线观看 | 综合久久网站 | 91资源在线 | 亚洲精品日韩av | 亚洲国产av精品毛片鲁大师 | 91亚洲综合| 亚洲年轻女教师毛茸茸 | 国产成人一区二区三区久久精品 | 亚洲欧洲国产视频 | 色综合天天狠天天透天天伊人 | 韩国精品视频在线观看 | 午夜精品一区二区三区可下载 | 色偷偷中文字幕 | 国产麻豆视频免费观看 | 超级碰碰碰视频 | 久久久久久毛片精品免费不卡 | 国产午夜三级一区二区三桃花影视 | 婷婷av在线| 免费欧美精品 | 欧美日韩高清在线 | 成人小视频在线 | 三级黄色网络 | 亚洲综合在线五月天 | 三日本三级少妇三级99 | 日韩精品一区二区在线观看视频 | 国产视频在线免费观看 | 在线精品视频在线观看高清 | 亚州精品视频 | 久久人人97超碰精品888 | 亚洲免费一级电影 | 手机av片| 黄色免费观看视频 | 亚洲精品视频中文字幕 | 人人干人人做 | 热精品 | 国产精品久久精品国产 | 欧美精品久久天天躁 | 超碰在线观看99 | 精品一区二区三区在线播放 | 中文字幕国产视频 | 免费黄色av | 国产视频精品在线 | 日日夜夜天天射 | 天天摸日日摸人人看 | 黄色网www| 在线免费黄色片 | 久久精品视频4 | 九九有精品 | 美女精品久久久 | 中文字幕日韩在线播放 | 在线看国产日韩 | 亚洲激情p| 欧美精品中文在线免费观看 | 在线免费观看的av网站 | 视频一区亚洲 | 综合色婷婷 | 亚洲japanese制服美女 | 成人三级网址 | 亚洲综合在线播放 | 欧美综合久久久 | 国产成人综合图片 | 9999精品免费视频 | 精品国内自产拍在线观看视频 | 国产高清免费在线观看 | 91精品视频观看 | 999电影免费在线观看 | www.狠狠干 | 精品久久视频 | 国产真实精品久久二三区 | 欧美一区二区三区激情视频 | 国产资源精品在线观看 | 成人午夜久久 | 91成人观看 | 久久久精品国产免费观看一区二区 | 亚洲精品久久久久久国 | 亚洲天天 | 九九视频网站 | 国内精品久久久 | 久久在线视频精品 | 五月婷丁香网 | av福利免费| 精品国产乱码久久久久久1区2匹 | 日韩高清观看 | 中文字幕在线观看网 | 欧美性久久久 | 91视频免费看网站 | 久久免费视频6 | 97在线观看视频国产 | 97色se | 涩涩网站在线播放 | 国产精品久久久久久爽爽爽 | 日本三级在线观看中文字 | 狠狠狠干| 久久久久久久久久久成人 | 日韩极品视频在线观看 | 中文免费 | 天天操天天综合网 | 天天天天天干 | 国产剧情在线一区 | 久久久久久网址 | 国产在线va | 国产黄色片久久久 | 国产精品国产三级国产不产一地 | 久久99久久99精品免观看软件 | 天天干亚洲 | 亚洲片在线资源 | 久久99视频 | 国产啊v在线观看 | 日韩大片免费观看 | 国产色就色 | 青青五月天| 麻豆传媒视频观看 | 四虎永久网站 | 四川bbb搡bbb爽爽视频 | 天天天干夜夜夜操 | 国产亚洲视频在线 | 国产精品中文字幕在线观看 | 亚洲午夜精品久久久 | 最近中文字幕第一页 | 免费看三级黄色片 | 在线观看av麻豆 | 国产中文字幕一区 | 五月婷婷视频在线观看 | 午夜视频在线观看一区 | 三级av在线免费观看 | 久久男人中文字幕资源站 | 人人澡人人澡人人 | 国产va精品免费观看 | 超级碰99 | 六月丁香综合网 | 国产精品一区二区在线观看免费 | 97超级碰| 久久草在线精品 | 亚洲激情在线播放 | 久久99精品国产99久久6尤 | 成人在线视 | 欧美精品亚洲精品日韩精品 | 欧美精品久久久久久久久久白贞 | 日韩在线高清免费视频 | 日本性高潮视频 | 天堂视频中文在线 | 国产成人精品网站 | 人人爱人人爽 | 婷婷.com| 日韩a在线 | 欧美日韩高清在线 | 亚洲国产日本 | 江苏妇搡bbbb搡bbbb | 国产高清中文字幕 | 日韩va欧美va亚洲va久久 | 中文字幕在线字幕中文 | 成人黄色在线播放 | 国产色婷婷在线 | 在线视频欧美精品 | 91在线播放视频 | 亚洲一区二区精品在线 | a亚洲视频 | 国产精品人成电影在线观看 | 国产人免费人成免费视频 | 亚洲精品资源在线 | 亚洲永久av| 国产视频中文字幕在线观看 | 中文字幕在线观看日本 | 亚洲 欧美 另类人妖 | 天天操福利视频 | 在线免费观看视频a | 免费观看一级 | 国产精品你懂的在线观看 | 精品一区二区免费在线观看 | 国产精品免费观看视频 | 欧美日韩中文在线观看 | 国产福利免费看 | 韩日电影在线 | 国产中文字幕在线视频 | 久久激情视频 久久 | 亚洲成人精品国产 | 人人揉人人揉人人揉人人揉97 | 久久久国产一区二区三区四区小说 | 97国产大学生情侣酒店的特点 | 91免费黄视频 | 国产传媒中文字幕 | 国产第一页在线观看 | 97视频免费播放 | 99riav1国产精品视频 | 国产人成一区二区三区影院 | 日韩精品一区二区久久 | 色婷婷婷 | 99电影456麻豆| 午夜国产在线观看 | 中文欧美字幕免费 | 国产精品剧情 | 久久久99精品免费观看 | 人人看97 | 成人a级黄色片 | 久久亚洲日本 | 久草视频免费看 | 婷婷精品| 久操视频在线免费看 | 91久久精 | 麻豆视频入口 | 久草精品视频在线观看 | 久久久www成人免费毛片麻豆 | 91在线视频免费观看 | 日韩高清在线一区二区三区 | 欧美日韩中文字幕视频 | 亚洲激情中文 | 最近能播放的中文字幕 | 99久久久久久久久久 | 亚洲www天堂com | 欧美在线99| 精品亚洲男同gayvideo网站 | 日韩视频一区二区三区在线播放免费观看 | 久草视频免费播放 | 伊人伊成久久人综合网小说 | 欧美在线1| 成人午夜剧场在线观看 | 国产免费一区二区三区最新6 | 激情欧美一区二区三区 | 99热在 | 在线亚洲午夜片av大片 | 黄色日批网站 | 在线免费色视频 | 一区二区三区中文字幕在线观看 | 在线免费看片 | 毛片一区二区 | 欧美久久电影 | 国产视频1| 麻豆手机在线 | 亚洲成av人影院 | 欧美最爽乱淫视频播放 | 亚洲国产精品激情在线观看 | 中文字幕亚洲五码 | 毛片二区| 一级性av | 国产伦理久久 | 国产精品97| 六月丁香在线观看 | 日韩天堂在线观看 | 91色九色 | 久久午夜国产精品 | 久久精品超碰 | 精品在线观看视频 | 久久综合久久久 | 色狠狠综合天天综合综合 | 亚洲国产偷 | 人人揉人人揉人人揉人人揉97 | 免费黄在线观看 | 免费视频黄色 | 色多多视频在线 | 99re中文字幕 | 中文字幕 二区 | 国产精品久久久一区二区 | 欧美怡红院视频 | 色99在线 | 天天插综合 | 亚洲欧美国产视频 | 中文av免费 | www黄色av| 国产亚洲成人网 | 欧美一区二区精美视频 | 精品免费一区二区三区 | 91在线看视频 | 黄色app网站在线观看 | av黄色免费在线观看 | 久久亚洲私人国产精品va | www.夜夜夜 | 黄色毛片视频免费观看中文 | 欧美性生爱 | 人人澡人人爽欧一区 | 91高清不卡 | 成人av免费在线 | 久久私人影院 | 高清av网站 | 丁香婷五月| 日韩影视在线观看 | 亚洲日日夜夜 | 天天鲁一鲁摸一摸爽一爽 | 最近更新好看的中文字幕 | 香蕉视频网址 | 99精品一区二区三区 | 成人中文字幕在线 | 日韩精品在线视频免费观看 | 成人免费一级片 | 亚洲 欧美日韩 国产 中文 | 免费一级片在线 | 日韩一级黄色大片 | www视频免费在线观看 | 一区二区三区国产精品 | av黄色一级片 | av中文字幕在线电影 | 欧美一区二区三区在线播放 | 91黄在线看| 久久理伦片 | 日韩在线观看不卡 | 免费视频99| 免费黄色在线网站 | 黄色成人在线 | 色在线免费| 香蕉视频日本 | 丝袜精品视频 | 特级黄录像视频 | 日本高清中文字幕有码在线 | 亚洲精品在线视频 | 麻豆影视网 | 欧美日韩三区二区 | 亚洲九九九在线观看 | 97超碰人人澡人人爱 | 成人免费网视频 | 久久午夜网 | 久久精品久久久久久久 | 国产又粗又长又硬免费视频 | 在线一区二区三区 | 人人要人人澡人人爽人人dvd | 天天摸天天操天天舔 | 在线观看视频在线 | 高清av网 | 亚洲国产欧美在线看片xxoo | 91在线看视频免费 | 国产精品久久久久久久久岛 | 中文字幕精品一区二区精品 | av短片在线 | 国产精品99久久久久久人免费 | 国产97色 | 亚州av网站 | av一本久道久久波多野结衣 | 亚洲国产欧美在线人成大黄瓜 | 日韩成人精品 | 亚洲综合视频网 | 色a资源在线 | av高清一区二区三区 | 91久久久久久久一区二区 | 黄色av观看 | 欧美国产日韩激情 | 亚洲视频免费视频 | 成片视频免费观看 | 一区二区三区中文字幕在线观看 | 国产精品免费观看视频 | 波多野结衣动态图 | 欧美 高跟鞋交 xxxxhd | 一级黄色毛片 | 国产永久免费 | av大全在线免费观看 | 西西大胆啪啪 | 2019精品手机国产品在线 | 国产情侣一区 | 国产人免费人成免费视频 | 91久久精| 开心激情五月婷婷 | 国内精品福利视频 | 日韩在线网 | 91视视频在线直接观看在线看网页在线看 | 国内视频 | 人人干人人爽 | 就要干b| 国产又粗又猛又爽又黄的视频免费 | 成人h动漫精品一区二 | 干综合网 | 91福利社在线观看 | 亚洲午夜久久久影院 | 日韩精品久久一区二区 | 国产原创中文在线 | 欧美视频在线二区 | 日韩网站中文字幕 | 狠狠操狠狠干天天操 | 国产精品亚洲片在线播放 | 久久久午夜精品理论片中文字幕 | 国产亚洲午夜高清国产拍精品 | 天天草天天插 | 久久男人视频 | 九九免费精品 | 国产永久免费 | 国产小视频在线免费观看视频 | 欧美色操| 精品国产伦一区二区三区观看说明 | 国产在线v | 亚洲精品国产精品国自产 | 韩日精品在线 | 久草电影在线 | 在线 日韩 av | 日韩精品一区二区免费视频 | 五月婷婷综 | 久久人人爽人人爽人人片av免费 | 日韩一区二区三区免费电影 | 婷婷综合五月天 | 不卡的av在线播放 | 99久久久| 欧美日韩不卡在线视频 | 在线免费视频你懂的 | 中文字幕国产 | 在线精品观看国产 | 高清一区二区三区av | 91麻豆精品国产 | 精品福利片 | 久久国产手机看片 | 色婷婷99| 国产精品第一视频 | 亚洲国产天堂av | 国产 亚洲 欧美 在线 | 天天射综合网视频 | 色999在线| 国产69久久精品成人看 | 中文字幕久久精品亚洲乱码 | 超碰在线网 | 国产精品久久久一区二区三区网站 | 国产成人在线观看 | 999日韩| 91粉色视频 | 国产五月| 日日碰狠狠添天天爽超碰97久久 | 久久久一本精品99久久精品66 | 久久久久国产精品免费网站 | 99视| 69av视频在线 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 精品国偷自产国产一区 | 久久久久国产一区二区 | 免费三级骚| 999电影免费在线观看2020 | 日韩视频一二三区 | 中文视频一区二区 | 欧美一区二区三区激情视频 | 国产小视频福利在线 | 婷婷丁香激情 | 91精品视频观看 | 国内精品久久久久影院日本资源 | 久久婷婷综合激情 | 中文字幕乱码电影 | 视频91在线 | 奇米导航| 中文字幕在线看 | 国产精品久久久久久久久久久久午夜片 | 97激情影院 | 久久亚洲电影 | 97超碰在线免费 | 国产成人av一区二区三区在线观看 | 亚洲专区免费观看 | 亚洲精品乱码白浆高清久久久久久 | 激情欧美丁香 | 久久久久久中文字幕 | 国产在线不卡一区 | 性色av免费在线观看 | 久久人人爽人人爽人人片av软件 | 国产精品不卡一区 | 波多野结衣视频在线 | 国产高清免费在线观看 | 91精品国产高清 | 久久精品成人欧美大片古装 | 夜夜夜草 | 国产97免费 | 青青久视频 | 国产 在线 日韩 | 天天色天天搞 | 麻豆 91 在线 | 国产精品免费看久久久8精臀av | 99久久婷婷国产一区二区三区 | 成人av免费网站 | 欧美 国产 视频 | 丁香在线视频 | 久久综合九色综合欧美就去吻 | 免费高清在线观看成人 | 欧美日韩高清在线观看 | 色播六月天 | 久久毛片网 | 亚洲va韩国va欧美va精四季 | 成人免费观看在线视频 | 黄色一级免费 | 丁香资源影视免费观看 | 国产精品青青 | 亚洲最新合集 | 超碰97人人在线 | 国产字幕在线看 | 日韩av在线网站 | www.com在线观看 | 中文字幕精品三级久久久 | 黄色在线观看网站 | 欧美性脚交 | 国产高清精品在线观看 | 国产专区视频在线观看 | 亚洲成a人片77777kkkk1在线观看 | 中文字幕在线视频一区二区三区 | 在线国产日韩 | 午夜视频黄| 中文字幕亚洲情99在线 | 欧美精品在线观看一区 | 欧美成人精品xxx | 久久亚洲精品电影 | 亚洲国产免费看 | 在线高清av | 成年人免费在线观看网站 | 天天躁日日躁狠狠躁av麻豆 | 九九免费在线视频 | 国产成人av免费在线观看 | 五月激情视频 | 99热国产在线中文 | 美女网站一区 | 久久免费精品一区二区三区 | 日韩丝袜在线观看 | 成人国产精品免费 | 夜夜躁天天躁很躁波 | 日韩欧美综合精品 | 亚洲黄色av | 91亚色视频 | 欧美日韩二区三区 | 欧美三级在线播放 | 成人黄色在线看 | 正在播放一区二区 | 色久综合| 亚在线播放中文视频 | 99色国产 | 日日射av| 免费电影播放 | 日韩精品视频在线观看免费 | 最新真实国产在线视频 | 69av在线视频 | 免费在线观看日韩视频 | 国产自产高清不卡 | 久久天天躁狠狠躁夜夜不卡公司 | 麻豆国产露脸在线观看 | 婷婷色中文字幕 | 超碰在线观看99 | 在线播放精品一区二区三区 | 国产麻豆剧传媒免费观看 | 日韩久久久久久久 | 99视频偷窥在线精品国自产拍 | 天天干天天上 | 日本中文字幕在线看 | 欧美性猛片, | 亚洲资源一区 | 国产女人18毛片水真多18精品 | 久久99这里只有精品 | 欧美日韩1区2区 | 亚洲综合狠狠干 | 国产亚洲精品无 | 婷婷丁香六月天 | 免费日韩 精品中文字幕视频在线 | 欧美不卡视频在线 | 亚洲国产精品一区二区尤物区 | 九九热免费视频在线观看 | 免费观看全黄做爰大片国产 | 久草免费在线观看 | 欧美精品亚州精品 | 久久视频在线免费观看 | 免费精品在线 | 天天干天天操人体 | 国产不卡精品视频 | 国产99久久久国产精品免费二区 | 国产精品久久久久久妇 | 久久久久免费 | 人人爽人人爽人人片av免 | 最新av电影网站 | 日本久久久久久科技有限公司 | 亚洲最新视频在线播放 | 日韩激情片在线观看 | 精品一区 在线 | 国内精品小视频 | 国产一区在线不卡 | 国产91免费在线观看 | 亚洲天堂网在线视频 | 在线观看av网 | 中文字幕超清在线免费 | 国产男女无遮挡猛进猛出在线观看 | a级片网站 | 四虎影视www| 久久激情五月激情 | 97超碰精品 | 亚洲综合视频在线播放 | 久久久久久久久久久久电影 | 最近日韩免费视频 | 日韩最新理论电影 | 中文字幕黄色网址 | 午夜性盈盈 | 国产乱对白刺激视频不卡 | 亚洲区视频在线观看 | 999国内精品永久免费视频 | 欧美调教网站 | www.天天成人国产电影 | 激情久久影院 | av国产在线观看 | 色噜噜在线观看视频 | 色噜噜噜| 伊人伊成久久人综合网站 | 深爱五月激情网 | 欧美激情视频久久 | 韩日在线一区 | av大片网址 | 亚州免费视频 | 99婷婷| 91精品视频播放 | 蜜臀久久99精品久久久无需会员 | 国产五月 | 国产一区二区久久 | 亚洲精品字幕在线 | 九九免费精品视频在线观看 | 五月天色网站 | 天天干夜夜夜操天 | 91精品国产综合久久婷婷香蕉 | 91日韩免费 | 伊人久久av | 国内精品视频一区二区三区八戒 | 人人草人 | 九九热精品视频在线观看 | 精品一区二区在线观看 | 在线观看国产www | 国产色在线,com | 在线免费黄色毛片 | 久久婷婷精品视频 | 在线观看午夜av | 国产福利一区二区在线 | 亚洲视频每日更新 | 国产又黄又爽又猛视频日本 | 亚洲视频网站在线观看 | 91视频免费 | av大全免费在线观看 | 免费在线| 91视频在线免费 | 三级在线视频播放 | 久久99精品久久久久久久久久久久 | 成人h动漫精品一区二 | 久久久久久网址 | a黄色影院 | 69视频网站 | 欧美日韩综合在线观看 | 伊人伊成久久人综合网小说 | 天天干天天射天天操 | a级成人毛片 | 国产日韩视频在线 | 国产成人333kkk| av电影中文字幕在线观看 | 免费涩涩网站 | 午夜av一区 | 成人中文字幕在线 | 亚洲国产中文字幕在线观看 | 亚洲第一伊人 | 久久精品久久久久 | 精品久久1 | 黄色在线观看免费 | 蜜桃视频精品 | 国产一级黄色片免费看 | 成人丁香花 | 亚洲国产片 | 免费能看的黄色片 | 99一区二区三区 | 国产在线999| 日本久久成人中文字幕电影 | 亚洲人在线视频 | 天天操天天能 | 国产精品久久久久久久午夜片 | 国产99久久久国产精品 | 91亚洲精品乱码久久久久久蜜桃 | 91在线免费观看网站 | 精品国产乱码久久 | 久草视频在线资源站 | 国产精品一区久久久久 | 99在线精品视频观看 | 成片免费观看视频大全 | 国产精品乱码久久久久久1区2区 | 久久久精品亚洲 | 91精品视频在线免费观看 | 国产色中涩 | 成人永久免费 | 一级片色播影院 | 香蕉网在线 | 97干com| 91麻豆网站 | 午夜精品一二三区 | 久久久久久久久久久高潮一区二区 | 在线看岛国av | 国产二级视频 | 日韩最新中文字幕 | 日韩欧美精品在线 | 日韩中文字幕视频在线 | 欧美日韩另类视频 | 久久久久久久网 | 国产精品在线看 | 午夜免费久久看 | 国产一区二区成人 | 国产一线二线三线性视频 | 国产裸体视频网站 | 激情婷婷亚洲 | 色.www | 免费一级片视频 | 亚洲视频免费在线观看 | 91九色国产| 日本xxxxav | 中文av在线播放 | 天天人人综合 | 精品夜夜嗨av一区二区三区 | 亚洲国产中文字幕在线视频综合 | 夜色.com| 日韩一级片网址 | 99精品视频网站 | 国产99一区 | 99re6热在线精品视频 | 区一区二区三区中文字幕 | 狠狠色噜噜狠狠狠狠2022 | 久久精品网站视频 | 九九免费精品 | 色人久久 | 四虎在线免费视频 | 欧美色图狠狠干 | 久草在线手机观看 | 欧美激情第28页 | 久久综合婷婷 | 麻豆 videos| 日本精品久久久久中文字幕5 | 国产精品videoxxxx | 麻豆av电影 | 午夜三级毛片 | 成人免费视频视频在线观看 免费 | 欧美日韩久久久 | 久操97 | 日本99久久 | 超级碰碰免费视频 | avwww在线| 天天射,天天干 | 夜夜爽88888免费视频4848 | 久久高清国产视频 | 日日色综合 | 亚州欧美精品 | 亚洲精品乱码久久久久久蜜桃不爽 | 91av综合| 亚洲精品色婷婷 | 国产伦精品一区二区三区… | 免费日韩电影 | 欧美日韩精品影院 | 人人干网 | 精品1区2区3区 | 欧美日韩国产免费视频 | 国产精品av在线免费观看 | 国产在线观看 | 国产午夜三级一区二区三 | 99精品国产一区二区三区不卡 | 国产精品网站一区二区三区 | 日韩综合一区二区三区 | 日韩有码专区 | 丝袜制服综合网 | 国产精品自产拍 | av高清在线 | 久久在线免费观看视频 | 久久精品人人做人人综合老师 | 99在线视频观看 | 黄色亚洲片 | 久草网首页 | 成人免费在线看片 | 日韩综合视频在线观看 | 国产精品久久久久久久久久久久久久 | 一区在线观看 | 亚洲成人资源在线观看 | 日本黄区免费视频观看 | 天天做天天爱天天爽综合网 | 99精品视频在线 | 日日日操操 | 国产精品一区二区久久精品 | 精品99在线 | 一区二区三区国产精品 | 日韩高清无线码2023 | 99精品视频免费全部在线 | 黄色午夜网站 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 免费一级特黄毛大片 | 中文字幕在 | 日韩精品欧美视频 | 福利区在线观看 | 波多野结衣精品视频 | 国产高清久久久 | 久久久久久久看片 | 欧美精品在线观看 | 国产黄网在线 | 久久五月天综合 | 久久影院亚洲 | 婷婷丁香九月 | 久久99国产精品久久 | 欧美日在线观看 | 91av视频在线观看免费 | 五月天最新网址 | 黄色三级在线观看 | 人人艹人人 | 日日干激情五月 | 久久精品99久久久久久 | www天天干com | 日本精品视频一区 | 在线看的av网站 | 午夜久久久影院 | 美女视频又黄又免费 | 91av免费看 | 麻豆免费视频 | 亚洲成人国产精品 | 特级毛片在线观看 | 久久激情综合 | 97成人精品 | 国产69久久精品成人看 | 狠狠躁夜夜av | 麻豆极品 | 久久久久久久久久久福利 | 中文字幕成人网 | 一区二区三区高清不卡 | 中文av在线免费观看 | 日日夜夜免费精品 | 99re6热在线精品视频 | 国产精品午夜8888 | 91在线观看黄 | 美女福利视频一区二区 | 97人人超碰在线 | 91丨精品丨蝌蚪丨白丝jk | 综合天天| 婷婷丁香狠狠爱 | 国产精品毛片一区视频播 | 日韩乱码中文字幕 | 久久久久久久久久久影院 | 国产成人一区二区三区在线观看 | 亚洲视频高清 | 日韩二级毛片 | 日精品| a天堂中文在线 | 亚洲精品在线免费观看视频 | www.av免费观看| 成年人黄色大全 | 中文字幕刺激在线 | 久草.com| 97超视频在线观看 | 黄色av电影在线观看 | av黄免费看| 看片的网址 | 国产在线无 | 国产黄色观看 | h视频日本 | 91最新视频在线观看 | 成人av在线影视 | 国内外成人在线 | 2021国产在线| 久久精品高清 | 69国产成人综合久久精品欧美 | 在线视频观看国产 | 亚洲性视频 | 在线黄色免费 | 免费日韩 精品中文字幕视频在线 | 精品中文字幕在线观看 | 亚洲天堂免费视频 | 午夜精品视频免费在线观看 | 日韩在线视频免费看 | 亚洲国产97在线精品一区 | 91网免费看 | 九九热在线视频 | 黄a网| 在线观看av不卡 | 99在线视频观看 | 婷婷六月激情 | 我要看黄色一级片 | av片一区二区 | 日日夜操| 国产亚洲综合在线 | 日韩高清一 | 久久99国产精品二区护士 | 国产片网站 | 97超碰国产精品女人人人爽 | 激情综合电影网 | 在线视频亚洲 | 国产午夜精品久久久久久久久久 | 精品99在线视频 | aⅴ精品av导航 | 91在线免费观看网站 | 欧美激情va永久在线播放 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产精品国产三级国产不产一地 | 欧美日韩激情视频8区 | 亚洲精品乱码白浆高清久久久久久 | 伊人在线视频 | 黄色片免费在线 | 亚洲另类久久 | 成人在线视频网 | 99这里有精品 | 91在线国内视频 | 成人h在线 | 黄av在线 | www五月天婷婷 | 国产高清不卡一区二区三区 | 中文字幕在线观看网址 | 草久久久| 国产又黄又爽无遮挡 | 99国内精品久久久久久久 | 国产高清精品在线观看 | 国产精品国产三级国产aⅴ无密码 | 综合色站导航 | 国产成人三级在线播放 | 精品国产电影 | 精品国产乱码久久久久久1区二区 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 欧美亚洲一区二区在线 | 丝袜制服综合网 | 深爱激情综合 | 热久久最新地址 | 久久婷婷国产色一区二区三区 | 麻豆免费精品视频 | 久久丁香 | 亚洲一级二级三级 | 国产96在线观看 | 免费视频久久久 | 欧美精品成人在线 | 亚洲精品视频在线观看免费视频 | 日韩高清一二区 | 亚洲日本在线视频观看 | 久久99热这里只有精品 | 久久 精品一区 | 久草在线免 | 性色视频在线 | 日本韩国欧美在线观看 | 欧美天堂久久 | 三级av在线 | 日韩精品一区二区三区免费观看视频 | 久久精品视频在线 | 欧美一级片在线观看视频 | 欧美男女爱爱视频 | 日韩美在线 | 欧美日韩二区在线 | 亚洲精品国产精品乱码在线观看 | 4p变态网欧美系列 | 国产一级二级三级在线观看 | 一区二区三区四区五区在线 | 天天天天天天干 | 成人免费在线观看av | 欧美性久久久 | 日韩精品电影在线播放 | 免费三级av | 激情久久影院 | 丁香六月天 | av一级久久 | 久久er99热精品一区二区 | 国产精品正在播放 | 黄色片网站免费 | 成人观看 | 97超碰人人澡人人爱学生 | 成年人免费在线观看 | 久久久久久久久久久久久久电影 | 波多野结衣资源 | 亚洲国产福利视频 | 四虎影视成人永久免费观看亚洲欧美 | 精品一区二区免费在线观看 | 国产字幕av| 欧美日韩不卡一区二区 | 亚洲国产美女久久久久 | 久久久久久欧美二区电影网 | 亚洲午夜在线视频 | 亚洲欧洲精品一区二区 | 91精品国产99久久久久久红楼 | 色99色 | 美女久久久 | 亚洲精品视频在线观看视频 | 久久免费的精品国产v∧ | 在线a亚洲视频播放在线观看 | 久久热首页 | 久久久久久蜜桃一区二区 | 久久久国产一区二区三区四区小说 | 麻豆成人小视频 | 亚洲精品美女久久17c | 国产精品人成电影在线观看 | 99色在线观看视频 | 久久久国产99久久国产一 | 精品亚洲视频在线 | 欧美激情综合网 | 久久大片网站 | 久久久久电影网站 | 久艹视频在线免费观看 | 又色又爽又黄 | 免费黄色网止 | 麻豆va一区二区三区久久浪 | 在线看不卡av | 一级理论片在线观看 | 欧美精品v国产精品 | 亚洲一区二区三区在线看 | 欧美性做爰猛烈叫床潮 | 日韩免费在线观看网站 | 超碰免费久久 | 亚洲婷婷在线 | 亚洲国产欧美在线看片xxoo | 91成人免费电影 | 91字幕| 一区二区三区免费在线观看 | 国产视频精品免费播放 | 中文字幕免费播放 | 91日韩精品视频 | 黄色的视频网站 | 成人影片在线播放 | 国产亚洲精品久久久久久电影 | 国产精品成人国产乱 | 国产精品99久久久久久宅男 | 国产精品一区二区 91 | 成人黄色视 | 久久亚洲精品电影 | 国产在线观看免费观看 | 国产精品v a免费视频 |