QWidget *ComboDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &, const QModelIndex &) const{ QWidget *editor; switch(typeeditor) { case TBool: { QComboBox *cmbox = new QComboBox(parent); cmbox->addItem("true"); cmbox->addItem("false"); cmbox->setFocusPolicy(Qt::StrongFocus);return static_cast<QWidget *>(cmbox);} } return editor;}void ComboDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const{ QVariant data = index.model()->data(index, Qt::DisplayRole); switch(typeeditor) { case TBool: { QComboBox *cmbox = static_cast<QComboBox *>(editor); if (data.toString()=="true") { cmbox->setCurrentIndex(cmbox->findText("true")); } else { cmbox->setCurrentIndex(cmbox->findText("false")); } break; } }}void ComboDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const{ QVariant data; int ty; QComboBox *cmbox = static_cast<QComboBox *>(editor); data = cmbox->currentText(); int row = index.row(); int col = index.column(); col +=1; ty = cmbox->currentIndex(); connect(cmbox,SIGNAL(currentIndexChanged(int)),SLOT(ComboDelegate::commitAndCloseEditor()));//ОТсюда сигнала нету , хотя по идеи должен быть if (cmbox->currentText()=="true") { // QModelIndex ind = model->index(row,col); QMessageBox::information(0,"","emit"); } else cmbox->setCurrentIndex(cmbox->findText("false")); connect(editor,SIGNAL(closeEditor(QWidget*)),SLOT(ComboDelegate::commitAndCloseEditor()));//тут тоже жду сигнал, нету model->setData(index, data, Qt::EditRole); }void ComboDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const{ editor->setGeometry(option.rect);}void ComboDelegate::ch_index(QWidget *editor){ emit closeEditor(editor,QAbstractItemDelegate::EditNextItem); QMessageBox::critical(0,"Error","0"); }void ComboDelegate::commitAndCloseEditor( ){ QMessageBox::information(0,"","CommitData"); QComboBox *editor = qobject_cast<QComboBox *>(sender()); //QAbstractItemDelegate::closeEditor(editor,QAbstractItemDelegate::EditNextItem); emit closeEditor(editor);}
//объявляем в хейдереQStandardItemModel *m_model;//в функции заполнения таблицы:ComboDelegate *deleg = new ComboDelegate(this);m_model = new QStandardItemModel(3, 4, this);ui->tableView->setModel(m_model);ui->tableView->setItemDelegate(deleg);//тут заполняем таблицу//...//сигнал на изменение какой то ячейки в таблицеconnect(m_model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(slot_itemСhanged(QStandardItem*)));//далее сам слотvoid MainWindow::slot_itemСhanged(QStandardItem *item){ QString boolState; //ищем нужный столбец if (item->column() == 2) boolState = ui->tableView->model()->data( ui->tableView->model()->index(item->row(), 2, QModelIndex()), Qt::EditRole).toString();}