" />

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

Qt QStandardItemModel用法小結(jié)

 更新時(shí)間:2023年12月18日 15:18:12   作者:C語言中文網(wǎng)  
QStandardItemModel可用作標(biāo)準(zhǔn)Qt數(shù)據(jù)類型的存儲(chǔ)庫,本文主要介紹了Qt QStandardItemModel用法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

QStandardItemModel 是標(biāo)準(zhǔn)的以項(xiàng)數(shù)據(jù)(item data)為基礎(chǔ)的標(biāo)準(zhǔn)數(shù)據(jù)模型類,通常與 QTableView 組合成 Model/View 結(jié)構(gòu),實(shí)現(xiàn)通用的二維數(shù)據(jù)的管理功能。

本節(jié)介紹 QStandardltemModel 的使用,主要用到以下 3 個(gè)類:

  • QStandardItemModel:基于項(xiàng)數(shù)據(jù)的標(biāo)準(zhǔn)數(shù)據(jù)模型,可以處理二維數(shù)據(jù)。維護(hù)一個(gè)二維的項(xiàng)數(shù)據(jù)數(shù)組,每個(gè)項(xiàng)是一個(gè) QStandardltem 類的變量,用于存儲(chǔ)項(xiàng)的數(shù)據(jù)、字體格式、對(duì)齊方式等。
  • QTableView:二維數(shù)據(jù)表視圖組件,有多個(gè)行和多個(gè)列,每個(gè)基本顯示單元是一個(gè)單元格,通過 setModel() 函數(shù)設(shè)置一個(gè) QStandardItemModel 類的數(shù)據(jù)模型之后,一個(gè)單元格顯示 QStandardItemModel 數(shù)據(jù)模型中的一個(gè)項(xiàng)。
  • QItemSelectionModel:一個(gè)用于跟蹤視圖組件的單元格選擇狀態(tài)的類,當(dāng)在 QTableView 選擇某個(gè)單元格,或多個(gè)單元格時(shí),通過 QItemSelectionModel 可以獲得選中的單元格的模型索引,為單元格的選擇操作提供方便。

這幾個(gè)類之間的關(guān)系是:QTableView 是界面視圖組件,其關(guān)聯(lián)的數(shù)據(jù)模型是 QStandardItem Model,關(guān)聯(lián)的項(xiàng)選擇模型是 QItemSelectionModel,QStandardItemModel 的數(shù)據(jù)管理的基本單元是 QStandardItem。

實(shí)例 samp5_3 演示 QStandardItemModel 的使用,其運(yùn)行時(shí)界面如圖 1 所示。

圖 1 實(shí)例 samp5_3 的運(yùn)行時(shí)界面

該實(shí)例具有如下功能:

  • 打開一個(gè)純文本文件,該文件是規(guī)則的二維數(shù)據(jù)文件,通過字符串處理獲取表頭和各行各列的數(shù)據(jù),導(dǎo)入到一個(gè) QStandardItemModel 數(shù)據(jù)模型。
  • 編輯修改數(shù)據(jù)模型的數(shù)據(jù),可以插入行、添加行、刪除行,還可以在 QTableView 視圖組件中直接修改單元格的數(shù)據(jù)內(nèi)容。
  • 可以設(shè)置數(shù)據(jù)模型中某個(gè)項(xiàng)的不同角色的數(shù)據(jù),包括文字對(duì)齊方式、字體是否粗體等。
  • 通過 QItemSelectionModel 獲取視圖組件上的當(dāng)前單元格,以及選擇單元格的范圍,對(duì)選擇的單元格進(jìn)行操作。
  • 將數(shù)據(jù)模型的數(shù)據(jù)內(nèi)容顯示到 QPlainTextEdit 組件里,顯示數(shù)據(jù)模型的內(nèi)容,檢驗(yàn)視圖組件上做的修改是否與數(shù)據(jù)模型同步。
  • 將修改后的模型數(shù)據(jù)另存為一個(gè)文本文件。

