Qt 採用 Model/View 設計而非傳統 MVC,View 僅負責資料呈現與基本輸入處理,複雜的互動邏輯交由 Delegate(委托) 處理。委托提供渲染與編輯能力,如表格中雙擊儲存格直接編輯。
QAbstractItemDelegate:標準介面,需完整實作所有虛擬函式QItemDelegate:提供預設實作,簡化開發(Qt 4 通用)QStyledItemDelegate:推薦基類,使用當前 Style 繪製元件,支援 Qt Style Sheets(Qt 4.4+ 預設)自定義委托通常繼承 QStyledItemDelegate,重寫所需虛擬函式。
重寫 paint() 與 sizeHint():
paint(QPainter*, QStyleOptionViewItem, QModelIndex):每個項目獨立呼叫,依資料類型條件繪製,其他交給父類sizeHint():定義項目顯示大小實作四大核心函式建立編輯器工廠:
createEditor():建立並回傳編輯用 Widget(如 QTimeEdit)setEditorData():將 Model 資料載入編輯器updateEditorGeometry():確保編輯器位置大小正確setModelData():將編輯器資料寫回 Model搭配 commitData() 與 closeEditor() 訊號完成編輯提交與關閉。
資料模型 Track:title (QString) + duration (int,秒數)
委托類別 TrackDelegate 繼承 QStyledItemDelegate:
durationColumn 指定時長欄位索引paint():時長欄將秒數格式化為 "mm:ss" 右對齊繪製,其他欄交給父類createEditor():時長欄建立 QTimeEdit(格式 "mm:ss"),連接 editingFinished() 到 commitAndCloseEditor() slotsetEditorData():將秒數轉 QTime 設給 QTimeEditsetModelData():從 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() 時,未處理的索引必須呼叫父類實作