Предполагается, что вы знакомы с системой моделей / представлений Qt и знаете, что вам следует использовать Просмотр для визуализации вашей модели данных. Тогда вы собираетесь реализовать больше - делегат, который может предложить дополнительный интерфейс, кроме ввода текста для каждого поля.
Согласно этому учебнику , вы должны сделать следующее:
Создание подкласса QStyledItemDelegate, создание собственного класса делегата, например, MyDelegate
class MyDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
enum FIELDS
{
COL_FIELD1,
};
explicit MyDelegate(QObject *parent = nullptr);
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const Q_DECL_OVERRIDE;
void setEditorData(QWidget *editor, const QModelIndex &index) const Q_DECL_OVERRIDE;
void setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const Q_DECL_OVERRIDE;
void updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE;
};
Реализация этих функций
- createEditor , укажите, какой виджет предлагает пользователю выполнить задачу редактирования
- setEditorData , преобразование данных из DataModel в виджет
- setModelData , преобразование данных из виджета в DataModel
- updateEditorGeometry , определить виджет, глядя в поле.
В следующих кодах я попытался выяснить, нужно ли вам предлагать варианты поля 1.
#include "mydelegate.h"
MyDelegate::MyDelegate(QObject *parent) : QStyledItemDelegate(parent)
{
}
QWidget* MyDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QComboBox* __comboBox = new QComboBox(parent);
if(index.column()==COL_FIELD1)
{
__comboBox->addItem("none");
__comboBox->addItem("option");
__comboBox->addItem("number");
}
else
{
//! according to your need...
}
return __comboBox;
}
void MyDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QComboBox* __comboBox = qobject_cast<QComboBox*>(editor);
if(index.column()==COL_FIELD1)
{
__comboBox->setCurrentText(index.model()->data(index).toString());
}
}
void MyDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QComboBox* __comboBox = qobject_cast<QComboBox*>(editor);
model->setData(index,QVariant::fromValue(__comboBox->currentText()));
}
void MyDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
editor->setGeometry(option.rect);
}
MyDelegate, прикрепленный к вашему представлению
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//! prepare a demo model
QStringListModel *model = new QStringListModel();
QStringList list;
list << "a" << "b" << "c";
model->setStringList(list);
//! attach a MyDelegate for Row1
ui->tableView->setModel(model);
ui->tableView->setItemDelegateForRow(0,new MyDelegate(this));
}
MainWindow::~MainWindow()
{
delete ui;
}
Демонстрация эффекта будет такой:
Только что попробовал изменить содержание реализации MyDelegate, чтобы получить нужные вам эффекты (например, spinBox или другие опции для Field2), получайте удовольствие!