界面設(shè)計(jì)與主窗口類定義

本實(shí)例的主窗口從 QMainWindow 繼承而來,中間的 TableView 和 PlainTextEdit 組件采用水平分割條布局。在 Action 編輯器中創(chuàng)建如圖 2 所示的一些 Action,并由 Action 創(chuàng)建主工具欄上的按鈕,下方的狀態(tài)欄設(shè)置了幾個(gè) QLabel 組件,顯示當(dāng)前文件名稱、當(dāng)前單元格行號(hào)、列號(hào),以及相應(yīng)內(nèi)容。

圖 2 實(shí)例中創(chuàng)建的 Action

主窗口類 MainWindow 里新增的定義如下(省略了 UI 設(shè)計(jì)器生成的界面組件的槽函數(shù)的聲明):

#define FixedColumnCount 6    //文件固定 6 列
class MainWindow : public QMainWindow
{
    Q_OBJECT private:
    QLabel *LabCurFile;    //當(dāng)前文件
    QLabel *LabCellPos;    //當(dāng)前單元格行列號(hào)
    QLabel *LabCellText; //當(dāng)前單元格內(nèi)容
    QStandardItemModel * theModel; //數(shù)據(jù)模型
    QItemSelectionModel *theSelection; //選擇模型
    void iniModelFromStringList (QStringList&) ; //從 StringList 初始化數(shù)據(jù)模型
public:
    explicit MainWindow(QWidget *parent = 0);
private slots:
    //當(dāng)前選擇單元格發(fā)生變化
    void on_currentChanged(const QModelIndex &current, const QModelIndex &previous);
private:
    Ui::MainWindow *ui;
};

這里定義了數(shù)據(jù)模型變量 theModel,項(xiàng)數(shù)據(jù)選擇模型變量 theSelection。

定義的私有函數(shù) iniModelFromStringList() 用于在打開文件時(shí),從一個(gè) QStringList 變量的內(nèi)容創(chuàng)建數(shù)據(jù)模型。

自定義槽函數(shù) on_currentChanged() 用于在 TableView 上選擇單元格發(fā)生變化時(shí),更新狀態(tài)欄的信息顯示,這個(gè)槽函數(shù)將會(huì)與項(xiàng)選擇模型 theSelection 的 currentChanged() 信號(hào)關(guān)聯(lián)。

QStandardltemModel的使用

系統(tǒng)初始化

在 MainWindow 的構(gòu)造函數(shù)中進(jìn)行界面初始化,數(shù)據(jù)模型和選擇模型的創(chuàng)建,以及與視圖組件的關(guān)聯(lián),信號(hào)與槽的關(guān)聯(lián)等設(shè)置,代碼如下:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui (new Ui::MainWindow)
{
    ui->setupUi(this);
    setCentralWidget(ui->splitter);
    theModel = new QStandardltemModel (2, FixedColumnCount, this) ; //數(shù)據(jù)模型
    theSelection = new QItemSelectionModel (theModel) ;//選擇模型
    connect(theSelection,SIGNAL(currentChanged(QModelIndex,QModelIndex)), this,SLOT(on_currentChanged(QModelIndex,QModelIndex)));
    ui->tableView->setModel (theModel) ; //設(shè)置數(shù)據(jù)模型
    ui->tableVi.evi-> setSelectionModel(theSelection) ; //設(shè)置選擇模型
    ui->tableView->setSelectionMode(QAbstractItemView::ExtendedSelection);
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectItems);
    //創(chuàng)建狀態(tài)欄組件,代碼略
}

在構(gòu)造函數(shù)里首先創(chuàng)建數(shù)據(jù)模型 theModel,創(chuàng)建數(shù)據(jù)選擇模型時(shí)需要傳遞一個(gè)數(shù)據(jù)模型變量作為其參數(shù)。這樣,數(shù)據(jù)選擇模型 theSelection 就與數(shù)據(jù)模型 theModel 關(guān)聯(lián),用于表示 theModel 的項(xiàng)數(shù)據(jù)選擇操作。

