Russian Qt Forum
Июля 06, 2025, 13:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QItemDelegate и связь между делегатми...  (Прочитано 6248 раз)
Max Payne
Гость
« : Мая 28, 2010, 11:39 »

У меня есть QTableView в который делегирована QLineEdit везде кроме двух столбцов, в эти два столбца делегирован QComboBox...
Чтоб нельзя было редактировать ячейки кроме комбобокса, я сделал QLineEdit->setReadOnly...
Теперь мне нада при изменении текущего индекса ComboBox вызвать QFileDialog и полученую строчку QSring List нада вставиьт в следущую ячейку... Я смогу єто сделать если стоит QLineEdit->setReadOnly и подскажите как обратится можно к єтой ячейке...
Записан
Max Payne
Гость
« Ответ #1 : Мая 28, 2010, 12:19 »

Я могу переопределить едитор для линии и там вызвать диалог... но как при изменение индекса текущего комбо бокса послать сигнал для редактирование следущей ячейки?
Записан
spectre71
Гость
« Ответ #2 : Мая 28, 2010, 13:17 »

У меня есть QTableView в который делегирована QLineEdit везде кроме двух столбцов, в эти два столбца делегирован QComboBox...
Чтоб нельзя было редактировать ячейки кроме комбобокса, я сделал QLineEdit->setReadOnly...
Теперь мне нада при изменении текущего индекса ComboBox вызвать QFileDialog и полученую строчку QSring List нада вставиьт в следущую ячейку... Я смогу єто сделать если стоит QLineEdit->setReadOnly и подскажите как обратится можно к єтой ячейке...

Что попало.
Советую почитать раздел документации "Model/View Programming"
Записан
Max Payne
Гость
« Ответ #3 : Мая 29, 2010, 00:52 »

Читал, не помогло... Не могу понять как обратится к делегату в ячейке таблицы... Обясните пож. как обращаться если мне нада например отследить changeCurrentIndex, в ComboBox`е который делегирован в таблице..QTableView
Записан
crossly
Гость
« Ответ #4 : Мая 31, 2010, 13:54 »

это надо делать в делегате...
Записан
Max Payne
Гость
« Ответ #5 : Июня 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);
}
Задача сделать при изменении индекса комбо бокса на тру, перейти к редактированию следующей ячеки...
Проблема не могу словить сигнал с функций класа делегата, еще и сложность в том что методы константные...
Подскажите или тыкните носов в внятный пример...

Записан
diggaz
Гость
« Ответ #6 : Июня 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();

}
Записан
asvil
Гость
« Ответ #7 : Июня 05, 2010, 10:43 »

Возможно  connect(cmbox,SIGNAL(currentIndexChanged(int)),SLOT(ComboDelegate::commitAndCloseEditor())); сделать в createEditor...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.033 секунд. Запросов: 20.