最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt中TableView與TreeView組件聯(lián)動實現(xiàn)

 更新時間:2023年12月29日 16:59:48   作者:微軟技術(shù)分享  
本文主要介紹了Qt中TableView與TreeView組件聯(lián)動實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點介紹TableViewTreeView組件聯(lián)動的常用方法及靈活運用。

本章我們繼續(xù)實現(xiàn)表格的聯(lián)動效果,當讀者點擊TableViewTreeView中的某一行時,我們讓其實現(xiàn)自動跟隨功能,且當用戶修改行中特定數(shù)據(jù)時也讓其動態(tài)的跟隨改變,首先繪制一個主界面如圖,分別放置兩個組件框,底部保留兩個按鈕,按鈕1用于該表表格的行列個數(shù),按鈕2則用于設(shè)置TableView表格表頭參數(shù),整個表格我們將其設(shè)置為可編輯狀態(tài)。

在函數(shù)中我們需要定義一個QStandardItemModel模型,這個模型的作用在之前的文章中有具體介紹,它是一個靈活且功能強大的模型類,適用于需要自定義數(shù)據(jù)結(jié)構(gòu)、支持編輯、表頭等功能的場景。通常用于與視圖組件(如 QTableView、QTreeView 等)一起使用。它提供了一個表格結(jié)構(gòu),可以包含行和列,每個單元格可以存儲一個 QStandardItem 對象。

這里的QStandardItemModel只適用于將兩個不同類型的組件進行關(guān)聯(lián),簡單點來說就是將兩個組件指向同一個數(shù)據(jù)容器內(nèi),這樣當用戶修改任意一個組件內(nèi)的數(shù)據(jù)另一個組件也會同步發(fā)生變更,但要想實現(xiàn)聯(lián)動則還需要使用QItemSelectionModel模型,它負責跟蹤哪些項被選中,以及在模型中項的選擇狀態(tài)發(fā)生變化時發(fā)出信號。

以下是 QItemSelectionModel 的一些重要特性和方法:

  • 選擇項: 負責管理模型中的項的選擇狀態(tài),可以單獨選擇項、選定范圍內(nèi)的項或清除所有選擇項。
  • 信號: 當選擇狀態(tài)發(fā)生變化時,QItemSelectionModel 會發(fā)出相應的信號,如 selectionChanged 信號。
  • 選擇模式: 提供多種選擇模式,包括單選、多選、擴展選擇等,可通過設(shè)置 SelectionMode 進行配置。
  • 選擇策略: 提供多種選擇策略,用于定義選擇行為,如 SelectItems、SelectRows、SelectColumns 等。
  • 與視圖的集成: 通常與 QTableView、QTreeView 等視圖組件結(jié)合使用,以實現(xiàn)對視圖中項的選擇操作。

該組件是實現(xiàn)模型-視圖架構(gòu)中選擇的關(guān)鍵組件。通過它,可以輕松管理和操作模型中的項的選擇狀態(tài),實現(xiàn)各種靈活的用戶交互。下面是 QItemSelectionModel 類的一些主要方法:

方法描述
QItemSelectionModel(QAbstractItemModel *model, QObject *parent = nullptr)構(gòu)造函數(shù),創(chuàng)建一個與指定模型關(guān)聯(lián)的 QItemSelectionModel 對象。
QModelIndexList selectedIndexes() const獲取當前被選中的項的索引列表。
void clear()清除所有的選擇項。
void setSelectionMode(QItemSelectionModel::SelectionFlags mode)設(shè)置選擇模式,可以選擇多個項、單個項等。
void setSelectionBehavior(QItemSelectionModel::SelectionBehavior behavior)設(shè)置選擇策略,如選擇單個項、選擇整行、選擇整列等。
void select(const QModelIndex &topLeft, const QModelIndex &bottomRight, QItemSelectionModel::SelectionFlags command)在指定范圍內(nèi)進行選擇操作,使用 SelectionFlags 定義選擇操作。
void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)當選擇狀態(tài)發(fā)生變化時發(fā)出的信號,可以通過連接這個信號來處理選擇狀態(tài)變化的事件。
bool hasSelection() const判斷是否有選中的項。