創(chuàng)建數(shù)據(jù)模型和選擇模型后,為 TableView 組件設(shè)置數(shù)據(jù)模型和選擇模型:

ui->tableView->setModel (theModel) ; //設(shè)置數(shù)據(jù)模型
ui->tableView->setSelectionModel (theSelection) ; //設(shè)置選擇模型

構(gòu)造函數(shù)里還將自定義的槽函數(shù) on_currentChanged() 與 theSelection 的 currentChanged() 信號(hào)關(guān)聯(lián),用于界面上 tableView 選擇單元格發(fā)生變化時(shí),顯示單元格的行號(hào)、列號(hào)、內(nèi)容等信息,槽函數(shù)代碼如下:

void MainWindow::on_currentChanged(const QModelIndex &current, const QModelIndex &previous)
{ //選擇單元格變化時(shí)的響應(yīng)
    if (current.isValid())
    {
        LabCellPos->setText (QString::asprintf ("當(dāng)前單元格:%d 行,%d 列", current.row(),current.column()));
        QStandardItem* aItem=theModel->itemFromIndex(current);
        this->LabCellText->setText ("單元格內(nèi)容:"+aItem->text());
        QFont font=aItem->font();
        ui->actFontBold->setChecked(font.bold());
    }
}

從文本文件導(dǎo)入數(shù)據(jù)

QStandardItemModel 是標(biāo)準(zhǔn)的基于項(xiàng)數(shù)據(jù)的數(shù)據(jù)模型,以類似于二維數(shù)組的形式管理內(nèi)部數(shù)據(jù),適合于處理表格型數(shù)據(jù),其顯示一般采用 QTableView。

QStandardItemModel 的數(shù)據(jù)可以是程序生成的內(nèi)存中的數(shù)據(jù),也可以來源于文件。例如,在實(shí)際數(shù)據(jù)處理中,有些數(shù)據(jù)經(jīng)常是以純文本格式保存的,它們有固定的列數(shù),每一列是一項(xiàng)數(shù)據(jù),實(shí)際構(gòu)成一個(gè)二維數(shù)據(jù)表。圖 3 是本實(shí)例程序要打開的一個(gè)純文本文件的內(nèi)容,文件的第 1 行是數(shù)據(jù)列的文字標(biāo)題,相當(dāng)于數(shù)據(jù)表的表頭,然后以行存儲(chǔ)數(shù)據(jù),以 TAB 鍵間隔每列數(shù)據(jù)。

當(dāng)單擊工具欄上的“打開文件”按鈕時(shí),需要選擇一個(gè)這樣的文件導(dǎo)入到數(shù)據(jù)模型,并在 tableView 上進(jìn)行顯示和編輯。圖 3 的數(shù)據(jù)有 6 列,第 1 列是整數(shù),第 2 至 4 列是浮點(diǎn)數(shù),第 5 列是文字,第 6 列是邏輯型變量,“1”表示 true。

圖 3 純文本格式的數(shù)據(jù)文件

下面是“打開文件”按鈕的槽函數(shù)代碼:

