Tôi đã làm theo hướng dẫn Phân phối hộp quay, mà Qt cung cấp, để cố gắng triển khai QItemDelegate của riêng tôi. Nó sẽ được sử dụng để chỉ định một QComboBox để biểu diễn dữ liệu trong một tế bào QTableView nhưng nó không hoạt động.Qt Sử dụng QItemDelegate tùy chỉnh cho QTableView
Vấn đề lớn nhất của tôi là tôi không biết khi nào QItemDelegate của tôi sẽ được sử dụng.
khi itemModel-> setData được sử dụng hoặc khi itemModel-> setItem. Tôi sẽ nghi ngờ setItem vì tôi reimplemented một QItemDelegate (nhấn mạnh vào "Item") nhưng hướng dẫn sử dụng setData và nó hoạt động tốt.
Tôi biết rằng nếu QItemDelegate được chỉ định không hoạt động, nó sử dụng giá trị mặc định nhưng làm cách nào để bây giờ mà tôi đã chỉ định không hoạt động?
khi nào tôi nên nghi ngờ QTableView sử dụng đại biểu của mình. Tôi muốn chỉ định đại biểu nào sẽ sử dụng cho từng ô. Điều này có khả thi hay không QTableView chỉ sử dụng một đại biểu trong suốt?
Làm cách nào để chỉ định các mục để điền QComboBox khi nó được hiển thị bởi QTableView?
tôi thực hiện QItemDelegate đây:
- phần mà tôi cố gắng thêm các tế bào đó là giả sử dụng QComboBox là theo nhận xét "Enabled" trong mainwindow.cpp tiếp tục xuống bài này.
qcomboboxitemdelegate.h
#ifndef QCOMBOBOXITEMDELEGATE_H
#define QCOMBOBOXITEMDELEGATE_H
#include <QItemDelegate>
#include <QComboBox>
class QComboBoxItemDelegate : public QItemDelegate
{
Q_OBJECT
public:
explicit QComboBoxItemDelegate(QObject *parent = 0);
QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index);
void setEditorData(QWidget *editor, const QModelIndex &index);
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index);
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index);
signals:
private:
};
#endif // QCOMBOBOXITEMDELEGATE_H
qcomboboxitemdelegate.cpp
#include "qcomboboxitemdelegate.h"
#include <QDebug>
QComboBoxItemDelegate::QComboBoxItemDelegate(QObject *parent)
: QItemDelegate(parent)
{
}
QWidget* QComboBoxItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) {
// create widget for use
QComboBox* comboBox = new QComboBox(parent);
return comboBox;
}
void QComboBoxItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) {
// update model widget
QString value = index.model()->data(index, Qt::EditRole).toString();
qDebug() << "Value:" << value;
QComboBox* comboBox = static_cast<QComboBox*>(editor);
comboBox->setCurrentIndex(comboBox->findText(value));
}
void QComboBoxItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) {
// store edited model data to model
QComboBox* comboBox = static_cast<QComboBox*>(editor);
QString value = comboBox->currentText();
model->setData(index, value, Qt::EditRole);
}
void QComboBoxItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) {
editor->setGeometry(option.rect);
}
mainwindow.cpp: đây là nơi tôi khởi tạo QStandardItemModel
void MainWindow::init() {
itemModel = new QStandardItemModel(this);
}
void MainWindow::setupUi() {
this->setWindowTitle("QAlarmClock");
QStringList labelList;
labelList << "Alarm Name" << "Time" << "Enabled";
itemModel->setHorizontalHeaderLabels(labelList);
ui->tableView->setModel(itemModel);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tableView->setItemDelegate(comboBoxItemDelegate);
}
void MainWindow::on_actionNew_triggered() {
alarmDialog = new AlarmDialog(this);
connect(alarmDialog, SIGNAL(on_close()), this, SLOT(on_alarmDialog_close()));
alarmDialog->exec();
}
mainwindow.cpp: đây là nơi tôi cập nhật QStandardItemModel
void MainWindow::on_alarmDialog_close() {
QString alarmName = alarmDialog->getAlarmName();
QDateTime alarmDateTime = alarmDialog->getDateTime();
itemModel->insertRow(itemModel->rowCount());
int rowCount = itemModel->rowCount();
// Alarm Name
QStandardItem* alarmItem = new QStandardItem(QIcon("res/alarmclock.ico"), alarmName);
itemModel->setItem(rowCount - 1 , 0, alarmItem);
// Date Time
QStandardItem* dateTimeItem = new QStandardItem();
dateTimeItem->setText(alarmDateTime.toString());
dateTimeItem->setEditable(false);
itemModel->setItem(rowCount - 1, 1, dateTimeItem);
// Enabled
QStandardItem* enabledItem = new QStandardItem();
QList<QStandardItem*> optionList;
optionList << new QStandardItem("Enabled") << new QStandardItem("Disabled");
enabledItem->appendRows(optionList);
itemModel->setItem(rowCount - 1, 2, enabledItem);
}
Sửa 1
qcomboboxdelegate.cpp
QWidget* QComboBoxItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) {
// create widget for use
qDebug() << "Column: " << index.column();
if (index.column() == 2) {
QComboBox* comboBox = new QComboBox(parent);
QStringList values;
values << "Enabled" << "Disabled";
comboBox->addItems(values);
return comboBox;
} else {
return QItemDelegate::createEditor(parent, option, index);
}
}
mainwindow.cpp
void MainWindow::on_alarmDialog_close() {
QList<QStandardItem*> row;
QString alarmName = alarmDialog->getAlarmName();
QDateTime alarmDateTime = alarmDialog->getDateTime();
QString status = "Enabled";
// Alarm Name
QStandardItem* alarmItem = new QStandardItem(QIcon("res/alarmclock.ico"), alarmName);
row << alarmItem;
// Date Time
QStandardItem* dateTimeItem = new QStandardItem();
dateTimeItem->setText(alarmDateTime.toString());
dateTimeItem->setEditable(false);
row << dateTimeItem;
// Enabled
QStandardItem* statusItem = new QStandardItem(status);
row << statusItem;
itemModel->appendRow(row);
}
Khi nào tôi giả sử gọi ui-> tableView-> setItemDelegate (new ComboBoxDelegate) ;? Tôi gọi nó trong SetupUI của tôi() được gọi trước khi tôi thêm bất cứ thứ gì vào tableView và sau khi thực hiện các thay đổi, nó vẫn không hoạt động. Tôi cũng đã thử nghiệm gọi nó sau appendRow() nhưng nó vẫn không hoạt động. Tôi đã đặt một số câu lệnh debug trong QComboxItemDelegate để xem nó đã đi bao xa nhưng createEditor() không được gọi là – arnm
Cảm ơn sự trợ giúp! Tôi đã tìm ra vấn đề của tôi nhờ bạn – arnm