上述方法提供了管理選擇項的一些基本操作,包括清除選擇、獲取選中項的索引、設(shè)置選擇模式和策略,以及在指定范圍內(nèi)進行選擇操作。

MainWindow構(gòu)造函數(shù)中,我們以此執(zhí)行如下關(guān)鍵部分,來實現(xiàn)對主界面的初始化工作;

創(chuàng)建模型和選擇模型

首先創(chuàng)建一個包含4行5列的 QStandardItemModel 模型,并為其創(chuàng)建了一個 QItemSelectionModel 選擇模型。

model = new QStandardItemModel(4, 5, this);
selection = new QItemSelectionModel(model);

關(guān)聯(lián)到 tableView 和 treeView

將模型和選擇模型關(guān)聯(lián)到 tableView 和 treeView 上,這樣它們會共享同一份數(shù)據(jù)模型,也就是無論兩個組件哪一個發(fā)生變化均會影響雙方組件中的內(nèi)容。

ui->tableView->setModel(model);
ui->tableView->setSelectionModel(selection);

ui->treeView->setModel(model);
ui->treeView->setSelectionModel(selection);

添加表頭與初始化數(shù)據(jù)

創(chuàng)建一個包含列名的 HeaderList 字符串列表,并將其設(shè)置為模型的水平表頭標簽。繼續(xù)創(chuàng)建一個包含三個字符串列表的數(shù)組 DataList,每個列表代表一行數(shù)據(jù)。然后使用嵌套的循環(huán)遍歷數(shù)組,將數(shù)據(jù)逐個添加到模型中。

QStringList HeaderList;
HeaderList << "序號" << "姓名" << "年齡" << "性別" << "婚否";
model->setHorizontalHeaderLabels(HeaderList);

QStringList DataList[3];
QStandardItem *Item;

DataList[0] << "1001" << "admin" << "24" << "男" << "是";
DataList[1] << "1002" << "lyshark" << "23" << "男" << "否";
DataList[2] << "1003" << "lucy" << "37" << "女" << "是";

通過循環(huán)添加數(shù)據(jù)到模型

使用兩個循環(huán),外層循環(huán)遍歷數(shù)組,內(nèi)層循環(huán)遍歷每個數(shù)組中的元素,創(chuàng)建 QStandardItem 對象并將其添加到模型的相應位置。

int Array_Length = DataList->length();               // 獲取每個數(shù)組中元素數(shù)
int Array_Count = sizeof(DataList) / sizeof(DataList[0]);        // 獲取數(shù)組個數(shù)

for(int x=0; x<Array_Count; x++)
{
    for(int y=0; y<Array_Length; y++)
    {
        Item = new QStandardItem(DataList[x][y]);
        model->setItem(x, y, Item);
    }
}

如上這段代碼初始化了一個包含表頭和數(shù)據(jù)的 QStandardItemModel 模型,然后將模型和選擇模型關(guān)聯(lián)到 tableView 和 treeView 上,最后通過循環(huán)將數(shù)據(jù)逐個添加到模型中。這樣就創(chuàng)建了一個主窗口,其中包含了一個表格視圖和一個樹形視圖,它們共享相同的數(shù)據(jù)模型。如下圖所示;

DialogSize.ui

接著來看on_pushButton_clicked按鈕是如何實現(xiàn)的,該按鈕主要用于實現(xiàn)改變表格行與列,當點擊后則會彈出一個DialogSize自定義對話框,至于對話框是如何添加的在之前的文章中已經(jīng)詳細介紹過了。

在如下代碼中我們通過model->rowCount()以及model->columnCount()獲取到父UI界面中tableView表格的行列數(shù),并通過ptr->setRowColumn將這些數(shù)據(jù)設(shè)置到了子對話框的編輯框上面,而ptr->columnCount()則用于接收子對話框的返回值,并將其動態(tài)設(shè)置到對應的模型中;

void MainWindow::on_pushButton_clicked()
{
    // //模態(tài)對話框,動態(tài)創(chuàng)建,用過后刪除
    DialogSize *ptr = new DialogSize(this);     // 創(chuàng)建一個對話框
    Qt::WindowFlags flags = ptr->windowFlags(); // 需要獲取返回值
    ptr->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint);  // 設(shè)置對話框固定大小
    ptr->setRowColumn(model->rowCount(),model->columnCount());      // 對話框數(shù)據(jù)初始化

    int ref = ptr->exec();             // 以模態(tài)方式顯示對話框
    if (ref==QDialog::Accepted)        // OK鍵被按下,對話框關(guān)閉
    {
        // 當BtnOk被按下時,則設(shè)置對話框中的數(shù)據(jù)
        int cols=ptr->columnCount();
        model->setColumnCount(cols);

        int rows=ptr->rowCount();
        model->setRowCount(rows);
    }

    // 最后刪除釋放對話框句柄
    delete ptr;
}

接著來看下子對話框DialogSize做了什么,在對話框代碼中rowCount()是給主窗體調(diào)用的函數(shù)其功能是獲取到當前對話框中spinBoxRow組件中的數(shù)值,而columnCount()同理用于得到spinBoxColumn組件中的數(shù)值,最后的setRowColumn()則是用于接收主窗體的船只,并設(shè)置到對應的子對話框上的SpinBox組件內(nèi),其代碼如下;

DialogSize::DialogSize(QWidget *parent) :QDialog(parent),ui(new Ui::DialogSize)
{
    ui->setupUi(this);
}

DialogSize::~DialogSize()
{
    delete ui;
}

// 主窗體調(diào)用獲取當前行數(shù)
int DialogSize::rowCount()
{
    return  ui->spinBoxRow->value();
}

// 主窗體調(diào)用獲取當前列數(shù)
int DialogSize::columnCount()
{
    return  ui->spinBoxColumn->value();
}

// 設(shè)置主窗體中的TableView行數(shù)與列數(shù)
void DialogSize::setRowColumn(int row, int column)
{
    ui->spinBoxRow->setValue(row);
    ui->spinBoxColumn->setValue(column);
}

運行程序,并點擊左側(cè)第一個按鈕,此時我們可以將表格設(shè)置為6*6的矩陣,如下圖所示;

DIalogHead.ui

對于第二個按鈕on_pushButton_2_clicked的功能實現(xiàn)與第一個按鈕完全一致,該按鈕主要實現(xiàn)對父窗體中TableView的表頭進行重新設(shè)置,在彈出對話框之前,需要將當前表頭元素復制到strList列表容器內(nèi),并通過使用子對話框中的ptr->setHeaderList將其拷貝到子對話框中,并通過QDialog::Accepted等待對話框按下修改按鈕,如下代碼所示;

void MainWindow::on_pushButton_2_clicked()
{
    DialogHead *ptr = new DialogHead(this);
    Qt::WindowFlags flags = ptr->windowFlags();
    ptr->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint);

    // 如果表頭列數(shù)變化,則從新初始化
    if(ptr->headerList().count() != model->columnCount())
    {
        QStringList strList;

        // 獲取現(xiàn)有的表頭標題
        for (int i=0;i<model->columnCount();i++)
        {
            strList.append(model->headerData(i,Qt::Horizontal,Qt::DisplayRole).toString());
        }

        // 用于對話框初始化顯示
        ptr->setHeaderList(strList);
    }

    // 調(diào)用彈窗
    int ref = ptr->exec();
    if(ref==QDialog::Accepted)
    {
        // 獲取對話框上修改后的StringList
        QStringList strList=ptr->headerList();

        // 設(shè)置模型的表頭標題
        model->setHorizontalHeaderLabels(strList);
    }

    delete ptr;
}

當讀者按下了修改按鈕之后,由于通過ui->listView->setModel(model)已經(jīng)與父窗體建立了關(guān)聯(lián),則此時通過model->setStringList(headers)就可以實現(xiàn)對父窗體中數(shù)據(jù)的修改,代碼如下所示;

DialogHead::DialogHead(QWidget *parent) :QDialog(parent),ui(new Ui::DialogHead)
{
    ui->setupUi(this);
    model = new QStringListModel;
    ui->listView->setModel(model);
}