void MainWindow::on_actOpen_triggered()
{ //打開文件
    //QString str;
    QString curPath=QCoreApplication::applicationDirPath(); //獲取應(yīng)用程序的路徑
    //調(diào)用打開文件對(duì)話框打開一個(gè)文件
    QString aFileName=QFileDialog::getOpenFileName(this,"打開一個(gè)文件",curPath, "井?dāng)?shù)據(jù)文件(*.txt);;所有文件(*.*)");
    if (aFileName.isEmpty())
        return; //如果未選擇文件,退出
    QStringList fFileContent;//文件內(nèi)容字符串列表
    QFile aFile(aFileName);  //以文件方式讀出
    if (aFile.open(QIODevice::ReadOnly | QIODevice::Text)) //以只讀文本方式打開文件
    {
        QTextStream aStream(&aFile); //用文本流讀取文件
        ui->plainTextEdit->clear();//清空
        while (!aStream.atEnd())
        {
            QString str=aStream.readLine();//讀取文件的一行
            ui->plainTextEdit->appendPlainText(str); //添加到文本框顯示
            fFileContent.append(str); //添加到 StringList
        }
        aFile.close();//關(guān)閉文件
        this->LabCurFile->setText("當(dāng)前文件:"+aFileName);//狀態(tài)欄顯示
        ui->actAppend->setEnabled(true); //更新Actions的enable屬性
        ui->actInsert->setEnabled(true);
        ui->actDelete->setEnabled(true);
        ui->actSave->setEnabled(true);
        iniModelFromStringList(fFileContent);//從StringList的內(nèi)容初始化數(shù)據(jù)模型
    }
}

這段代碼讓用戶選擇所需要打開的數(shù)據(jù)文本文件,然后用只讀和文本格式打開文件,逐行讀取其內(nèi)容,將每行字符串顯示到界面上的 plainTextEdit 里,并且添加到一個(gè)臨時(shí)的 QStringList 類型的變量 fFileContent 里。

然后調(diào)用自定義函數(shù) iniModelFromStringList(),用 fFileContent 的內(nèi)容初始化數(shù)據(jù)模型。下面是 iniModelFromStringList() 函數(shù)的代碼:

void MainWindow::iniModelFromStringList(QStringList& aFileContent)
{ //從一個(gè)StringList 獲取數(shù)據(jù),初始化數(shù)據(jù)Model
    int rowCnt=aFileContent.count(); //文本行數(shù),第1行是標(biāo)題
    theModel->setRowCount(rowCnt-1); //實(shí)際數(shù)據(jù)行數(shù)
    //設(shè)置表頭
    QString header=aFileContent.at(0);//第1行是表頭
    //一個(gè)或多個(gè)空格、TAB等分隔符隔開的字符串, 分解為一個(gè)StringList
    QStringList headerList=header.split(QRegExp("\\s+"),QString::SkipEmptyParts);
    theModel->setHorizontalHeaderLabels(headerList); //設(shè)置表頭文字
    //設(shè)置表格數(shù)據(jù)
    QString aText;
    QStringList tmpList;
    int j;
    QStandardItem   *aItem;
    for (int i=1;i<rowCnt;i++)
    {
        QString aLineText=aFileContent.at(i); //獲取數(shù)據(jù)區(qū)的一行
        //一個(gè)或多個(gè)空格、TAB等分隔符隔開的字符串, 分解為一個(gè)StringList
        QStringList tmpList=aLineText.split(QRegExp("\\s+"),QString::SkipEmptyParts);
        for (j=0;j<FixedColumnCount-1;j++) //tmpList的行數(shù)等于FixedColumnCount, 固定的
        { //不包含最后一列
            aItem=new QStandardItem(tmpList.at(j));//創(chuàng)建item
            theModel->setItem(i-1,j,aItem); //為模型的某個(gè)行列位置設(shè)置Item
        }
        aItem=new QStandardItem(headerList.at(j));//最后一列是Checkable,需要設(shè)置
        //aItem=new QStandardItem();//最后一列是Checkable,設(shè)置
        aItem->setCheckable(true); //設(shè)置為Checkable
        //aItem->setTextAlignment(Qt::AlignHCenter);
        if (tmpList.at(j)=="0")
            aItem->setCheckState(Qt::Unchecked); //根據(jù)數(shù)據(jù)設(shè)置check狀態(tài)
        else
            aItem->setCheckState(Qt::Checked);
        theModel->setItem(i-1,j,aItem); //為模型的某個(gè)行列位置設(shè)置Item
    }
}

傳遞來的參數(shù) aFileContent 是文本文件所有行構(gòu)成的 StringList,文件的每一行是 aFileContent 的一行字符串,第 1 行是表頭文字,數(shù)據(jù)從第 2 行開始。

程序首先獲取字符串列表的行數(shù),然后設(shè)置數(shù)據(jù)模型的行數(shù),因?yàn)閿?shù)據(jù)模型的列數(shù)在初始化時(shí)己經(jīng)設(shè)置了。

然后獲取字符串列表的第 1 行,即表頭文字,用 QString::split() 函數(shù)分割成一個(gè) QStringList,設(shè)置為數(shù)據(jù)模型的表頭標(biāo)題。

QString::split() 函數(shù)根據(jù)某個(gè)特定的符號(hào)將字符串進(jìn)行分割。例如,header 是數(shù)據(jù)列的標(biāo)題, 每個(gè)標(biāo)題之間通過一個(gè)或多個(gè) TAB 鍵分隔,其內(nèi)容是:

測深(m) 垂深(m) 方位(°) 總位移(m) 固井質(zhì)量 測井取樣

那么通過上面的 split() 函數(shù)操作,得到一個(gè)字符串列表 headerList,其內(nèi)容是:

測深(m)
垂深(m)
方位(°)
總位移(m)
固井質(zhì)量
測井取樣

也就是分解為一個(gè) 6 行的 StringList。然后使用此字符串列表作為數(shù)據(jù)模型,設(shè)置表頭標(biāo)題的函數(shù) setHorizontalHeaderLabels() 的參數(shù),就可以為數(shù)據(jù)模型設(shè)置表頭了。

同樣,在逐行獲取字符串后,也采用 split() 函數(shù)進(jìn)行分解,為每個(gè)數(shù)據(jù)創(chuàng)建一個(gè) QStandardltem 類型的項(xiàng)數(shù)據(jù) altem,并賦給數(shù)據(jù)模型作為某行某列的項(xiàng)數(shù)據(jù)。

QStandardItemModel 以二維表格的形式保存項(xiàng)數(shù)據(jù),每個(gè)項(xiàng)數(shù)據(jù)對(duì)應(yīng)著 QTableView 的一個(gè)單元格。項(xiàng)數(shù)據(jù)不僅可以存儲(chǔ)顯示的文字,還可以存儲(chǔ)其他角色的數(shù)據(jù)。

數(shù)據(jù)文件的最后一列是一個(gè)邏輯型數(shù)據(jù),在 tableView 上顯示時(shí)為其提供一個(gè) CheckBox 組件,此功能通過調(diào)用 QStandardItem 的 setCheckable() 函數(shù)實(shí)現(xiàn)。

數(shù)據(jù)修改

當(dāng) TableView 設(shè)置為可編輯時(shí),雙擊一個(gè)單元格可以修改其內(nèi)容,對(duì)于使用 CheckBox 的列,改變 CheckBox 的勾選狀態(tài),就可以修改單元格關(guān)聯(lián)項(xiàng)的選擇狀態(tài)。

在實(shí)例主窗口工具欄上有“添加行”、“插入行”、“刪除行”按鈕,它們實(shí)現(xiàn)相應(yīng)的編輯操作,這些操作都是直接針對(duì)數(shù)據(jù)模型的,數(shù)據(jù)模型被修改后,會(huì)直接在 TableView 上顯示出來。

添加行

“添加行”操作是在數(shù)據(jù)表的最后添加一行,其實(shí)現(xiàn)代碼如下:

