首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Qt 學習之路 (48):自定義委托實現自訂繪製與編輯

     編輯:關於C語言

委托在 Model/View 架構中的角色

Qt 採用 Model/View 設計而非傳統 MVC,View 僅負責資料呈現與基本輸入處理,複雜的互動邏輯交由 Delegate(委托) 處理。委托提供渲染與編輯能力,如表格中雙擊儲存格直接編輯。

核心類別繼承體系

  • QAbstractItemDelegate:標準介面,需完整實作所有虛擬函式
  • QItemDelegate:提供預設實作,簡化開發(Qt 4 通用)
  • QStyledItemDelegate:推薦基類,使用當前 Style 繪製元件,支援 Qt Style Sheets(Qt 4.4+ 預設)

自定義委托通常繼承 QStyledItemDelegate,重寫所需虛擬函式。

自定義委托的兩大功能面

1. 自訂繪製

重寫 paint() 與 sizeHint():

  • paint(QPainter*, QStyleOptionViewItem, QModelIndex):每個項目獨立呼叫,依資料類型條件繪製,其他交給父類
  • sizeHint():定義項目顯示大小

2. 自訂編輯器

實作四大核心函式建立編輯器工廠:

  1. createEditor():建立並回傳編輯用 Widget(如 QTimeEdit)
  2. setEditorData():將 Model 資料載入編輯器
  3. updateEditorGeometry():確保編輯器位置大小正確
  4. setModelData():將編輯器資料寫回 Model

搭配 commitData() 與 closeEditor() 訊號完成編輯提交與關閉。

完整範例:歌曲清單與時長編輯

資料模型 Track:title (QString) + duration (int,秒數)

委托類別 TrackDelegate 繼承 QStyledItemDelegate:

  • 建構式接收 durationColumn 指定時長欄位索引
  • paint():時長欄將秒數格式化為 "mm:ss" 右對齊繪製,其他欄交給父類
  • createEditor():時長欄建立 QTimeEdit(格式 "mm:ss"),連接 editingFinished() 到 commitAndCloseEditor() slot
  • setEditorData():將秒數轉 QTime 設給 QTimeEdit
  • setModelData():從 QTimeEdit 取時間轉回秒數存入 Model

使用方式:

QTableWidget *table = new QTableWidget(count, 2);
table->setItemDelegate(new TrackDelegate(1)); // 第 1 欄(索引 1)套用委托
// 填入資料...
table->setItem(row, 1, new QTableWidgetItem(QString::number(track.duration)));

執行後,時長欄顯示 "03:20" 格式,雙擊彈出時間選擇器編輯,體驗流暢。

關鍵提醒

  • 委托僅負責呈現與編輯,不處理商業邏輯
  • 重寫 paint() 時,未處理的索引必須呼叫父類實作
  • 需啟用 Qt Style Sheets 時,務必繼承 QStyledItemDelegate
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved