欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)邀請(qǐng)碼778899分享:qt自定義代理的功能

柚子快報(bào)邀請(qǐng)碼778899分享:qt自定義代理的功能

http://yzkb.51969.com/

Qt 中的自定義代理(QStyledItemDelegate 或 QItemDelegate)用于控制模型視圖結(jié)構(gòu)中的單元格的顯示和編輯方式。代理可以自定義單元格的繪制、數(shù)據(jù)呈現(xiàn)和編輯器的行為。通過(guò)自定義代理,你可以創(chuàng)建不同于默認(rèn)控件的外觀和交互方式,使得視圖更加靈活和個(gè)性化。

1. QStyledItemDelegate 和 QItemDelegate

QStyledItemDelegate:是 QItemDelegate 的改進(jìn)版,推薦使用。它提供了更好的樣式支持,能夠與平臺(tái)的外觀和感覺保持一致。QItemDelegate:是較早的代理類,功能和 QStyledItemDelegate 類似,但處理樣式時(shí)不如 QStyledItemDelegate 先進(jìn)。為了跨平臺(tái)一致性,通常建議使用 QStyledItemDelegate。

2. 代理的主要功能

自定義代理主要用于兩種場(chǎng)景:

自定義繪制:在顯示數(shù)據(jù)時(shí)定制單元格的外觀,比如繪制復(fù)雜圖形、文本布局等。自定義編輯器:提供自定義的輸入控件(如使用下拉框、顏色選擇器等)來(lái)編輯單元格數(shù)據(jù)。

3. 自定義代理的常用方法

要實(shí)現(xiàn)一個(gè)自定義代理類,需要繼承 QStyledItemDelegate 并重寫一些方法:

1. paint()

paint() 方法用于定制單元格的繪制。它允許你控制如何在視圖中繪制每個(gè)單元格的內(nèi)容。

函數(shù)簽名:

void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;

功能:

painter:用于繪制單元格內(nèi)容。option:提供關(guān)于單元格樣式的信息(如單元格是否被選中、焦點(diǎn)等)。index:提供模型中的數(shù)據(jù)和單元格的位置。

通過(guò)自定義 paint(),你可以繪制自定義的圖形、顏色、背景、文本布局等。

示例:

void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {

// 獲取數(shù)據(jù)

QString text = index.model()->data(index, Qt::DisplayRole).toString();

// 設(shè)置背景顏色

painter->fillRect(option.rect, option.state & QStyle::State_Selected ? Qt::blue : Qt::white);

// 繪制文本

painter->drawText(option.rect, Qt::AlignCenter, text);

}

2. createEditor()

createEditor() 用于創(chuàng)建單元格的自定義編輯器。當(dāng)用戶雙擊單元格或觸發(fā)編輯行為時(shí),視圖會(huì)調(diào)用這個(gè)方法來(lái)生成編輯器控件。

函數(shù)簽名:

QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;

功能:

parent:新編輯器的父窗口。option:提供單元格的樣式信息。index:提供被編輯單元格的模型索引。

你可以在此方法中返回任意一個(gè) QWidget 作為編輯器,比如下拉框、顏色選擇器、滑動(dòng)條等。

示例:

QWidget* MyDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {

// 創(chuàng)建一個(gè)自定義的 QComboBox 作為編輯器

QComboBox *editor = new QComboBox(parent);

editor->addItems({"Option 1", "Option 2", "Option 3"});

return editor;

}

3. setEditorData()

setEditorData() 用于將模型中的數(shù)據(jù)加載到編輯器中。視圖調(diào)用這個(gè)方法來(lái)初始化編輯器控件的內(nèi)容。

函數(shù)簽名:

void setEditorData(QWidget *editor, const QModelIndex &index) const override;

功能:

editor:要初始化的編輯器。index:表示被編輯單元格的模型索引,通過(guò)它獲取數(shù)據(jù)。

你可以根據(jù)模型的數(shù)據(jù)類型來(lái)初始化編輯器的狀態(tài)。

示例:

void MyDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const {

// 將模型中的文本設(shè)置到 QComboBox 中

QString value = index.model()->data(index, Qt::EditRole).toString();

QComboBox *comboBox = static_cast(editor);

comboBox->setCurrentText(value);

}

4. setModelData()

setModelData() 用于將編輯器中的數(shù)據(jù)提交到模型中。用戶結(jié)束編輯時(shí),視圖會(huì)調(diào)用此方法更新模型中的數(shù)據(jù)。

函數(shù)簽名:

void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;

功能:

editor:編輯器控件。model:要更新的數(shù)據(jù)模型。index:表示被編輯單元格的模型索引。

示例:

void MyDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const {

// 獲取 QComboBox 的當(dāng)前選擇,并將其寫入模型

QComboBox *comboBox = static_cast(editor);

QString value = comboBox->currentText();

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

}

5. updateEditorGeometry()

updateEditorGeometry() 用于調(diào)整編輯器控件的大小和位置。你可以通過(guò)這個(gè)方法確保編輯器正確地放置在單元格內(nèi)。

函數(shù)簽名:

void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override;

功能:

editor:要調(diào)整的編輯器控件。option:提供單元格的樣式信息(包括大小、位置等)。index:表示單元格的模型索引。

示例:

void MyDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const {

editor->setGeometry(option.rect); // 將編輯器放置到單元格內(nèi)

}

4. 自定義代理的完整示例

下面是一個(gè)完整的自定義代理的示例,它實(shí)現(xiàn)了在表格中使用下拉框作為編輯器,并自定義單元格的繪制。

class MyDelegate : public QStyledItemDelegate {

public:

MyDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}

// 自定義單元格繪制

void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override {

QString text = index.model()->data(index, Qt::DisplayRole).toString();

painter->fillRect(option.rect, option.state & QStyle::State_Selected ? Qt::yellow : Qt::white);

painter->drawText(option.rect, Qt::AlignCenter, text);

}

// 創(chuàng)建自定義編輯器

QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override {

QComboBox *editor = new QComboBox(parent);

editor->addItems({"Apple", "Banana", "Cherry"});

return editor;

}

// 初始化編輯器數(shù)據(jù)

void setEditorData(QWidget *editor, const QModelIndex &index) const override {

QString value = index.model()->data(index, Qt::EditRole).toString();

QComboBox *comboBox = static_cast(editor);

comboBox->setCurrentText(value);

}

// 提交編輯器數(shù)據(jù)到模型

void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override {

QComboBox *comboBox = static_cast(editor);

QString value = comboBox->currentText();

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

}

// 調(diào)整編輯器位置

void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override {

editor->setGeometry(option.rect);

}

};

5. 總結(jié)

自定義代理通過(guò)重寫 QStyledItemDelegate 的方法,可以靈活地控制單元格的顯示和編輯行為。通過(guò) paint() 方法定制單元格的繪制,通過(guò) createEditor() 和其他相關(guān)方法控制單元格編輯器的行為,從而實(shí)現(xiàn)個(gè)性化的用戶體驗(yàn)。

代理提供了一種強(qiáng)大的方式來(lái)定制 Qt 的模型視圖框架,使其適應(yīng)特定的需求和外觀要求。

柚子快報(bào)邀請(qǐng)碼778899分享:qt自定義代理的功能

http://yzkb.51969.com/

參考鏈接

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19577482.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問(wèn)

文章目錄