void MainWindow::on_actAppend_triggered()
{ //在表格最后添加行
    QList<QStandardItem*>    aItemList; //容器類
    QStandardItem   *aItem;
    for(int i=0;i<FixedColumnCount-1;i++) //不包含最后1列
    {
        aItem=new QStandardItem("0"); //創(chuàng)建Item
        aItemList<<aItem;   //添加到容器
    }
    //獲取最后一列的表頭文字
    QString str=theModel->headerData(theModel->columnCount()-1,Qt::Horizontal,Qt::DisplayRole).toString();
    aItem=new QStandardItem(str); //創(chuàng)建 "測井取樣"Item
    aItem->setCheckable(true);
    aItemList<<aItem;   //添加到容器
    theModel->insertRow(theModel->rowCount(),aItemList); //插入一行,需要每個(gè)Cell的Item
    QModelIndex curIndex=theModel->index(theModel->rowCount()-1,0);//創(chuàng)建最后一行的ModelIndex
    theSelection->clearSelection();//清空選擇項(xiàng)
    theSelection->setCurrentIndex(curIndex,QItemSelectionModel::Select);//設(shè)置剛插入的行為當(dāng)前選擇行
}

使用 QStandardltemModel::insertRow() 函數(shù)插入一行,其函數(shù)原型是:

void insertRow(int row, const QList<QStandardltem *> fiitems)

其中,row 是一個(gè)行號(hào),表示在此行號(hào)之前插入一行,若 row 等于或大于總行數(shù),則在最后添加一行。QList<QStandardItem *>&items 是一個(gè) QStandardltem 類型的列表類,需要為插入的一行的每個(gè)項(xiàng)數(shù)據(jù)創(chuàng)建一個(gè) QStandardltem 類型的項(xiàng),然后傳遞給 insertRow() 函數(shù)。

在這段程序中,為前 5 列創(chuàng)建 QStandardItem 對(duì)象時(shí),都使用文字“0”,最后一列使用表頭的標(biāo)題,并設(shè)置為 Checkable。創(chuàng)建完每個(gè)項(xiàng)數(shù)據(jù)對(duì)象后,使用 insertRow() 函數(shù)在最后添加一行。

插入行

“插入行”按鈕的功能是在當(dāng)前行的前面插入一行,實(shí)現(xiàn)代碼與“添加行”類似。

刪除行

“刪除行”按鈕的功能是刪除當(dāng)前行,首先從選擇模型中獲取當(dāng)前單元格的模型索引,然后從模型索引中獲取行號(hào),調(diào)用 removeRow(int row) 刪除指定的行。

void MainWindow::on_actDelete_triggered()
{ //刪除行
    QModelIndex curIndex=theSelection->currentIndex () ;//獲取模型索引
    if (curIndex. row () ==theModel->rowCount () -1) //最后一行
        theModel->removeRow (curIndex.row () ) ; //刪除最后一行
    else {
        theModel->removeRow (curIndex.row () );//刪除一行,并重新設(shè)置當(dāng)前選擇行
        theSelection->setCurrentIndex (curIndex, QItemSelectionModel::Select);
    }
}

單元格格式設(shè)置

工具欄上有 3 個(gè)設(shè)置單元格文字對(duì)齊方式的按鈕,還有一個(gè)設(shè)置字體粗體的按鈕。當(dāng)在 TableView 中選擇多個(gè)單元格時(shí),可以同時(shí)設(shè)置多個(gè)單元格的格式。例如,“居左”按鈕的代碼如下:

void MainWindow::on_actAlignLeft_triggered()
{    //設(shè)置文字居左對(duì)齊
    if (!theSelection->hasSelection())
        return;
    //獲取選擇的單元格的模型索引列表,可以是多選
    QModelIndexList selectedIndex=theSelection->selectedIndexes();
    for (int i=0;i<selectedIndex.count();i++)
    {
        QModelIndex aIndex=selectedIndex.at (i) ; //獲取一個(gè)模型索引
        QStandardItem* aItem=theModel->itemFromIndex(aIndex);
        aItem->setTextAlignment (Qt::AlignLeft) ;//設(shè)置文字對(duì)齊方式
    }
}