DialogHead::~DialogHead()
{
    delete ui;
}

// 設(shè)置當前l(fā)istView中的數(shù)據(jù)
void DialogHead::setHeaderList(QStringList &headers)
{
    model->setStringList(headers);
}

// 返回當前的表頭
QStringList DialogHead::headerList()
{
    return model->stringList();
}

程序運行后,讀者可以先將表格的行與列修改為7*7,接著再通過設(shè)置表頭的方式更新表頭,效果如下;

到此這篇關(guān)于Qt中TableView與TreeView組件聯(lián)動實現(xiàn)的文章就介紹到這了,更多相關(guān)Qt TableView與TreeView聯(lián)動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C/C++ assert()函數(shù)用法案例總結(jié)

    C/C++ assert()函數(shù)用法案例總結(jié)

    這篇文章主要介紹了C/C++ assert()函數(shù)用法案例總結(jié),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C++實現(xiàn)LeetCode(118.楊輝三角)

    C++實現(xiàn)LeetCode(118.楊輝三角)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(118.楊輝三角),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++交換指針實例

    C++交換指針實例

    這篇文章主要介紹了C++交換指針實例,針對C與C++交換指針的方法進行了較為詳細的對比分析,非常具有實用價值,需要的朋友可以參考下
    2014-10-10
  • C++中的關(guān)鍵字volatile詳解

    C++中的關(guān)鍵字volatile詳解

    這篇文章主要介紹了C++中的關(guān)鍵字volatile使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • php調(diào)用c++的方法

    php調(diào)用c++的方法

    這篇文章主要介紹了php調(diào)用c++的方法,需要的朋友可以參考下
    2014-01-01
  • 使用Objective-C獲取IPHONE手機IMSI序列號

    使用Objective-C獲取IPHONE手機IMSI序列號

    這篇文章主要介紹了使用Objective-C獲取IPHONE手機IMSI序列號的方法以及通過IMSI序列號獲取運營商、手機號的方法,非常的實用,有需要的小伙伴可以參考下。
    2015-04-04
  • C++重載運算符的規(guī)則詳解

    C++重載運算符的規(guī)則詳解

    運算符重載函數(shù)可以是類的成員函數(shù),也可以是類的友元函數(shù),還可以是既非類的成員函數(shù)也不是友元函數(shù)的普通函數(shù)
    2013-10-10
  • c++隱式類型轉(zhuǎn)換示例分享

    c++隱式類型轉(zhuǎn)換示例分享

    這篇文章主要介紹了c++隱式類型轉(zhuǎn)換的二個示例,需要的朋友可以參考下
    2014-03-03
  • C語言實現(xiàn)文件版通訊錄的代碼分享

    C語言實現(xiàn)文件版通訊錄的代碼分享

    這篇文章主要為大家詳細介紹了如何利用C語言實現(xiàn)一個文件版通訊錄,主要運用了結(jié)構(gòu)體,一維數(shù)組,函數(shù),分支與循環(huán)語句等等知識,需要的可以參考一下
    2023-01-01
  • 超詳細解析C++實現(xiàn)歸并排序算法

    超詳細解析C++實現(xiàn)歸并排序算法

    歸并排序是比較穩(wěn)定的排序方法。它的基本思想是把待排序的元素分解成兩個規(guī)模大致相等的子序列。本文將用C++實現(xiàn)這一排序算法,需要的可以參考一下
    2022-09-09

最新評論

海林市| 甘谷县| 保靖县| 静乐县| 惠安县| 巫山县| 文山县| 马山县| 弥渡县| 台北县| 富宁县| 咸宁市| 江西省| 砀山县| 青海省| 会同县| 临泉县| 任丘市| 和硕县| 庆元县| 蚌埠市| 房山区| 丁青县| 乌兰察布市| 河源市| 灵丘县| 论坛| 呈贡县| 湘乡市| 大名县| 天台县| 玉龙| 桐柏县| 富宁县| 互助| 张家界市| 石泉县| 绍兴市| 独山县| 旅游| 阜城县|