Название: QItemDelegate и связь между делегатми...
Отправлено: Max Payne от Мая 28, 2010, 11:39
У меня есть QTableView в который делегирована QLineEdit везде кроме двух столбцов, в эти два столбца делегирован QComboBox... Чтоб нельзя было редактировать ячейки кроме комбобокса, я сделал QLineEdit->setReadOnly... Теперь мне нада при изменении текущего индекса ComboBox вызвать QFileDialog и полученую строчку QSring List нада вставиьт в следущую ячейку... Я смогу єто сделать если стоит QLineEdit->setReadOnly и подскажите как обратится можно к єтой ячейке...
Название: Re: QItemDelegate и связь между делегатми...
Отправлено: Max Payne от Мая 28, 2010, 12:19
Я могу переопределить едитор для линии и там вызвать диалог... но как при изменение индекса текущего комбо бокса послать сигнал для редактирование следущей ячейки?
Название: Re: QItemDelegate и связь между делегатми...
Отправлено: spectre71 от Мая 28, 2010, 13:17
У меня есть QTableView в который делегирована QLineEdit везде кроме двух столбцов, в эти два столбца делегирован QComboBox... Чтоб нельзя было редактировать ячейки кроме комбобокса, я сделал QLineEdit->setReadOnly... Теперь мне нада при изменении текущего индекса ComboBox вызвать QFileDialog и полученую строчку QSring List нада вставиьт в следущую ячейку... Я смогу єто сделать если стоит QLineEdit->setReadOnly и подскажите как обратится можно к єтой ячейке...
Что попало. Советую почитать раздел документации "Model/View Programming"
Название: Re: QItemDelegate и связь между делегатми...
Отправлено: Max Payne от Мая 29, 2010, 00:52
Читал, не помогло... Не могу понять как обратится к делегату в ячейке таблицы... Обясните пож. как обращаться если мне нада например отследить changeCurrentIndex, в ComboBox`е который делегирован в таблице..QTableView
Название: Re: QItemDelegate и связь между делегатми...
Отправлено: crossly от Мая 31, 2010, 13:54
это надо делать в делегате...
Название: Re: QItemDelegate и связь между делегатми...
Отправлено: Max Payne от Июня 01, 2010, 18:35
я пробовал не могу сигнал словить ... 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); }
Задача сделать при изменении индекса комбо бокса на тру, перейти к редактированию следующей ячеки... Проблема не могу словить сигнал с функций класа делегата, еще и сложность в том что методы константные... Подскажите или тыкните носов в внятный пример...
Название: Re: QItemDelegate и связь между делегатми...
Отправлено: diggaz от Июня 04, 2010, 22:52
//объявляем в хейдере 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();
}
Название: Re: QItemDelegate и связь между делегатми...
Отправлено: asvil от Июня 05, 2010, 10:43
Возможно connect(cmbox,SIGNAL(currentIndexChanged(int)),SLOT(ComboDelegate::commitAndCloseEditor())); сделать в createEditor...
|