QItemSelectionModel::selectedIndexes() 函數(shù)返回選擇單元格的模型索引列表,然后通過此列表獲取每個(gè)選擇的單元格的模型索引,再通過模型索引獲取其項(xiàng)數(shù)據(jù),然后調(diào)用 QStandardItem::setTextAlignment() 設(shè)置一個(gè)項(xiàng)的對(duì)齊方式即可。

“居中”和“居右”按鈕的代碼與此類似。

“粗體”按鈕設(shè)置單元格的字體是否為粗體,在選擇單元格時(shí),actFontBold 的 check 狀態(tài)根據(jù)當(dāng)前單元格的字體是否為粗體自動(dòng)更新。actFontBold 的 triggered(bool) 的槽函數(shù)代碼如下,與設(shè)置對(duì)齊方式的代碼操作方式類似:

void MainWindow::on_actFontBold_triggered(bool checked)
{//設(shè)置字體粗體
    if (!theSelection->hasSelection())
        return;
    //獲取選擇單元格的模型索引列表
    QModelIndexList selectedIndex=theSelection->selectedIndexes();
    for (int i=0;i<selectedIndex.count();i++)
    {
        QModelIndex aIndex=selectedIndex.at(i); //獲取一個(gè)模型索引
        QStandardItem* aItem=theModel->itemFromIndex(aIndex);//獲取項(xiàng)數(shù)據(jù)
        QFont font=aItem->font(); //獲取字體
        font.setBold(checked); //設(shè)置字體是否粗體
        aItem->setFont(font); //重新設(shè)置字體
    }
}

數(shù)據(jù)另存為文件

在視圖組件上對(duì)數(shù)據(jù)的修改都會(huì)自動(dòng)更新到數(shù)據(jù)模型里,單擊工具欄上的“模型數(shù)據(jù)預(yù)覽” 按鈕,可以將數(shù)據(jù)模型的數(shù)據(jù)內(nèi)容顯示到 PlainTextEdit 里。

數(shù)據(jù)模型里的數(shù)據(jù)是在內(nèi)存中的,工具欄上的“另存文件”按鈕可以將數(shù)據(jù)模型的數(shù)據(jù)另存 為一個(gè)數(shù)據(jù)文本文件,同時(shí)也顯示在 PlainTextEdit 里,其實(shí)現(xiàn)代碼如下:

void MainWindow::on_actSave_triggered()
{ //保存為文件
    QString curPath=QCoreApplication::applicationDirPath(); //獲取應(yīng)用程序的路徑
    //調(diào)用打開文件對(duì)話框選擇一個(gè)文件
    QString aFileName=QFileDialog::getSaveFileName(this,tr("選擇一個(gè)文件"),curPath,
                 "井斜數(shù)據(jù)文件(*.txt);;所有文件(*.*)");
    if (aFileName.isEmpty()) //未選擇文件,退出
        return;
    QFile aFile(aFileName);
    if (!(aFile.open(QIODevice::ReadWrite | QIODevice::Text | QIODevice::Truncate)))
        return; //以讀寫、覆蓋原有內(nèi)容方式打開文件
    QTextStream aStream(&aFile); //用文本流讀取文件
    QStandardItem   *aItem;
    int i,j;
    QString str;
    ui->plainTextEdit->clear();
    //獲取表頭文字
    for (i=0;i<theModel->columnCount();i++)
    {
        aItem=theModel->horizontalHeaderItem(i); //獲取表頭的項(xiàng)數(shù)據(jù)
        str=str+aItem->text()+"\t\t";  //以TAB見隔開
    }
    aStream<<str<<"\n";  //文件里需要加入換行符 \n
    ui->plainTextEdit->appendPlainText(str);
    //獲取數(shù)據(jù)區(qū)文字
    for ( i=0;i<theModel->rowCount();i++)
    {
        str="";
        for( j=0;j<theModel->columnCount()-1;j++)
        {
            aItem=theModel->item(i,j);
            str=str+aItem->text()+QString::asprintf("\t\t");
        }
        aItem=theModel->item(i,j); //最后一列是邏輯型
        if (aItem->checkState()==Qt::Checked)
            str=str+"1";
        else
            str=str+"0";
         ui->plainTextEdit->appendPlainText(str);
         aStream<<str<<"\n";
    }
}

