欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

C/C++ Qt TableDelegate 自定義代理組件

TableDelegate 自定義代理組件的主要作用是對(duì)原有表格進(jìn)行調(diào)整,例如默認(rèn)情況下Table中的缺省代理就是一個(gè)編輯框,我們只能夠在編輯框內(nèi)輸入數(shù)據(jù),而有時(shí)我們想選擇數(shù)據(jù)而不是輸入,此時(shí)就需要重寫編輯框?qū)崿F(xiàn)選擇的效果,代理組件常用于個(gè)性化定制Table表格中的字段類型。

創(chuàng)新互聯(lián)成立以來不斷整合自身及行業(yè)資源、不斷突破觀念以使企業(yè)策略得到完善和成熟,建立了一套“以技術(shù)為基點(diǎn),以客戶需求中心、市場為導(dǎo)向”的快速反應(yīng)體系。對(duì)公司的主營項(xiàng)目,如中高端企業(yè)網(wǎng)站企劃 / 設(shè)計(jì)、行業(yè) / 企業(yè)門戶設(shè)計(jì)推廣、行業(yè)門戶平臺(tái)運(yùn)營、app軟件定制開發(fā)、成都做手機(jī)網(wǎng)站、微信網(wǎng)站制作、軟件開發(fā)、德陽服務(wù)器托管等實(shí)行標(biāo)準(zhǔn)化操作,讓客戶可以直觀的預(yù)知到從創(chuàng)新互聯(lián)可以獲得的服務(wù)效果。

代理類的作用是用來實(shí)現(xiàn)重寫的,例如我們的TableView中默認(rèn)是可編輯的,這個(gè)可編輯的組件是QT默認(rèn)為我們重寫了QLineEdit組件,也可理解為將組件嵌入到了表格中,實(shí)現(xiàn)了對(duì)表格的編輯功能。

在自定義代理中QAbstractItemDelegate是所有代理類的抽象基類,我們繼承任何組件時(shí)都必須要包括如下4個(gè)函數(shù):

  • CreateEditor() 用于創(chuàng)建編輯模型數(shù)據(jù)的組件,例如(QSpinBox組件)
  • SetEditorData() 從數(shù)據(jù)模型獲取數(shù)據(jù),以供Widget組件進(jìn)行編輯
  • SetModelData() 將Widget組件上的數(shù)據(jù)更新到數(shù)據(jù)模型
  • UpdateEditorGeometry() 給Widget組件設(shè)置一個(gè)合適的大小

此處我們分別重寫三個(gè)代理接口,其中兩個(gè)ComBox組件用于選擇婚否,SpinBox組件用于調(diào)節(jié)數(shù)值范圍,先來定義三個(gè)重寫部件。

先來實(shí)現(xiàn)一個(gè)代理,代理到Spin組件上,首先需要在項(xiàng)目上右鍵

  • 選擇addnew -> C++Class 輸入自定義類名稱QWintSpinDelegate,然后基類繼承QStyledItemDelegate/QMainWindow,然后下一步結(jié)束向?qū)А?/li>

重寫接口spindelegate.cpp代碼如下.

#include "spindelegate.h"
#include <QSpinBox>

QWIntSpinDelegate::QWIntSpinDelegate(QObject *parent):QStyledItemDelegate(parent)
{
}

// https://www.cnblogs.com/lyshark
QWidget *QWIntSpinDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &option, const QModelIndex &index) const
{
//創(chuàng)建代理編輯組件
    Q_UNUSED(option);
    Q_UNUSED(index);

    QSpinBox *editor = new QSpinBox(parent); //創(chuàng)建一個(gè)QSpinBox
    editor->setFrame(false); //設(shè)置為無邊框
    editor->setMinimum(0);
    editor->setMaximum();
    return editor;  //返回此編輯器
}

void QWIntSpinDelegate::setEditorData(QWidget *editor,const QModelIndex &index) const
{
//從數(shù)據(jù)模型獲取數(shù)據(jù),顯示到代理組件中
//獲取數(shù)據(jù)模型的模型索引指向的單元的數(shù)據(jù)
    int value = index.model()->data(index, Qt::EditRole).toInt();

    QSpinBox *spinBox = static_cast<QSpinBox*>(editor);  //強(qiáng)制類型轉(zhuǎn)換
    spinBox->setValue(value); //設(shè)置編輯器的數(shù)值
}

void QWIntSpinDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
//將代理組件的數(shù)據(jù),保存到數(shù)據(jù)模型中
    QSpinBox *spinBox = static_cast<QSpinBox*>(editor); //強(qiáng)制類型轉(zhuǎn)換
    spinBox->interpretText(); //解釋數(shù)據(jù),如果數(shù)據(jù)被修改后,就觸發(fā)信號(hào)
    int value = spinBox->value(); //獲取spinBox的值

    model->setData(index, value, Qt::EditRole); //更新到數(shù)據(jù)模型
}

void QWIntSpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
//設(shè)置組件大小
    Q_UNUSED(index);
    editor->setGeometry(option.rect);
}

重寫接口floatspindelegate.cpp代碼如下.

#include "floatspindelegate.h"
#include <QDoubleSpinBox>

QWFloatSpinDelegate::QWFloatSpinDelegate(QObject *parent):QStyledItemDelegate(parent)
{
}

QWidget *QWFloatSpinDelegate::createEditor(QWidget *parent,
   const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_UNUSED(option);
    Q_UNUSED(index);

    QDoubleSpinBox *editor = new QDoubleSpinBox(parent);
    editor->setFrame(false);
    editor->setMinimum(0);
    editor->setDecimals(2);
    editor->setMaximum();

    return editor;
}

void QWFloatSpinDelegate::setEditorData(QWidget *editor,
                      const QModelIndex &index) const
{
    float value = index.model()->data(index, Qt::EditRole).toFloat();
    QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
    spinBox->setValue(value);
}

// https://www.cnblogs.com/lyshark
void QWFloatSpinDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
    spinBox->interpretText();
    float value = spinBox->value();
    QString str=QString::asprintf("%.2f",value);

    model->setData(index, str, Qt::EditRole);
}

void QWFloatSpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

重寫接口comboxdelegate.cpp代碼如下.

#include "comboxdelegate.h"
#include <QComboBox>

QWComboBoxDelegate::QWComboBoxDelegate(QObject *parent):QItemDelegate(parent)
{
}

QWidget *QWComboBoxDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QComboBox *editor = new QComboBox(parent);

    editor->addItem("已婚");
    editor->addItem("未婚");
    editor->addItem("單身");

    return editor;
}

// https://www.cnblogs.com/lyshark
void QWComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString str = index.model()->data(index, Qt::EditRole).toString();

    QComboBox *comboBox = static_cast<QComboBox*>(editor);
    comboBox->setCurrentText(str);
}

void QWComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QComboBox *comboBox = static_cast<QComboBox*>(editor);
    QString str = comboBox->currentText();
    model->setData(index, str, Qt::EditRole);
}

void QWComboBoxDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

將部件導(dǎo)入到mainwindow.cpp中,并將其通過ui->tableView->setItemDelegateForColumn(0,&intSpinDelegate);關(guān)聯(lián)部件到指定的table下標(biāo)索引上面。

#include "mainwindow.h"
#include "ui_mainwindow.h"

// https://www.cnblogs.com/lyshark
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 初始化模型數(shù)據(jù)
    model = new QStandardItemModel(4,6,this);      // 初始化4行,每行六列
    selection = new QItemSelectionModel(model);    // 關(guān)聯(lián)模型

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

    // 添加表頭
    QStringList HeaderList;
    HeaderList << "序號(hào)" << "姓名" << "年齡" << "性別" << "婚否" << "薪資";
    model->setHorizontalHeaderLabels(HeaderList);

    // 批量添加數(shù)據(jù)
    QStringList DataList[3];
    QStandardItem *Item;

    DataList[0] << "1001" << "admin" << "24" << "男" << "已婚" << "4235.43";
    DataList[1] << "1002" << "lyshark" << "23" << "男" << "未婚" << ".21";
    DataList[2] << "1003" << "lucy" << "37" << "女" << "單身" << "8900.23";

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

    for(int x=0; x<Array_Count; x++)
    {
        for(int y=0; y<Array_Length; y++)
        {
            // std::cout << DataList[x][y].toStdString().data() << std::endl;
            Item = new QStandardItem(DataList[x][y]);
            model->setItem(x,y,Item);
        }
    }

    // 為各列設(shè)置自定義代理組件
    // 0,4,5 代表第幾列 后面的函數(shù)則是使用哪個(gè)代理類的意思
    ui->tableView->setItemDelegateForColumn(0,&intSpinDelegate);
    ui->tableView->setItemDelegateForColumn(4,&comboBoxDelegate);
    ui->tableView->setItemDelegateForColumn(5,&floatSpinDelegate);

}

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

代理部件關(guān)聯(lián)后,再次運(yùn)行程序,會(huì)發(fā)現(xiàn)原來的TableWidget組件中的編輯框已經(jīng)替換為了選擇框等組件:

分享標(biāo)題:C/C++ Qt TableDelegate 自定義代理組件
網(wǎng)頁路徑:http://chinadenli.net/article8/dsogdop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、App設(shè)計(jì)品牌網(wǎng)站制作、域名注冊、手機(jī)網(wǎng)站建設(shè)微信公眾號(hào)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作