到此這篇關(guān)于Qt QStandardItemModel用法小結(jié)的文章就介紹到這了,更多相關(guān)Qt QStandardItemModel用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言創(chuàng)建線程thread_create()的方法

    C語言創(chuàng)建線程thread_create()的方法

    這篇文章主要介紹了C語言創(chuàng)建線程thread_create()的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • C語言?推理證明帶環(huán)鏈表詳細(xì)過程

    C語言?推理證明帶環(huán)鏈表詳細(xì)過程

    單鏈表中同樣也有具有挑戰(zhàn)性的題目,鏈表的帶環(huán)問題可以說是眾多難題中的佼佼者,在這里可能更看重的是邏輯推理和證明的過程
    2022-04-04
  • C++實(shí)現(xiàn)八皇后問題的方法

    C++實(shí)現(xiàn)八皇后問題的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)八皇后問題的方法,是數(shù)據(jù)結(jié)構(gòu)與算法中常見的一個(gè)經(jīng)典算法,需要的朋友可以參考下
    2014-09-09
  • C語言嵌套鏈表實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)

    C語言嵌套鏈表實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言嵌套鏈表實(shí)現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C語言中的數(shù)組和指針匯編代碼分析實(shí)例

    C語言中的數(shù)組和指針匯編代碼分析實(shí)例

    這篇文章主要介紹了C語言中的數(shù)組和指針匯編代碼分析實(shí)例,本文用一則C語言例子來得到對(duì)應(yīng)的匯編代碼,并一一注解每句匯編代碼的含義,需要的朋友可以參考下
    2015-06-06
  • 關(guān)于C/C++中的side effect(負(fù)效應(yīng))和sequence point(序列點(diǎn))

    關(guān)于C/C++中的side effect(負(fù)效應(yīng))和sequence point(序列點(diǎn))

    不知你在寫code時(shí)是否遇到這樣的問題?int i = 3; int x = (++i) + (++i) + (++i); 問x值為多少?進(jìn)行各種理論分析,并在編譯器上實(shí)踐,然而可能發(fā)現(xiàn)最終的結(jié)果是不正確的,也是不穩(wěn)定的,不同的編譯器可能會(huì)產(chǎn)生不同的結(jié)果。這讓人很頭疼
    2013-10-10
  • C語言創(chuàng)建windows窗口實(shí)例

    C語言創(chuàng)建windows窗口實(shí)例

    這篇文章主要介紹了C語言創(chuàng)建windows窗口實(shí)例,本文直接給出實(shí)現(xiàn)代碼,同時(shí)講解了編碼的步驟,需要的朋友可以參考下
    2015-04-04
  • VS2019安裝cbd調(diào)試器的實(shí)現(xiàn)步驟

    VS2019安裝cbd調(diào)試器的實(shí)現(xiàn)步驟

    本文主要介紹了VS2019安裝cbd調(diào)試器的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • QT 中文亂碼解決匯總(QString與string、char*互轉(zhuǎn)亂碼)

    QT 中文亂碼解決匯總(QString與string、char*互轉(zhuǎn)亂碼)

    在QT中使用中文時(shí),經(jīng)常會(huì)碰到論碼問題,本文主要介紹了QT 中文亂碼解決匯總(QString與string、char*互轉(zhuǎn)亂碼),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • C++ read函數(shù)讀入int整形數(shù)據(jù)

    C++ read函數(shù)讀入int整形數(shù)據(jù)

    這篇文章主要介紹了C++ read函數(shù)讀入int整形數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2016-07-07

最新評(píng)論